Re: zlib detection in Meson on Windows broken? - Mailing list pgsql-hackers

From Dave Page
Subject Re: zlib detection in Meson on Windows broken?
Date
Msg-id CA+OCxowgR8D7a3EwwSuurHDVv+2zpW5x7xwXJDaAPNeN1gHrzA@mail.gmail.com
Whole thread Raw
In response to Re: zlib detection in Meson on Windows broken?  (Sandeep Thakkar <sandeep.thakkar@enterprisedb.com>)
List pgsql-hackers
Hi

On Tue, 21 May 2024 at 15:12, Sandeep Thakkar <sandeep.thakkar@enterprisedb.com> wrote:
Hi Dave,


On Tue, May 21, 2024 at 3:12 PM Dave Page <dpage@pgadmin.org> wrote:
Hi Sandeep, Nazir,

On Tue, 21 May 2024 at 10:14, Nazir Bilal Yavuz <byavuz81@gmail.com> wrote:
Hi,

On Tue, 21 May 2024 at 10:20, Sandeep Thakkar
<sandeep.thakkar@enterprisedb.com> wrote:
>
> Hi Dave,
>
> Is the .pc file generated after the successful build of zlib? If yes, then meson should be able to detect the installation ideally

If meson is not able to find the .pc file automatically, using 'meson
setup ... --pkg-config-path $ZLIB_PC_PATH' might help.

The problem is that on Windows there are no standard locations for a Unix-style development library installation such as this, so the chances are that the .pc file will point to entirely the wrong location.

For example, please see https://github.com/dpage/winpgbuild/actions/runs/9172187335 which is a Github action that builds a completely vanilla zlib using VC++. If you look at the uploaded artefact containing the build output and example the .pc file, you'll see it references /zlib as the location, which is simply where I built it in that action. On a developer's machine that's almost certainly not going to be where it actually ends up. For example, on the pgAdmin build farm, the dependencies all end up in C:\build64\[whatever]. On the similar Github action I'm building for PostgreSQL, that artefact will be unpacked into /build/zlib.


The above link returned 404. But I found a successful build at https://github.com/dpage/winpgbuild/actions/runs/9175426807. I downloaded the artifact but didn't find .pc file as I wanted to look into the content of that file.

Yeah, sorry - that was an old one.

Following some offline discussion with Andrew I realised I was building zlib incorrectly - using cmake/msbuild instead of nmake and some manual copying. Whilst the former does create a working library and a sane looking installation, it's not the recommended method, which is documented in a very non-obvious way - far less obvious than "oh look, there's a cmake config - let's use that".

The new build is done using the recommended method, which works with PG16 and below out of the box with no need to rename any files.
 

I had a word with Murali who mentioned he encountered a similar issue while building PG17 on windows. He worked-around is by using a template .pc file that includes these lines:
--
prefix=${pcfiledir}/../..
exec_prefix=${prefix}
libdir=${prefix}/lib
sharedlibdir=${prefix}/lib
includedir=${prefix}/include
--

The issue here is that there is no .pc file created with the correct way of building zlib, and even if there were (or I created a dummy one), pkg-config isn't really a thing on Windows.

I'd also note that from what Andrew has shown me of the zlib installation on the buildfarm member drongo, there is no .pc file there either, and yet seems to work fine (and my zlib installation now has the exact same set of files as his does).
 

But in general I agree with you on the issue of Meson's dependency on pkgconfig files to detect the third party libraries. 

Of course, for my own builds I can easily make everything use consistent directories, however most people who are likely to want to build PostgreSQL may not want to also build all the dependencies themselves as well, as some are a lot more difficult than zlib. So what tends to happen is people find third party builds or upstream official builds. 

I would therefore argue that if the .pc file that's found doesn't provide correct paths for us, then Meson should fall back to searching in the paths specified on its command line for the appropriate libraries/headers (which is what it does for OpenSSL for example, as that doesn't include a .pc file). This is also what happens with PG16 and earlier.

One other thing I will note is that PG16 and earlier try to use the wrong filename for the import library. For years, it's been a requirement to do something like this: "copy \zlib\lib\zlib.lib \zlib\lib\zdll.lib" to make a build succeed against a "vanilla" zlib build. I haven't got as far as figuring out if the same is true with Meson yet.

--


--
Sandeep Thakkar




--

pgsql-hackers by date:

Previous
From: Sandeep Thakkar
Date:
Subject: Re: zlib detection in Meson on Windows broken?
Next
From: Robert Haas
Date:
Subject: Re: Possible Bug in relation_open