diff options
author | Nirbheek Chauhan <nirbheek@centricular.com> | 2019-01-29 16:12:35 +0530 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek.chauhan@gmail.com> | 2019-01-31 20:36:49 +0000 |
commit | 50b863032ed3913b9737112b5250c2d35a7b9fb7 (patch) | |
tree | 8eb16694963e2a9ea6c0354026e709561ca39730 /mesonbuild/mesonlib.py | |
parent | 52936e4a4624e87b79bcaa2795751a037104ece0 (diff) | |
download | meson-50b863032ed3913b9737112b5250c2d35a7b9fb7.zip meson-50b863032ed3913b9737112b5250c2d35a7b9fb7.tar.gz meson-50b863032ed3913b9737112b5250c2d35a7b9fb7.tar.bz2 |
find_library: Check arch of libraries on Darwin
macOS provides the tool `lipo` to check the archs supported by an
object (executable, static library, dylib, etc). This is especially
useful for fat archives, but it also helps with thin archives.
Without this, the linker will fail to link to the library we mistakenly
'found' like so:
ld: warning: ignoring file /path/to/libfoo.a, missing required architecture armv7 in file /path/to/libfoo.a
Diffstat (limited to 'mesonbuild/mesonlib.py')
-rw-r--r-- | mesonbuild/mesonlib.py | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index 5529ce4..09228dc 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -461,6 +461,24 @@ def exe_exists(arglist): pass return False +lru_cache(maxsize=None) +def darwin_get_object_archs(objpath): + ''' + For a specific object (executable, static library, dylib, etc), run `lipo` + to fetch the list of archs supported by it. Supports both thin objects and + 'fat' objects. + ''' + _, stdo, stderr = Popen_safe(['lipo', '-archs', objpath]) + if not stdo: + mlog.debug('lipo {}: {}'.format(objpath, stderr)) + return None + # Convert from lipo-style archs to meson-style CPUs + stdo = stdo.replace('i386', 'x86') + # Add generic name for armv7 and armv7s + if 'armv7' in stdo: + stdo += ' arm' + return stdo.split() + def detect_vcs(source_dir): vcs_systems = [ dict(name = 'git', cmd = 'git', repo_dir = '.git', get_rev = 'git describe --dirty=+', rev_regex = '(.*)', dep = '.git/logs/HEAD'), |