Skip to content

Commit

Permalink
depenencies/llvm: Handle llvm-config --shared-mode failing (mesonbuil…
Browse files Browse the repository at this point in the history
…d#7379)

* depenencies/llvm: Handle llvm-config --shared-mode failing

Fixes: mesonbuild#7371
Fixes: mesonbuild#7878

* test cases/llvm: Refactor to use test.json

Instead of trying to cover everything internally
  • Loading branch information
dcbaker authored Oct 22, 2020
1 parent e7009d4 commit e8399c8
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 40 deletions.
8 changes: 7 additions & 1 deletion mesonbuild/dependencies/dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,13 @@ def __check_libfiles(self, shared):

def _set_new_link_args(self, environment):
"""How to set linker args for LLVM versions >= 3.9"""
mode = self.get_config_value(['--shared-mode'], 'link_args')[0]
try:
mode = self.get_config_value(['--shared-mode'], 'link_args')[0]
except IndexError:
mlog.debug('llvm-config --shared-mode returned an error')
self.is_found = False
return

if not self.static and mode == 'static':
# If llvm is configured with LLVM_BUILD_LLVM_DYLIB but not with
# LLVM_LINK_LLVM_DYLIB and not LLVM_BUILD_SHARED_LIBS (which
Expand Down
6 changes: 6 additions & 0 deletions run_project_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -865,6 +865,12 @@ def skippable(suite, test):
if any([x in test for x in ['16 sdl', '17 mpi']]):
return True

# We test cmake, and llvm-config. Some linux spins don't provide cmake or
# don't provide either the static or shared llvm libraries (fedora and
# opensuse only have the dynamic ones, for example).
if test.endswith('15 llvm'):
return True

# No frameworks test should be skipped on linux CI, as we expect all
# prerequisites to be installed
if mesonlib.is_linux():
Expand Down
67 changes: 28 additions & 39 deletions test cases/frameworks/15 llvm/meson.build
Original file line number Diff line number Diff line change
@@ -1,28 +1,23 @@
project('llvmtest', ['c', 'cpp'], default_options : ['c_std=c99'])

d = dependency('llvm', required : false, method : 'config-tool')
method = get_option('method')
static = get_option('link-static')
d = dependency('llvm', required : false, method : method, static : static)
if not d.found()
d = dependency('llvm', required : false, static : true)
if not d.found()
error('MESON_SKIP_TEST llvm not found.')
else
static = true
endif
else
static = false
error('MESON_SKIP_TEST llvm not found.')
endif

d = dependency('llvm', modules : 'not-found', required : false, static : static)
d = dependency('llvm', modules : 'not-found', required : false, static : static, method : method)
assert(d.found() == false, 'not-found llvm module found')

d = dependency('llvm', version : '<0.1', required : false, static : static)
d = dependency('llvm', version : '<0.1', required : false, static : static, method : method)
assert(d.found() == false, 'ancient llvm module found')

d = dependency('llvm', optional_modules : 'not-found', required : false, static : static)
d = dependency('llvm', optional_modules : 'not-found', required : false, static : static, method : method)
assert(d.found() == true, 'optional module stopped llvm from being found.')

# Check we can apply a version constraint
d = dependency('llvm', version : ['< 500', '>=@0@'.format(d.version())], required: false, static : static)
d = dependency('llvm', version : ['< 500', '>=@0@'.format(d.version())], required: false, static : static, method : method)
assert(d.found() == true, 'Cannot set version constraints')

dep_tinfo = dependency('tinfo', required : false)
Expand All @@ -31,29 +26,23 @@ if not dep_tinfo.found()
dep_tinfo = cpp.find_library('tinfo', required: false)
endif

foreach method : ['config-tool', 'cmake']
foreach static : [true, false]
message('Trying method @0@ for @1@ link'.format(method, static ? 'static' : 'dynamic'))
llvm_dep = dependency(
'llvm',
modules : ['bitwriter', 'asmprinter', 'executionengine', 'target',
'mcjit', 'nativecodegen', 'amdgpu'],
required : false,
static : static,
method : method,
)
if llvm_dep.found()
name = static ? 'static' : 'dynamic'
executable(
'sum-@0@-@1@'.format(name, method),
'sum.c',
dependencies : [
llvm_dep, dep_tinfo,
# zlib will be statically linked on windows
dependency('zlib', required : host_machine.system() != 'windows'),
meson.get_compiler('c').find_library('dl', required : false),
]
)
endif
endforeach
endforeach
llvm_dep = dependency(
'llvm',
modules : ['bitwriter', 'asmprinter', 'executionengine', 'target',
'mcjit', 'nativecodegen', 'amdgpu'],
required : false,
static : static,
method : method,
)
if llvm_dep.found()
executable(
'sum',
'sum.c',
dependencies : [
llvm_dep, dep_tinfo,
# zlib will be statically linked on windows
dependency('zlib', required : host_machine.system() != 'windows'),
meson.get_compiler('c').find_library('dl', required : false),
]
)
endif
10 changes: 10 additions & 0 deletions test cases/frameworks/15 llvm/meson_options.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
option(
'method',
type : 'combo',
choices : ['config-tool', 'cmake']
)
option(
'link-static',
type : 'boolean',
value : false,
)
17 changes: 17 additions & 0 deletions test cases/frameworks/15 llvm/test.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"matrix": {
"options": {
"method": [
{ "val": "config-tool" },
{ "val": "cmake" }
],
"link-static": [
{ "val": true },
{ "val": false }
]
},
"exclude": [
{ "method": "cmake", "link-static": false }
]
}
}

0 comments on commit e8399c8

Please sign in to comment.