diff options
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r-- | mesonbuild/interpreter.py | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 385e07a..cc85e77 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -375,7 +375,8 @@ class GeneratedListHolder(InterpreterObject): self.held_object.add_file(a) class BuildMachine(InterpreterObject): - def __init__(self): + def __init__(self, compilers): + self.compilers = compilers InterpreterObject.__init__(self) self.methods.update({'system' : self.system_method, 'cpu_family' : self.cpu_family_method, @@ -384,10 +385,10 @@ class BuildMachine(InterpreterObject): }) def cpu_family_method(self, args, kwargs): - return environment.detect_cpu_family() + return environment.detect_cpu_family(self.compilers) def cpu_method(self, args, kwargs): - return environment.detect_cpu() + return environment.detect_cpu(self.compilers) def system_method(self, args, kwargs): return environment.detect_system() @@ -1099,6 +1100,8 @@ class Interpreter(): def __init__(self, build, backend, subproject='', subdir='', subproject_dir='subprojects'): self.build = build + self.environment = build.environment + self.coredata = self.environment.get_coredata() self.backend = backend self.subproject = subproject self.subdir = subdir @@ -1126,7 +1129,8 @@ class Interpreter(): self.sanity_check_ast() self.variables = {} self.builtin = {} - self.builtin['build_machine'] = BuildMachine() + self.parse_project() + self.builtin['build_machine'] = BuildMachine(self.coredata.compilers) if not self.build.environment.is_cross_build(): self.builtin['host_machine'] = self.builtin['build_machine'] self.builtin['target_machine'] = self.builtin['build_machine'] @@ -1141,10 +1145,8 @@ class Interpreter(): else: self.builtin['target_machine'] = self.builtin['host_machine'] self.builtin['meson'] = MesonMain(build, self) - self.environment = build.environment self.build_func_dict() self.build_def_files = [os.path.join(self.subdir, environment.build_filename)] - self.coredata = self.environment.get_coredata() self.generators = [] self.visited_subdirs = {} self.global_args_frozen = False @@ -1196,6 +1198,15 @@ class Interpreter(): 'environment' : self.func_environment, } + def parse_project(self): + """ + Parses project() and initializes languages, compilers etc. Do this + early because we need this before we parse the rest of the AST. + """ + project = self.ast.lines[0] + args, kwargs = self.reduce_arguments(project.args) + self.func_project(project, args, kwargs) + def module_method_callback(self, invalues): unwrap_single = False if invalues is None: @@ -1244,6 +1255,10 @@ class Interpreter(): first = self.ast.lines[0] if not isinstance(first, mparser.FunctionNode) or first.func_name != 'project': raise InvalidCode('First statement must be a call to project') + args = self.reduce_arguments(first.args)[0] + if len(args) < 2: + raise InvalidArguments('Not enough arguments to project(). Needs at least the project name and one language') + def check_cross_stdlibs(self): if self.build.environment.is_cross_build(): @@ -1262,10 +1277,12 @@ class Interpreter(): pass def run(self): - self.evaluate_codeblock(self.ast) + # Evaluate everything after the first line, which is project() because + # we already parsed that in self.parse_project() + self.evaluate_codeblock(self.ast, start=1) mlog.log('Build targets in project:', mlog.bold(str(len(self.build.targets)))) - def evaluate_codeblock(self, node): + def evaluate_codeblock(self, node, start=0): if node is None: return if not isinstance(node, mparser.CodeBlockNode): @@ -1274,7 +1291,7 @@ class Interpreter(): e.colno = node.colno raise e statements = node.lines - i = 0 + i = start while i < len(statements): cur = statements[i] try: @@ -1595,9 +1612,6 @@ class Interpreter(): @stringArgs def func_project(self, node, args, kwargs): - if len(args) < 2: - raise InvalidArguments('Not enough arguments to project(). Needs at least the project name and one language') - if not self.is_subproject(): self.build.project_name = args[0] if self.environment.first_invocation and 'default_options' in kwargs: @@ -1619,7 +1633,7 @@ class Interpreter(): raise InterpreterException('Meson version is %s but project requires %s.' % (cv, pv)) self.build.projects[self.subproject] = args[0] mlog.log('Project name: ', mlog.bold(args[0]), sep='') - self.add_languages(node, args[1:], True) + self.add_languages(args[1:], True) langs = self.coredata.compilers.keys() if 'vala' in langs: if not 'c' in langs: @@ -1629,7 +1643,7 @@ class Interpreter(): @stringArgs def func_add_languages(self, node, args, kwargs): - return self.add_languages(node, args, kwargs.get('required', True)) + return self.add_languages(args, kwargs.get('required', True)) @noKwargs def func_message(self, node, args, kwargs): @@ -1649,8 +1663,6 @@ class Interpreter(): raise InvalidArguments('Function accepts only strings, integers, lists and lists thereof.') mlog.log(mlog.bold('Message:'), argstr) - return - @noKwargs def func_error(self, node, args, kwargs): @@ -1727,7 +1739,7 @@ class Interpreter(): self.coredata.compiler_options = new_options return (comp, cross_comp) - def add_languages(self, node, args, required): + def add_languages(self, args, required): success = True need_cross_compiler = self.environment.is_cross_build() and self.environment.cross_info.need_cross_compiler() for lang in args: |