meson icon indicating copy to clipboard operation
meson copied to clipboard

test cases/rust/13 external c dependencies fails on Solaris due to lack of static zlib

Open alanc opened this issue 2 years ago • 5 comments

Describe the bug When running the tests on Solaris 11.4, the runs of test cases/rust/13 external c dependencies with -Dstatic=true incorrectly report that libz.a is found, and then fail when ninja calls gcc for the linking step because Solaris only packages libz.so, and not libz.a.

To Reproduce (in a checked out copy of this repo on Solaris 11.4)

cd test\ cases/rust/13\ external\ c\ dependencies/
env PKG_CONFIG_PATH=/usr/lib/64/pkgconfig python3 ../../../meson.py setup --wipe builddir -Dmethod=system -Dstatic=true
cd builddir/
ninja

or with -Dmethod set to pkg-config instead of system

When using -Dmethod=pkg-config it even correctly output a warning that this wouldn't work, but continued to try anyway:

WARNING: Static library 'z' not found for dependency 'zlib', may not be statically linked

Expected behavior I expected the if not dep_zlib.found() clause in meson.build to trigger the 'MESON_SKIP_TEST: Could not find a @0@ zlib'.format(get_option('static') ? 'static' : 'shared') message and exit.

system parameters

  • native build
  • Oracle Solaris 11.4
  • Python 3.7.13
  • meson 0.63.3
  • 1.11.0

alanc avatar Oct 07 '22 22:10 alanc

@alanc seems like the best course of action is to skip the test on Solaris. Care to submit a PR? grep for MESON_SKIP_TEST I believe for other usages

tristan957 avatar Oct 19 '22 21:10 tristan957

We could do that, though the test passes for much of the matrix - in our Solaris package, we've only disabled the static linking portion of the test matrix, though in a way that isn't suitable for upstream: https://github.com/mesonbuild/meson/blob/master/mesonbuild/linkers/linkers.py#L210

But it seems that's just ignoring an actual bug in meson in which dependency('zlib', static : true, ...) is claiming the static library is available when it's not, but I don't know where in meson to fix that.

alanc avatar Nov 14 '22 20:11 alanc

@alanc you should be able to look at the $builddir/meson-log/meson-log.txt and see more detailed debug information on why meson thinks it can find a static zlib. But this seems to be a common problem

dcbaker avatar Nov 14 '22 20:11 dcbaker

Okay, so I ran ../../../meson.py setup builddir -Dstatic=true -Dmethod=system in test cases/rust/13 external c dependencies and it ran okay and didn't trigger the if not dep_zlib.found() check in meson.build, but running ninja to complete the build failed with:

1/1] Compiling Rust source ../prog.rs
FAILED: prog 
rustc -C linker=gcc --color=always --crate-type bin -g --crate-name prog --emit dep-info=prog.d --emit link -o prog -l static=c_accessing_zlib -l static=z -L . ../prog.rs
error: linking with `gcc` failed: exit status: 1
  |
  = note: "gcc" "-m64" "prog.prog.6eac67e5-cgu.0.rcgu.o" "prog.prog.6eac67e5-cgu.1.rcgu.o" "prog.prog.6eac67e5-cgu.2.rcgu.o" "prog.prog.6eac67e5-cgu.3.rcgu.o" "prog.prog.6eac67e5-cgu.4.rcgu.o" "prog.prog.6eac67e5-cgu.5.rcgu.o" "prog.prog.6eac67e5-cgu.6.rcgu.o" "prog.4uosbuk8q2vxpxvl.rcgu.o" "-Wl,-z,ignore" "-L" "." "-L" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib" "-Wl,-Bstatic" "-lc_accessing_zlib" "-lz" "-Wl,--start-group" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libstd-448b0ec7735498fd.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libpanic_unwind-cf7840f652e1e74b.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libobject-a415004c6305c80a.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libmemchr-852e1db29e8b47d7.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libaddr2line-d2df1dc6066e7e6b.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libgimli-58f21fcc219ab3ed.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/librustc_demangle-1ec9b4a3a790749c.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libstd_detect-50aac8de7c8e2b18.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libhashbrown-f2b26a599e83e61d.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libminiz_oxide-e8f9f2e4ded3d663.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libadler-ca5a986d2200bea1.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/librustc_std_workspace_alloc-24acd48a0c30e202.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libunwind-4526533112008efc.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libcfg_if-33198cecd6457e3e.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/liblibc-6a900d3212994ec6.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/liballoc-2708c1d1ddec5df8.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/librustc_std_workspace_core-2627cd144f4b48b5.rlib" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libcore-bea228e8c308139a.rlib" "-Wl,--end-group" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib/libcompiler_builtins-9d6a34782d7fc5aa.rlib" "-Wl,-Bdynamic" "-lsocket" "-lposix4" "-lpthread" "-lresolv" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-L" "/usr/lib/amd64/rustlib/x86_64-pc-solaris/lib" "-o" "prog" "-nodefaultlibs"
  = note: ld: fatal: library -lz: not found
          collect2: error: ld returned 1 exit status
          

