Include directories work.
This commit is contained in:
parent
5269885f16
commit
5c0d1cc7c0
|
@ -38,8 +38,22 @@ class InterpreterObject():
|
||||||
return self.methods[method_name](args)
|
return self.methods[method_name](args)
|
||||||
raise InvalidCode('Unknown method "%s" in object.' % method_name)
|
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):
|
class Headers(InterpreterObject):
|
||||||
|
|
||||||
def __init__(self, sources):
|
def __init__(self, sources):
|
||||||
InterpreterObject.__init__(self)
|
InterpreterObject.__init__(self)
|
||||||
self.sources = sources
|
self.sources = sources
|
||||||
|
@ -112,10 +126,12 @@ class BuildTarget(InterpreterObject):
|
||||||
self.subdir = subdir
|
self.subdir = subdir
|
||||||
self.sources = sources
|
self.sources = sources
|
||||||
self.external_deps = []
|
self.external_deps = []
|
||||||
|
self.include_dirs = []
|
||||||
self.methods.update({'add_dep': self.add_dep_method,
|
self.methods.update({'add_dep': self.add_dep_method,
|
||||||
'link' : self.link_method,
|
'link' : self.link_method,
|
||||||
'install': self.install_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.link_targets = []
|
||||||
self.filename = 'no_name'
|
self.filename = 'no_name'
|
||||||
|
@ -146,6 +162,9 @@ class BuildTarget(InterpreterObject):
|
||||||
def get_pch(self):
|
def get_pch(self):
|
||||||
return self.pch
|
return self.pch
|
||||||
|
|
||||||
|
def get_include_dirs(self):
|
||||||
|
return self.include_dirs
|
||||||
|
|
||||||
def add_external_dep(self, dep):
|
def add_external_dep(self, dep):
|
||||||
if not isinstance(dep, environment.PkgConfigDependency):
|
if not isinstance(dep, environment.PkgConfigDependency):
|
||||||
raise InvalidArguments('Argument is not an external dependency')
|
raise InvalidArguments('Argument is not an external dependency')
|
||||||
|
@ -175,6 +194,11 @@ class BuildTarget(InterpreterObject):
|
||||||
for a in args:
|
for a in args:
|
||||||
self.pch.append(a)
|
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):
|
class Executable(BuildTarget):
|
||||||
def __init__(self, name, subdir, sources, environment):
|
def __init__(self, name, subdir, sources, environment):
|
||||||
|
@ -236,9 +260,10 @@ class Interpreter():
|
||||||
'man' : self.func_man,
|
'man' : self.func_man,
|
||||||
'subdir' : self.func_subdir,
|
'subdir' : self.func_subdir,
|
||||||
'data' : self.func_data,
|
'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):
|
def get_variables(self):
|
||||||
return self.variables
|
return self.variables
|
||||||
|
|
||||||
|
@ -396,6 +421,13 @@ class Interpreter():
|
||||||
c = ConfigureFile(self.subdir, args[0], args[1])
|
c = ConfigureFile(self.subdir, args[0], args[1])
|
||||||
self.build.configure_files.append(c)
|
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):
|
def flatten(self, args):
|
||||||
result = []
|
result = []
|
||||||
for a in args:
|
for a in args:
|
||||||
|
|
|
@ -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_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 = os.path.join(self.get_target_dir(target), src)
|
||||||
abs_obj += '.' + self.environment.get_object_suffix()
|
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 += self.get_pch_include_args(compiler, target)
|
||||||
commands.append(abs_src)
|
commands.append(abs_src)
|
||||||
commands += compiler.get_output_flags()
|
commands += compiler.get_output_flags()
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
project('include dir test', 'c')
|
||||||
|
|
||||||
|
inc = include_directories('include')
|
||||||
|
subdir('src')
|
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef FUNC_H__
|
||||||
|
#define FUNC_H__
|
||||||
|
|
||||||
|
int func();
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,3 @@
|
||||||
|
exe = executable('prog', 'prog.c', 'func.c')
|
||||||
|
exe.add_include_dirs(inc)
|
||||||
|
add_test('inc test', exe)
|
|
@ -0,0 +1,5 @@
|
||||||
|
#include "func.h"
|
||||||
|
|
||||||
|
int func() {
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
#include "func.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
return func();
|
||||||
|
}
|
Loading…
Reference in New Issue