aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2013-03-09 22:42:01 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2013-03-09 22:42:01 +0200
commit347c2634311f8a70f2db5251358eace9f0e0eb38 (patch)
treefde6ff91a100199f1b3ed62b35f7dde6082227b8
parent68b50bd7328dc3fc7f9826d2f261e3a9116e5be9 (diff)
downloadmeson-347c2634311f8a70f2db5251358eace9f0e0eb38.zip
meson-347c2634311f8a70f2db5251358eace9f0e0eb38.tar.gz
meson-347c2634311f8a70f2db5251358eace9f0e0eb38.tar.bz2
Find and use external libraries.
-rwxr-xr-xbackends.py8
-rw-r--r--coredata.py1
-rwxr-xr-xenvironment.py22
-rwxr-xr-xinterpreter.py41
-rw-r--r--test cases/linuxlike/2 external library/meson.build5
-rw-r--r--test cases/linuxlike/2 external library/prog.c8
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;
+}