aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xinterpreter.py40
-rwxr-xr-xshellgenerator.py6
-rw-r--r--test cases/21 includedir/builder.txt4
-rw-r--r--test cases/21 includedir/include/func.h6
-rw-r--r--test cases/21 includedir/src/builder.txt3
-rw-r--r--test cases/21 includedir/src/func.c5
-rw-r--r--test cases/21 includedir/src/prog.c5
7 files changed, 65 insertions, 4 deletions
diff --git a/interpreter.py b/interpreter.py
index e12e4f2..e71f76a 100755
--- a/interpreter.py
+++ b/interpreter.py
@@ -38,8 +38,22 @@ class InterpreterObject():
return self.methods[method_name](args)
raise InvalidCode('Unknown method "%s" in object.' % method_name)
+class IncludeDirs(InterpreterObject):
+ def __init__(self, curdir, dirs):
+ InterpreterObject.__init__(self)
+ self.curdir = curdir
+ self.incdirs = dirs
+ # Fixme: check that the directories actually exist.
+ # Also that they don't contain ".." or somesuch.
+
+ def get_curdir(self):
+ return self.curdir
+
+ def get_incdirs(self):
+ return self.incdirs
+
class Headers(InterpreterObject):
-
+
def __init__(self, sources):
InterpreterObject.__init__(self)
self.sources = sources
@@ -112,10 +126,12 @@ class BuildTarget(InterpreterObject):
self.subdir = subdir
self.sources = sources
self.external_deps = []
+ self.include_dirs = []
self.methods.update({'add_dep': self.add_dep_method,
'link' : self.link_method,
'install': self.install_method,
- 'pch' : self.pch_method
+ 'pch' : self.pch_method,
+ 'add_include_dirs': self.add_include_dirs_method,
})
self.link_targets = []
self.filename = 'no_name'
@@ -146,6 +162,9 @@ class BuildTarget(InterpreterObject):
def get_pch(self):
return self.pch
+ def get_include_dirs(self):
+ return self.include_dirs
+
def add_external_dep(self, dep):
if not isinstance(dep, environment.PkgConfigDependency):
raise InvalidArguments('Argument is not an external dependency')
@@ -175,6 +194,11 @@ class BuildTarget(InterpreterObject):
for a in args:
self.pch.append(a)
+ def add_include_dirs_method(self, args):
+ for a in args:
+ if not isinstance(a, IncludeDirs):
+ raise InvalidArguments('Include directory to be added is not an include directory object.')
+ self.include_dirs += args
class Executable(BuildTarget):
def __init__(self, name, subdir, sources, environment):
@@ -236,9 +260,10 @@ class Interpreter():
'man' : self.func_man,
'subdir' : self.func_subdir,
'data' : self.func_data,
- 'configure_file' : self.func_configure_file
+ 'configure_file' : self.func_configure_file,
+ 'include_directories' : self.func_include_directories,
}
-
+
def get_variables(self):
return self.variables
@@ -396,6 +421,13 @@ class Interpreter():
c = ConfigureFile(self.subdir, args[0], args[1])
self.build.configure_files.append(c)
+ def func_include_directories(self, node, args):
+ for a in args:
+ if not isinstance(a, str):
+ raise InvalidArguments('Line %d: Argument %s is not a string.' % (node.lineno(), str(a)))
+ i = IncludeDirs(self.subdir, args)
+ return i
+
def flatten(self, args):
result = []
for a in args:
diff --git a/shellgenerator.py b/shellgenerator.py
index 7795b5a..5c7ce2e 100755
--- a/shellgenerator.py
+++ b/shellgenerator.py
@@ -236,6 +236,12 @@ echo Run compile.sh before this or bad things will happen.
abs_src = os.path.join(self.environment.get_source_dir(), target.get_source_subdir(), src)
abs_obj = os.path.join(self.get_target_dir(target), src)
abs_obj += '.' + self.environment.get_object_suffix()
+ for i in target.get_include_dirs():
+ basedir = i.get_curdir()
+ for d in i.get_incdirs():
+ fulldir = os.path.join(self.environment.get_source_dir(), basedir, d)
+ arg = compiler.get_include_arg(fulldir)
+ commands.append(arg)
commands += self.get_pch_include_args(compiler, target)
commands.append(abs_src)
commands += compiler.get_output_flags()
diff --git a/test cases/21 includedir/builder.txt b/test cases/21 includedir/builder.txt
new file mode 100644
index 0000000..17eec0e
--- /dev/null
+++ b/test cases/21 includedir/builder.txt
@@ -0,0 +1,4 @@
+project('include dir test', 'c')
+
+inc = include_directories('include')
+subdir('src')
diff --git a/test cases/21 includedir/include/func.h b/test cases/21 includedir/include/func.h
new file mode 100644
index 0000000..29ebd0b
--- /dev/null
+++ b/test cases/21 includedir/include/func.h
@@ -0,0 +1,6 @@
+#ifndef FUNC_H__
+#define FUNC_H__
+
+int func();
+
+#endif
diff --git a/test cases/21 includedir/src/builder.txt b/test cases/21 includedir/src/builder.txt
new file mode 100644
index 0000000..cf2642a
--- /dev/null
+++ b/test cases/21 includedir/src/builder.txt
@@ -0,0 +1,3 @@
+exe = executable('prog', 'prog.c', 'func.c')
+exe.add_include_dirs(inc)
+add_test('inc test', exe)
diff --git a/test cases/21 includedir/src/func.c b/test cases/21 includedir/src/func.c
new file mode 100644
index 0000000..193edbb
--- /dev/null
+++ b/test cases/21 includedir/src/func.c
@@ -0,0 +1,5 @@
+#include "func.h"
+
+int func() {
+ return 0;
+}
diff --git a/test cases/21 includedir/src/prog.c b/test cases/21 includedir/src/prog.c
new file mode 100644
index 0000000..c26b9b3
--- /dev/null
+++ b/test cases/21 includedir/src/prog.c
@@ -0,0 +1,5 @@
+#include "func.h"
+
+int main(int argc, char **argv) {
+ return func();
+}