On Fri Jun 21, 2024 at 10:46 AM CDT, Dave Page wrote:
On Fri, 21 Jun 2024 at 16:15, Robert Haas <robertmh...@gmail.com> wrote:
> As a practical matter, I don't think MSVC is coming back. The
> buildfarm was already changed over to use meson, and it would be
> pretty disruptive to try to re-add buildfarm coverage for a
> resurrected MSVC on the eve of beta2. I think we should focus on
> improving whatever isn't quite right in meson -- plenty of other
> people have also complained about various things there, me included --
> rather than trying to undo over a year's worth of work by lots of
> people to get things on Windows switched over to MSVC.
>

The buildfarm hasn't switched over - it had support added for Meson. If it
had been switched, then the older back branches would have gone red.

Anyway, that's immaterial - I know the old code isn't coming back now. My
motivation for this thread is to get Meson to a usable state on Windows,
that doesn't require hacking stuff around for the casual builder moving
forwards - and at present, it requires *significantly* more hacking around
than it has in many years.

The design goals Andres spoke about would clearly be a technical
improvement to PostgreSQL, however as we're finding, they rely on the
upstream dependencies being built with pkgconfig or cmake files which
either doesn't happen at present, or only happens if you happen to build in
a certain way, or download from some source that has added them. I'm not
sure how to fix that without re-introducing the old hacks in the build
system, or extending my side project to add .pc files to all the
dependencies it builds. I will almost certainly do that, as it'll give
folks a single place where they can download everything they need, and
provide a reference on how everything can be built if they want to do it
themselves, but on the other hand, it's far from an ideal solution and I'd
much prefer if I didn't need to do that at all.

Hey Dave,

I'm a maintainer for Meson, and am happy to help you in any way that I reasonably can.

Let's start with the state of Windows support in Meson. If I were to rank Meson support for platforms, I would do something like this:

- Linux
- BSDs
- Solaris/IllumOS
- ...
- Apple
- Windows

As you can see Windows is the bottom of the totem pole. We don't have Windows people coming along to contribute very often for whatever reason. Thus admittedly, Windows support can be very lackluster at times.

Meson is not a project which sees a lot of funding. (Do any build tools?) The projects that support Meson in any way are Mesa and GStreamer, which don't have a lot of incentive to do anything with Windows, generally.

I'm not even sure any of the regular contributors to Meson have Windows development machines. I surely don't have access to a Windows machine.

All that being said, I would like to help you solve your Windows dependencies issue, or at least mitigate them. I think it is probably best to just look at one dependency at a time. Here is how lz4 is picked up in the Postgres Meson build:

lz4opt = get_option('lz4')
if not lz4opt.disabled()
  lz4 = dependency('liblz4', required: lz4opt)

  if lz4.found()
    cdata.set('USE_LZ4', 1)
    cdata.set('HAVE_LIBLZ4', 1)
  endif

else
  lz4 = not_found_dep
endif

As you are well aware, dependency() looks largely at pkgconfig and cmake to find the dependencies. In your case, that is obviously not working. I think there are two ways to solve your problem. A first solution would look like this:

lz4opt = get_option('lz4')
if not lz4opt.disabled()
  lz4 = dependency('liblz4', required: false)
  if not lz4.found()
    lz4 = cc.find_library('lz4', required: lz4opt, dirs: extra_lib_dirs)
  endif

  if lz4.found()
    cdata.set('USE_LZ4', 1)
    cdata.set('HAVE_LIBLZ4', 1)
  end
else
  lz4 = not_found_dep
endif

Another solution that could work alongside the previous suggestion is to use Meson subprojects[0] for managing Postgres dependencies. I don't know if we would want this in the Postgres repo or a patch that downstream packagers would need to apply, but essentially, add the wrap file:

[wrap-file]
directory = lz4-1.9.4
source_url = https://github.com/lz4/lz4/archive/v1.9.4.tar.gz
source_filename = lz4-1.9.4.tgz
source_hash = 0b0e3aa07c8c063ddf40b082bdf7e37a1562bda40a0ff5272957f3e987e0e54b
patch_filename = lz4_1.9.4-2_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/lz4_1.9.4-2/get_patch
patch_hash = 4f33456cce986167d23faf5d28a128e773746c10789950475d2155a7914630fb
wrapdb_version = 1.9.4-2

[provide]
liblz4 = liblz4_dep

into subprojects/lz4.wrap, and Meson should be able to automagically pick up the dependency. Do this for all the projects that Postgres depends on, and you'll have an entire build managed by Meson. Note that Meson subprojects don't have to use Meson themselves. They can also use CMake[1] or Autotools[2], but your results may vary.

Happy to hear your thoughts. I think if our goal is to enable more people to work on Postgres, we should probably add subproject wraps to the source tree, but we also need to be forgiving like in the Meson DSL snippet above.

Let me know your thoughts!

[0]: https://mesonbuild.com/Wrap-dependency-system-manual.html
[1]: 
https://github.com/hse-project/hse/blob/6d5207f88044a3bd9b3539260074395317e276d5/meson.build#L239-L275
[2]: 
https://github.com/hse-project/hse/blob/6d5207f88044a3bd9b3539260074395317e276d5/subprojects/packagefiles/libbsd/meson.build

--
Tristan Partin
https://tristan.partin.io


Reply via email to