diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2015-06-15 00:26:19 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2015-06-15 00:26:19 +0300 |
commit | 6d744b13ff205a4a85c298c620525d8a3b685447 (patch) | |
tree | 89cbfa3e9f7e63de77d33ba688037e0103700e76 | |
parent | ee0fee2111087a1082baaad3f53e871bd9123c69 (diff) | |
download | meson-6d744b13ff205a4a85c298c620525d8a3b685447.zip meson-6d744b13ff205a4a85c298c620525d8a3b685447.tar.gz meson-6d744b13ff205a4a85c298c620525d8a3b685447.tar.bz2 |
Now can create internal dependencies to simplify subproject usage.
-rw-r--r-- | build.py | 13 | ||||
-rw-r--r-- | dependencies.py | 7 | ||||
-rw-r--r-- | interpreter.py | 42 | ||||
-rw-r--r-- | test cases/common/85 internal dependency/meson.build | 4 | ||||
-rw-r--r-- | test cases/common/85 internal dependency/proj1/include/proj1.h | 5 | ||||
-rw-r--r-- | test cases/common/85 internal dependency/proj1/meson.build | 11 | ||||
-rw-r--r-- | test cases/common/85 internal dependency/proj1/proj1f1.c | 6 | ||||
-rw-r--r-- | test cases/common/85 internal dependency/proj1/proj1f2.c | 6 | ||||
-rw-r--r-- | test cases/common/85 internal dependency/proj1/proj1f3.c | 6 | ||||
-rw-r--r-- | test cases/common/85 internal dependency/src/main.c | 10 | ||||
-rw-r--r-- | test cases/common/85 internal dependency/src/meson.build | 2 |
11 files changed, 103 insertions, 9 deletions
@@ -421,11 +421,16 @@ class BuildTarget(): for dep in deps: if hasattr(dep, 'held_object'): dep = dep.held_object - if not isinstance(dep, dependencies.Dependency): - raise InvalidArguments('Argument is not an external dependency') - self.external_deps.append(dep) - if isinstance(dep, dependencies.Dependency): + if isinstance(dep, dependencies.InternalDependency): + self.sources += dep.sources + self.add_include_dirs(dep.include_directories) + for l in dep.libraries: + self.link(l) + elif isinstance(dep, dependencies.Dependency): + self.external_deps.append(dep) self.process_sourcelist(dep.get_sources()) + else: + raise InvalidArguments('Argument is not an external dependency') def get_external_deps(self): return self.external_deps diff --git a/dependencies.py b/dependencies.py index ea914d9..3dea5ca 100644 --- a/dependencies.py +++ b/dependencies.py @@ -58,6 +58,13 @@ class Dependency(): def need_threads(self): return False +class InternalDependency(): + def __init__(self, incdirs, libraries, sources): + super().__init__() + self.include_directories = incdirs + self.libraries = libraries + self.sources = sources + class PkgConfigDependency(Dependency): pkgconfig_found = None diff --git a/interpreter.py b/interpreter.py index 89df630..dea802e 100644 --- a/interpreter.py +++ b/interpreter.py @@ -22,7 +22,6 @@ import optinterpreter import wrap import mesonlib import os, sys, platform, subprocess, shutil, uuid, re -from mesonlib import File from functools import wraps import importlib @@ -44,6 +43,14 @@ def check_stringlist(a, msg='Arguments must be strings.'): if not all(isinstance(s, str) for s in a): raise InvalidArguments(msg) +def noPosargs(f): + @wraps(f) + def wrapped(self, node, args, kwargs): + if len(args) != 0: + raise InvalidArguments('Function does not take positional arguments.') + return f(self, node, args, kwargs) + return wrapped + def noKwargs(f): @wraps(f) def wrapped(self, node, args, kwargs): @@ -215,6 +222,15 @@ class DependencyHolder(InterpreterObject): def found_method(self, args, kwargs): return self.held_object.found() +class InternalDependencyHolder(InterpreterObject): + def __init__(self, dep): + InterpreterObject.__init__(self) + self.held_object = dep + self.methods.update({'found' : self.found_method}) + + def found_method(self, args, kwargs): + return True + class ExternalProgramHolder(InterpreterObject): def __init__(self, ep): InterpreterObject.__init__(self) @@ -827,6 +843,7 @@ class Interpreter(): 'set_variable' : self.func_set_variable, 'import' : self.func_import, 'files' : self.func_files, + 'declare_dependency': self.func_declare_dependency, } def module_method_callback(self, invalues): @@ -930,7 +947,22 @@ class Interpreter(): @stringArgs @noKwargs def func_files(self, node, args, kwargs): - return [File.from_source_file(self.environment.source_dir, self.subdir, fname) for fname in args] + return [mesonlib.File.from_source_file(self.environment.source_dir, self.subdir, fname) for fname in args] + + @noPosargs + def func_declare_dependency(self, node, args, kwargs): + incs = kwargs.get('include_directories', []) + if not isinstance(incs, list): + incs = [incs] + libs = kwargs.get('link_with', []) + if not isinstance(libs, list): + libs = [libs] + sources = kwargs.get('sources', []) + if not isinstance(sources, list): + sources = [sources] + sources = self.source_strings_to_files(self.flatten(sources)) + dep = dependencies.InternalDependency(incs, libs, sources) + return InternalDependencyHolder(dep) def set_variable(self, varname, variable): if variable is None: @@ -1571,13 +1603,13 @@ class Interpreter(): def source_strings_to_files(self, sources): results = [] for s in sources: - if isinstance(s, File) or isinstance(s, GeneratedListHolder) or \ + if isinstance(s, mesonlib.File) or isinstance(s, GeneratedListHolder) or \ isinstance(s, CustomTargetHolder): pass elif isinstance(s, str): - s = File.from_source_file(self.environment.source_dir, self.subdir, s) + s = mesonlib.File.from_source_file(self.environment.source_dir, self.subdir, s) else: - raise InterpreterException("Argument list is invalid.") + raise InterpreterException("Source item is not string or File-type object.") results.append(s) return results diff --git a/test cases/common/85 internal dependency/meson.build b/test cases/common/85 internal dependency/meson.build new file mode 100644 index 0000000..6faedb0 --- /dev/null +++ b/test cases/common/85 internal dependency/meson.build @@ -0,0 +1,4 @@ +project('internal dependency', 'c') + +subdir('proj1') +subdir('src') diff --git a/test cases/common/85 internal dependency/proj1/include/proj1.h b/test cases/common/85 internal dependency/proj1/include/proj1.h new file mode 100644 index 0000000..ded6f75 --- /dev/null +++ b/test cases/common/85 internal dependency/proj1/include/proj1.h @@ -0,0 +1,5 @@ +#pragma once + +void proj1_func1(); +void proj1_func2(); +void proj1_func3(); diff --git a/test cases/common/85 internal dependency/proj1/meson.build b/test cases/common/85 internal dependency/proj1/meson.build new file mode 100644 index 0000000..422021e --- /dev/null +++ b/test cases/common/85 internal dependency/proj1/meson.build @@ -0,0 +1,11 @@ +incdirs = include_directories('include') + +p1lib = static_library('proj1', 'proj1f1.c', + include_directories : incdirs +) + +indirect_source = files('proj1f2.c') + +proj1_dep = declare_dependency(include_directories : incdirs, + link_with : p1lib, + sources : ['proj1f3.c', indirect_source]) diff --git a/test cases/common/85 internal dependency/proj1/proj1f1.c b/test cases/common/85 internal dependency/proj1/proj1f1.c new file mode 100644 index 0000000..9077f4f --- /dev/null +++ b/test cases/common/85 internal dependency/proj1/proj1f1.c @@ -0,0 +1,6 @@ +#include<proj1.h> +#include<stdio.h> + +void proj1_func1() { + printf("In proj1_func1.\n"); +} diff --git a/test cases/common/85 internal dependency/proj1/proj1f2.c b/test cases/common/85 internal dependency/proj1/proj1f2.c new file mode 100644 index 0000000..374ee4e --- /dev/null +++ b/test cases/common/85 internal dependency/proj1/proj1f2.c @@ -0,0 +1,6 @@ +#include<proj1.h> +#include<stdio.h> + +void proj1_func2() { + printf("In proj1_func2.\n"); +} diff --git a/test cases/common/85 internal dependency/proj1/proj1f3.c b/test cases/common/85 internal dependency/proj1/proj1f3.c new file mode 100644 index 0000000..8c8fca4 --- /dev/null +++ b/test cases/common/85 internal dependency/proj1/proj1f3.c @@ -0,0 +1,6 @@ +#include<proj1.h> +#include<stdio.h> + +void proj1_func3() { + printf("In proj1_func3.\n"); +} diff --git a/test cases/common/85 internal dependency/src/main.c b/test cases/common/85 internal dependency/src/main.c new file mode 100644 index 0000000..7d50b05 --- /dev/null +++ b/test cases/common/85 internal dependency/src/main.c @@ -0,0 +1,10 @@ +#include<stdio.h> +#include<proj1.h> + +int main(int argc, char **argv) { + printf("Now calling into library.\n"); + proj1_func1(); + proj1_func2(); + proj1_func3(); + return 0; +} diff --git a/test cases/common/85 internal dependency/src/meson.build b/test cases/common/85 internal dependency/src/meson.build new file mode 100644 index 0000000..89f99ab --- /dev/null +++ b/test cases/common/85 internal dependency/src/meson.build @@ -0,0 +1,2 @@ +exe = executable('projtest', 'main.c', dependencies : proj1_dep) +test('projtest', exe) |