diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2013-03-09 22:42:01 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2013-03-09 22:42:01 +0200 |
commit | 347c2634311f8a70f2db5251358eace9f0e0eb38 (patch) | |
tree | fde6ff91a100199f1b3ed62b35f7dde6082227b8 | |
parent | 68b50bd7328dc3fc7f9826d2f261e3a9116e5be9 (diff) | |
download | meson-347c2634311f8a70f2db5251358eace9f0e0eb38.zip meson-347c2634311f8a70f2db5251358eace9f0e0eb38.tar.gz meson-347c2634311f8a70f2db5251358eace9f0e0eb38.tar.bz2 |
Find and use external libraries.
-rwxr-xr-x | backends.py | 8 | ||||
-rw-r--r-- | coredata.py | 1 | ||||
-rwxr-xr-x | environment.py | 22 | ||||
-rwxr-xr-x | interpreter.py | 41 | ||||
-rw-r--r-- | test cases/linuxlike/2 external library/meson.build | 5 | ||||
-rw-r--r-- | test cases/linuxlike/2 external library/prog.c | 8 |
6 files changed, 81 insertions, 4 deletions
diff --git a/backends.py b/backends.py index cf116a2..0de3ff4 100755 --- a/backends.py +++ b/backends.py @@ -143,7 +143,8 @@ class Backend(): if isinstance(target, interpreter.SharedLibrary): commands += compiler.get_pic_flags() for dep in target.get_external_deps(): - commands += dep.get_compile_flags() + if isinstance(dep, environment.Dependency): + commands += dep.get_compile_flags() return commands def build_target_link_arguments(self, deps): @@ -537,7 +538,10 @@ class NinjaBackend(Backend): else: raise RuntimeError('Unknown build target type.') for dep in target.get_external_deps(): - commands += dep.get_link_flags() + if isinstance(dep, environment.Dependency): + commands += dep.get_link_flags() + else: + commands.append(dep.get_filename()) dependencies = target.get_dependencies() commands += self.build_target_link_arguments(dependencies) if self.environment.coredata.coverage: diff --git a/coredata.py b/coredata.py index 3024dda..75eadfa 100644 --- a/coredata.py +++ b/coredata.py @@ -40,6 +40,7 @@ class CoreData(): self.compilers = {} self.deps = {} self.ext_progs = {} + self.ext_libs = {} def load(filename): obj = pickle.load(open(filename, 'rb')) diff --git a/environment.py b/environment.py index 28b2221..e32b7e5 100755 --- a/environment.py +++ b/environment.py @@ -16,6 +16,7 @@ import subprocess, os.path, platform import coredata +from glob import glob build_filename = 'meson.build' @@ -416,6 +417,27 @@ class Environment(): def get_datadir(self): return self.coredata.datadir + def find_library(self, libname): + dirs = self.get_library_dirs() + suffixes = [self.get_shared_lib_suffix(), self.get_static_lib_suffix()] + prefix = self.get_shared_lib_prefix() + for d in dirs: + for suffix in suffixes: + trial = os.path.join(d, prefix + libname + '.' + suffix) + if os.path.isfile(trial): + return trial + + def get_library_dirs(self): + if is_windows(): + return ['C:/mingw/lib'] # Fixme + if is_osx(): + return ['/usr/lib'] # Fix me as well. + unixdirs = ['/usr/lib', '/lib'] + plat = subprocess.check_output(['uname', '-m']).decode().strip() + unixdirs += glob('/usr/lib/' + plat + '*') + unixdirs.append('/usr/local/lib') + return unixdirs + class Dependency(): def __init__(self): pass diff --git a/interpreter.py b/interpreter.py index 1191d59..f9c566a 100755 --- a/interpreter.py +++ b/interpreter.py @@ -40,11 +40,11 @@ class InterpreterObject(): raise InvalidCode('Unknown method "%s" in object.' % method_name) class ExternalProgram(InterpreterObject): - def __init__(self, name, fullpath=None): InterpreterObject.__init__(self) self.name = name self.fullpath = fullpath + #self.methods.update({'found': self.found_method}) def found(self): return self.fullpath is not None @@ -58,6 +58,25 @@ class ExternalProgram(InterpreterObject): def get_name(self): return self.name +class ExternalLibrary(InterpreterObject): + def __init__(self, name, fullpath=None): + InterpreterObject.__init__(self) + self.name = name + self.fullpath = fullpath + #self.methods.update({'found': self.found_method}) + + def found(self): + return self.fullpath is not None + + def found_method(self, args, kwargs): + return self.found() + + def get_filename(self): + return self.fullpath + + def get_name(self): + return self.name + class Generator(InterpreterObject): def __init__(self, args, kwargs): @@ -349,7 +368,8 @@ class BuildTarget(InterpreterObject): def add_external_deps(self, deps): for dep in deps: - if not isinstance(dep, environment.Dependency): + if not isinstance(dep, environment.Dependency) and\ + not isinstance(dep, ExternalLibrary): raise InvalidArguments('Argument is not an external dependency') self.external_deps.append(dep) @@ -496,6 +516,7 @@ class Interpreter(): 'include_directories' : self.func_include_directories, 'add_global_arguments' : self.func_add_global_arguments, 'find_program' : self.func_find_program, + 'find_library' : self.func_find_library, } def get_build_def_files(self): @@ -625,6 +646,22 @@ class Interpreter(): raise InvalidArguments('Line %d: program "%s" not found.' % (node.lineno(), exename)) return progobj + def func_find_library(self, node, args, kwargs): + self.validate_arguments(args, 1, [str]) + required = kwargs.get('required', False) + if not isinstance(required, bool): + raise InvalidArguments('Line %d: "required" argument must be a boolean.' % node.lineno()) + libname = args[0] + if libname in self.coredata.ext_libs and\ + self.coredata.ext_libs[libname].found(): + return self.coredata.ext_progs[libname] + result = self.environment.find_library(libname) + libobj = ExternalLibrary(libname, result) + self.coredata.ext_libs[libname] = libobj + if required and not libobj.found(): + raise InvalidArguments('Line %d: external library "%s" not found.' % (node.lineno(), libname)) + return libobj + def func_find_dep(self, node, args, kwargs): self.validate_arguments(args, 1, [str]) name = args[0] diff --git a/test cases/linuxlike/2 external library/meson.build b/test cases/linuxlike/2 external library/meson.build new file mode 100644 index 0000000..2e3dea8 --- /dev/null +++ b/test cases/linuxlike/2 external library/meson.build @@ -0,0 +1,5 @@ +project('external library', 'c') + +zlib = find_library('z', required : true) +e = executable('zprog', 'prog.c', deps : zlib) +add_test('libtest', e) diff --git a/test cases/linuxlike/2 external library/prog.c b/test cases/linuxlike/2 external library/prog.c new file mode 100644 index 0000000..cea986d --- /dev/null +++ b/test cases/linuxlike/2 external library/prog.c @@ -0,0 +1,8 @@ +#include<zlib.h> + +int main(int argc, char **argv) { + void * something = deflate; + if(something != 0) + return 0; + return 1; +} |