aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2015-06-15 00:26:19 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2015-06-15 00:26:19 +0300
commit6d744b13ff205a4a85c298c620525d8a3b685447 (patch)
tree89cbfa3e9f7e63de77d33ba688037e0103700e76
parentee0fee2111087a1082baaad3f53e871bd9123c69 (diff)
downloadmeson-6d744b13ff205a4a85c298c620525d8a3b685447.zip
meson-6d744b13ff205a4a85c298c620525d8a3b685447.tar.gz
meson-6d744b13ff205a4a85c298c620525d8a3b685447.tar.bz2
Now can create internal dependencies to simplify subproject usage.
-rw-r--r--build.py13
-rw-r--r--dependencies.py7
-rw-r--r--interpreter.py42
-rw-r--r--test cases/common/85 internal dependency/meson.build4
-rw-r--r--test cases/common/85 internal dependency/proj1/include/proj1.h5
-rw-r--r--test cases/common/85 internal dependency/proj1/meson.build11
-rw-r--r--test cases/common/85 internal dependency/proj1/proj1f1.c6
-rw-r--r--test cases/common/85 internal dependency/proj1/proj1f2.c6
-rw-r--r--test cases/common/85 internal dependency/proj1/proj1f3.c6
-rw-r--r--test cases/common/85 internal dependency/src/main.c10
-rw-r--r--test cases/common/85 internal dependency/src/meson.build2
11 files changed, 103 insertions, 9 deletions
diff --git a/build.py b/build.py
index 9f4fa95..29f20a8 100644
--- a/build.py
+++ b/build.py
@@ -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)