error: aborting due to previous error

ninja: build stopped: subcommand failed.

The test results in meson-logs/meson-log.txt aren't clearly labeled, but I think the test in question reported:

Rust compiler for the build machine: rustc -C linker=gcc (rustc 1.61.0-dev)
Rust linker for the build machine: rustc -C linker=gcc ld.solaris 5.11-1.3274
Build machine cpu family: x86_64
Build machine cpu: x86_64
Host machine cpu family: x86_64
Host machine cpu: x86_64
Target machine cpu family: x86_64
Target machine cpu: x86_64
Running compile:
Working directory:  /export/alanc/git/github/meson/test cases/rust/13 external c
 dependencies/builddir/meson-private/tmpy8jn7h0l
Command line:  gcc /export/alanc/git/github/meson/test cases/rust/13 external c dependencies/builddir/meson-private/tmpy8jn7h0l/testfile.c -o /export/alanc/git/github/meson/test cases/rust/13 external c dependencies/builddir/meson-private/tmpy8jn7h0l/output.exe -D_FILE_OFFSET_BITS=64 -O0 -Wl,--start-group -lz -Wl,--end-group -z nodefs 

Code:
 int main(void) { return 0; }

Compiler stdout:
 
Compiler stderr:

Notably, unlike the build-time failure, that test doesn't report passing any "-Wl,-Bstatic" flag to determine if it can statically link with -lz.

alanc avatar Nov 14 '22 22:11 alanc

Using the classic method of "grep and copy" programming, without actually understanding the source code, this small change to ZlibSystemDependency seems to fix it:

--- a/mesonbuild/dependencies/dev.py
+++ b/mesonbuild/dependencies/dev.py
@@ -509,7 +509,7 @@ class ZlibSystemDependency(SystemDependency):
             else:
                 libs = ['z']
             for lib in libs:
-                l = self.clib_compiler.find_library(lib, environment, [])
+                l = self.clib_compiler.find_library(lib, environment, [], self.libtype)
                 h = self.clib_compiler.has_header('zlib.h', '', environment, dependencies=[self])
                 if l and h[0]:
                     self.is_found = True

With that, running ../../../meson.py setup builddir -Dstatic=true -Dmethod=system results in:

Run-time dependency zlib found: NO (tried system)

meson.build:9:2: ERROR: Problem encountered: MESON_SKIP_TEST: Could not find a static zlib

while it still completes setup & build successfully with -Dstatic=false.

alanc avatar Nov 14 '22 22:11 alanc

Since no one said my fix looked wrong or made a better suggestion in the past 4 months I submitted pull request #11569 for this change.

On Solaris 11.4.57, this changes the results of that rust test case from:

 [SUCCESS]   rust: 13 external c dependencies    (static=False method=cmake)
 [SUCCESS]   rust: 13 external c dependencies    (static=False method=pkg-config)
 [SUCCESS]   rust: 13 external c dependencies    (static=False method=system)
 [SUCCESS]   rust: 13 external c dependencies    (static=True method=cmake)
  [ERROR]    rust: 13 external c dependencies    (static=True method=system)
During: build
Reason: Compiling source code failed.

to

 [SUCCESS]   rust: 13 external c dependencies    (static=False method=cmake)
 [SUCCESS]   rust: 13 external c dependencies    (static=False method=pkg-config)
 [SUCCESS]   rust: 13 external c dependencies    (static=False method=system)
 [SUCCESS]   rust: 13 external c dependencies    (static=True method=cmake)
 [SKIPPED]   rust: 13 external c dependencies    (static=True method=system)
Reason: Could not find a static zlib

alanc avatar Mar 23 '23 01:03 alanc