aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/compilers/c.py
diff options
context:
space:
mode:
authorBruce Richardson <bruce.richardson@intel.com>2018-06-26 11:35:23 +0100
committerNirbheek Chauhan <nirbheek.chauhan@gmail.com>2018-06-30 11:16:03 +0000
commitaf546b52ca0281a595f4395425905c68ff0d21c2 (patch)
treea3b6345d569912e43b308bc7b61a5e3ed2d82211 /mesonbuild/compilers/c.py
parentbde99eb6c40a9c7bc4055b0dc84a31021b7623d2 (diff)
downloadmeson-af546b52ca0281a595f4395425905c68ff0d21c2.zip
meson-af546b52ca0281a595f4395425905c68ff0d21c2.tar.gz
meson-af546b52ca0281a595f4395425905c68ff0d21c2.tar.bz2
fix find_library when cross-compiling 32-bit on 64-bit systems
When find_library is used to find dependencies, meson checks all paths for libraries with all prefixes that could match. This means that when we are compiling with -m32 on a 64-bit system, meson will find 64-bit libraries and assumes that they will work. Naturally that is not the case. The obvious fix is to do a test link against those libraries, but the extra wrinkle here is that we need to do a "whole link" so as to test the static libs. A check with gcc+ld on linux shows that unless there are unresolved symbols from the main.c file, the static library is never checked so we avoid the error from an incompatible library.
Diffstat (limited to 'mesonbuild/compilers/c.py')
-rw-r--r--mesonbuild/compilers/c.py12
1 files changed, 11 insertions, 1 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index da28b5d..e23f412 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -863,7 +863,17 @@ class CCompiler(Compiler):
for suffix in suffixes:
for prefix in prefixes:
trial = os.path.join(d, prefix + libname + '.' + suffix)
- if os.path.isfile(trial):
+ # as well as checking the path, we need to check compilation
+ # with link-whole, as static libs (.a) need to be checked
+ # to ensure they are the right architecture, e.g. 32bit or
+ # 64-bit. Just a normal test link won't work as the .a file
+ # doesn't seem to be checked by linker if there are no
+ # unresolved symbols from the main C file.
+ extra_link_args = self.get_link_whole_for([trial])
+ extra_link_args = self.linker_to_compiler_args(extra_link_args)
+ if (os.path.isfile(trial) and
+ self.links(code, env,
+ extra_args=extra_link_args)):
return [trial]
# XXX: For OpenBSD and macOS we (may) need to search for libfoo.x.y.z.dylib
return None