aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/compilers.py13
-rw-r--r--mesonbuild/dependencies.py11
-rw-r--r--mesonbuild/interpreter.py20
-rw-r--r--test cases/linuxlike/2 external library/meson.build9
4 files changed, 49 insertions, 4 deletions
diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py
index 9b753dd..aba4b95 100644
--- a/mesonbuild/compilers.py
+++ b/mesonbuild/compilers.py
@@ -190,6 +190,9 @@ class Compiler():
def unix_compile_flags_to_native(self, args):
return args
+ def find_library(self, libname):
+ raise EnvironmentException('Language {} does not support library finding.'.format(self.language))
+
class CCompiler(Compiler):
def __init__(self, exelist, version, is_cross, exe_wrapper=None):
super().__init__(exelist, version)
@@ -563,6 +566,16 @@ void bar() {
'''
return self.compiles(templ % (prefix, typename), extra_args)
+ def find_library(self, libname):
+ code = '''int main(int argc, char **argv) {
+ return 0;
+}
+ '''
+ linkarg = '-l' + libname
+ if self.links(code, extra_args=[linkarg]):
+ return linkarg
+ return None
+
def thread_flags(self):
return ['-pthread']
diff --git a/mesonbuild/dependencies.py b/mesonbuild/dependencies.py
index 70486dc..ee2dd62 100644
--- a/mesonbuild/dependencies.py
+++ b/mesonbuild/dependencies.py
@@ -388,7 +388,14 @@ class ExternalLibrary(Dependency):
def __init__(self, name, fullpath=None, silent=False):
super().__init__()
self.name = name
- self.fullpath = fullpath
+ # Rename fullpath to link_args once standalone find_library() gets removed.
+ if fullpath is not None:
+ if isinstance(fullpath, list):
+ self.fullpath = fullpath
+ else:
+ self.fullpath = [fullpath]
+ else:
+ self.fullpath = fullpath
if not silent:
if self.found():
mlog.log('Library', mlog.bold(name), 'found:', mlog.green('YES'),
@@ -401,7 +408,7 @@ class ExternalLibrary(Dependency):
def get_link_args(self):
if self.found():
- return [self.fullpath]
+ return self.fullpath
return []
class BoostDependency(Dependency):
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 14f20e7..2ade18a 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -27,6 +27,8 @@ from functools import wraps
import importlib
+find_lib_deprecation_printed = False
+
class InterpreterException(coredata.MesonException):
pass
@@ -581,6 +583,7 @@ class CompilerHolder(InterpreterObject):
'alignment' : self.alignment_method,
'version' : self.version_method,
'cmd_array' : self.cmd_array_method,
+ 'find_library': self.find_library_method,
})
def version_method(self, args, kwargs):
@@ -750,6 +753,19 @@ class CompilerHolder(InterpreterObject):
mlog.log('Has header "%s":' % string, h)
return haz
+ def find_library_method(self, args, kwargs):
+ if len(args) != 1:
+ raise InterpreterException('find_library method takes one argument.')
+ libname = args[0]
+ if not isinstance(libname, str):
+ raise InterpreterException('Library name not a string.')
+ required = kwargs.get('required', True)
+ if not isinstance(required, bool):
+ raise InterpreterException('required must be boolean.')
+ linkarg = self.compiler.find_library(libname)
+ lib = dependencies.ExternalLibrary(libname, linkarg)
+ return ExternalLibraryHolder(lib)
+
class ModuleState:
pass
@@ -1526,6 +1542,10 @@ class Interpreter():
return progobj
def func_find_library(self, node, args, kwargs):
+ global find_lib_deprecation_printed
+ if not find_lib_deprecation_printed:
+ find_lib_deprecation_printed = True
+ mlog.log(mlog.red('DEPRECATION:'), 'find_library() is deprecated, use the corresponding method in compiler object instead.')
self.validate_arguments(args, 1, [str])
required = kwargs.get('required', True)
if not isinstance(required, bool):
diff --git a/test cases/linuxlike/2 external library/meson.build b/test cases/linuxlike/2 external library/meson.build
index b20652a..f83affc 100644
--- a/test cases/linuxlike/2 external library/meson.build
+++ b/test cases/linuxlike/2 external library/meson.build
@@ -1,6 +1,8 @@
project('external library', 'c')
-zlib = find_library('z')
+cc = meson.get_compiler('c')
+zlib = find_library('z') # DEPRECATED
+zlib2 = cc.find_library('z') # The modern way.
# Verify that link testing works.
linkcode = '''#include<zlib.h>
@@ -16,13 +18,16 @@ int main(int argc, char **argv) {
return ptr == 0;
}
'''
-cc = meson.get_compiler('c')
+
assert(cc.links(linkcode, args : '-lz', name : 'Test link against zlib'), 'Linking test failed.')
assert(not cc.links(nolinkcode, name : 'Failing link'), 'Linking succeeded when it should have failed.')
e = executable('zprog', 'prog.c', dependencies : zlib)
test('libtest', e)
+e2 = executable('zprog_alt', 'prog.c', dependencies : zlib2)
+test('libtest_alt', e2)
+
# Test that ext deps work via an internal dep.
intdep = declare_dependency(dependencies : zlib)
exe2 = executable('zprog2', 'prog.c', dependencies : intdep)