diff --git a/builder.py b/builder.py index d48c5a16b..b60de587d 100755 --- a/builder.py +++ b/builder.py @@ -30,8 +30,7 @@ parser.add_option('--datadir', default='share', dest='datadir') parser.add_option('--mandir' , default='share/man', dest='mandir') class BuilderApp(): - builder_filename = 'builder.txt' - + def __init__(self, dir1, dir2, options): (self.source_dir, self.build_dir) = self.validate_dirs(dir1, dir2) if options.prefix[0] != '/': @@ -39,7 +38,7 @@ class BuilderApp(): self.options = options def has_builder_file(self, dirname): - fname = os.path.join(dirname, BuilderApp.builder_filename) + fname = os.path.join(dirname, environment.builder_filename) try: ifile = open(fname, 'r') ifile.close() @@ -66,7 +65,7 @@ class BuilderApp(): raise RuntimeError('Neither directory contains a builder file %s.' % BuilderApp.builder_filename) def generate(self): - code = open(os.path.join(self.source_dir, BuilderApp.builder_filename)).read() + code = open(os.path.join(self.source_dir, environment.builder_filename)).read() if len(code.strip()) == 0: raise interpreter.InvalidCode('Builder file is empty.') assert(isinstance(code, str)) diff --git a/environment.py b/environment.py index ec2d73c72..173064063 100755 --- a/environment.py +++ b/environment.py @@ -16,6 +16,8 @@ import subprocess, os.path +builder_filename = 'builder.txt' + class EnvironmentException(Exception): def __init(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) diff --git a/interpreter.py b/interpreter.py index 8969d6872..8268d2e23 100755 --- a/interpreter.py +++ b/interpreter.py @@ -17,6 +17,7 @@ import parser import nodes import environment +import os class InterpreterException(Exception): pass @@ -168,6 +169,7 @@ class Interpreter(): self.variables = {} self.environment = build.environment self.build_func_dict() + self.subdir = '' def build_func_dict(self): self.funcs = {'project' : self.func_project, @@ -178,7 +180,8 @@ class Interpreter(): 'shared_library' : self.func_shared_lib, 'add_test' : self.func_add_test, 'headers' : self.func_headers, - 'man' : self.func_man + 'man' : self.func_man, + 'subdir' : self.func_subdir } def sanity_check_ast(self): @@ -285,6 +288,16 @@ class Interpreter(): m = Man(args) self.build.man.append(m) return m + + def func_subdir(self, node, args): + self.validate_arguments(args, 1, [str]) + prev_subdir = self.subdir + self.subdir = os.path.join(prev_subdir, args[0]) + buildfilename = os.path.join(self.subdir, environment.builder_filename) + code = open(os.path.join(self.environment.get_source_dir(), buildfilename)).read() + assert(isinstance(code, str)) + print('Going to subdirectory "%s".' % self.subdir) + self.subdir = prev_subdir def build_target(self, node, args, targetclass): for a in args: