diff options
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 126 |
1 files changed, 47 insertions, 79 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 1cab434..977bcdd 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -40,12 +40,12 @@ FORTRAN_SUBMOD_PAT = r"\s*submodule\s*\((\w+:?\w+)\)\s*(\w+)\s*$" if mesonlib.is_windows(): quote_func = lambda s: '"{}"'.format(s) - execute_wrapper = 'cmd /c' - rmfile_prefix = 'del /f /s /q {} &&' + execute_wrapper = ['cmd', '/c'] + rmfile_prefix = ['del', '/f', '/s', '/q', '{}', '&&'] else: quote_func = shlex.quote - execute_wrapper = '' - rmfile_prefix = 'rm -f {} &&' + execute_wrapper = [] + rmfile_prefix = ['rm', '-f', '{}', '&&'] def ninja_quote(text, is_build_line=False): if is_build_line: @@ -89,11 +89,11 @@ class NinjaRule: def write(self, outfile): outfile.write('rule %s\n' % self.name) if self.rspable: - outfile.write(' command = %s @$out.rsp\n' % self.command) + outfile.write(' command = %s @$out.rsp\n' % ' '.join(self.command)) outfile.write(' rspfile = $out.rsp\n') - outfile.write(' rspfile_content = %s\n' % self.args) + outfile.write(' rspfile_content = %s\n' % ' '.join(self.args)) else: - outfile.write(' command = %s %s\n' % (self.command, self.args)) + outfile.write(' command = %s\n' % ' '.join(self.command + self.args)) if self.deps: outfile.write(' deps = %s\n' % self.deps) if self.depfile: @@ -838,9 +838,9 @@ int dummy; self.add_rule_comment(NinjaComment('Other rules')) # Ninja errors out if you have deps = gcc but no depfile, so we must # have two rules for custom commands. - self.add_rule(NinjaRule('CUSTOM_COMMAND', '$COMMAND', '', '$DESC', + self.add_rule(NinjaRule('CUSTOM_COMMAND', ['$COMMAND'], [], '$DESC', extra='restat = 1')) - self.add_rule(NinjaRule('CUSTOM_COMMAND_DEP', '$COMMAND', '', '$DESC', + self.add_rule(NinjaRule('CUSTOM_COMMAND_DEP', ['$COMMAND'], [], '$DESC', deps='gcc', depfile='$DEPFILE', extra='restat = 1')) @@ -850,7 +850,7 @@ int dummy; ninja_quote(quote_func(self.environment.get_source_dir())), ninja_quote(quote_func(self.environment.get_build_dir()))] self.add_rule(NinjaRule('REGENERATE_BUILD', - ' '.join(c) + ' --backend ninja', '', + c + ['--backend', 'ninja'], [], 'Regenerating build files.', extra='generator = 1')) @@ -1039,9 +1039,9 @@ int dummy; def generate_java_link(self): rule = 'java_LINKER' - command = 'jar $ARGS' + command = ['jar', '$ARGS'] description = 'Creating JAR $out.' - self.add_rule(NinjaRule(rule, command, '', description)) + self.add_rule(NinjaRule(rule, command, [], description)) def determine_dep_vapis(self, target): """ @@ -1487,10 +1487,8 @@ int dummy; if static_linker is None: return rule = 'STATIC%s_LINKER' % crstr - command_template = '{executable} $LINK_ARGS {output_args}' - args = '$in' - cmdlist = [] + args = ['$in'] # FIXME: Must normalize file names with pathlib.Path before writing # them out to fix this properly on Windows. See: # https://github.com/mesonbuild/meson/issues/1517 @@ -1499,19 +1497,16 @@ int dummy; # `ar` has no options to overwrite archives. It always appends, # which is never what we want. Delete an existing library first if # it exists. https://github.com/mesonbuild/meson/issues/1355 - cmdlist = [execute_wrapper, rmfile_prefix.format('$out')] + cmdlist = execute_wrapper + [c.format('$out') for c in rmfile_prefix] cmdlist += static_linker.get_exelist() - subst = { - 'executable': ' '.join(cmdlist), - 'output_args': ' '.join(static_linker.get_output_args('$out')) - } - command = command_template.format(**subst) + cmdlist += ['$LINK_ARGS'] + cmdlist += static_linker.get_output_args('$out') description = 'Linking static target $out.' if num_pools > 0: pool = 'pool = link_pool' else: pool = None - self.add_rule(NinjaRule(rule, command, args, description, + self.add_rule(NinjaRule(rule, cmdlist, args, description, rspable=static_linker.can_linker_accept_rsp(), extra=pool)) @@ -1533,14 +1528,8 @@ int dummy; if is_cross: crstr = '_CROSS' rule = '%s%s_LINKER' % (langname, crstr) - command_template = '{executable}' - args_template = '$ARGS {output_args} $in $LINK_ARGS' - subst = { - 'executable': ' '.join(compiler.get_linker_exelist()), - 'output_args': ' '.join(compiler.get_linker_output_args('$out')), - } - command = command_template.format(**subst) - args = args_template.format(**subst) + command = compiler.get_linker_exelist() + args = ['$ARGS'] + compiler.get_linker_output_args('$out') + ['$in', '$LINK_ARGS'] description = 'Linking target $out.' if num_pools > 0: pool = 'pool = link_pool' @@ -1556,45 +1545,45 @@ int dummy; '$in', '$out'] symrule = 'SHSYM' - symcmd = ' '.join(args) + ' $CROSS' + symcmd = args + ['$CROSS'] syndesc = 'Generating symbol file $out.' synstat = 'restat = 1' - self.add_rule(NinjaRule(symrule, symcmd, '', syndesc, extra=synstat)) + self.add_rule(NinjaRule(symrule, symcmd, [], syndesc, extra=synstat)) def generate_java_compile_rule(self, compiler): rule = '%s_COMPILER' % compiler.get_language() - invoc = ' '.join([ninja_quote(i) for i in compiler.get_exelist()]) - command = '%s $ARGS $in' % invoc + invoc = [ninja_quote(i) for i in compiler.get_exelist()] + command = invoc + ['$ARGS', '$in'] description = 'Compiling Java object $in.' - self.add_rule(NinjaRule(rule, command, '', description)) + self.add_rule(NinjaRule(rule, command, [], description)) def generate_cs_compile_rule(self, compiler): rule = '%s_COMPILER' % compiler.get_language() - invoc = ' '.join([ninja_quote(i) for i in compiler.get_exelist()]) - command = '%s' % invoc - args = '$ARGS $in' + invoc = [ninja_quote(i) for i in compiler.get_exelist()] + command = invoc + args = ['$ARGS', '$in'] description = 'Compiling C Sharp target $out.' self.add_rule(NinjaRule(rule, command, args, description, rspable=mesonlib.is_windows())) def generate_vala_compile_rules(self, compiler): rule = '%s_COMPILER' % compiler.get_language() - invoc = ' '.join([ninja_quote(i) for i in compiler.get_exelist()]) - command = '%s $ARGS $in' % invoc + invoc = [ninja_quote(i) for i in compiler.get_exelist()] + command = invoc + ['$ARGS', '$in'] description = 'Compiling Vala source $in.' - self.add_rule(NinjaRule(rule, command, '', description, extra='restat = 1')) + self.add_rule(NinjaRule(rule, command, [], description, extra='restat = 1')) def generate_rust_compile_rules(self, compiler, is_cross): crstr = '' if is_cross: crstr = '_CROSS' rule = '%s%s_COMPILER' % (compiler.get_language(), crstr) - invoc = ' '.join([ninja_quote(i) for i in compiler.get_exelist()]) - command = '%s $ARGS $in' % invoc + invoc = [ninja_quote(i) for i in compiler.get_exelist()] + command = invoc + ['$ARGS', '$in'] description = 'Compiling Rust source $in.' depfile = '$targetdep' depstyle = 'gcc' - self.add_rule(NinjaRule(rule, command, '', description, deps=depstyle, + self.add_rule(NinjaRule(rule, command, [], description, deps=depstyle, depfile=depfile)) def generate_swift_compile_rules(self, compiler): @@ -1604,36 +1593,28 @@ int dummy; 'dirchanger', '$RUNDIR', ] - invoc = (' '.join(full_exe) + ' ' + - ' '.join(ninja_quote(i) for i in compiler.get_exelist())) - command = '%s $ARGS $in' % invoc + invoc = full_exe + [ninja_quote(i) for i in compiler.get_exelist()] + command = invoc + ['$ARGS', '$in'] description = 'Compiling Swift source $in.' - self.add_rule(NinjaRule(rule, command, '', description)) + self.add_rule(NinjaRule(rule, command, [], description)) def generate_fortran_dep_hack(self, crstr): rule = 'FORTRAN_DEP_HACK%s' % (crstr) if mesonlib.is_windows(): - cmd = 'cmd /C ""' + cmd = ['cmd', '/C'] else: - cmd = 'true' + cmd = ['true'] self.add_rule_comment(NinjaComment('''Workaround for these issues: https://groups.google.com/forum/#!topic/ninja-build/j-2RfBIOd_8 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) - self.add_rule(NinjaRule(rule, cmd, '', 'Dep hack', extra='restat = 1')) + self.add_rule(NinjaRule(rule, cmd, [], 'Dep hack', extra='restat = 1')) def generate_llvm_ir_compile_rule(self, compiler, is_cross): if getattr(self, 'created_llvm_ir_rule', False): return rule = 'llvm_ir{}_COMPILER'.format('_CROSS' if is_cross else '') - command_template = '{executable}' - args_template = '$ARGS {output_args} {compile_only_args} $in' - subst = { - 'executable': ' '.join([ninja_quote(i) for i in compiler.get_exelist()]), - 'output_args': ' '.join(compiler.get_output_args('$out')), - 'compile_only_args': ' '.join(compiler.get_compile_only_args()), - } - command = command_template.format(**subst) - args = args_template.format(**subst) + command = [ninja_quote(i) for i in compiler.get_exelist()] + args = ['$ARGS'] + compiler.get_output_args('$out') + compiler.get_compile_only_args() + ['$in'] description = 'Compiling LLVM IR object $in.' self.add_rule(NinjaRule(rule, command, args, description, rspable=compiler.can_linker_accept_rsp())) @@ -1673,16 +1654,8 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) d = quote_func(d) quoted_depargs.append(d) - command_template = '{executable}' - args_template = '$ARGS {dep_args} {output_args} {compile_only_args} $in' - subst = { - 'executable': ' '.join([ninja_quote(i) for i in compiler.get_exelist()]), - 'dep_args': ' '.join(quoted_depargs), - 'output_args': ' '.join(compiler.get_output_args('$out')), - 'compile_only_args': ' '.join(compiler.get_compile_only_args()), - } - command = command_template.format(**subst) - args = args_template.format(**subst) + command = [ninja_quote(i) for i in compiler.get_exelist()] + args = ['$ARGS'] + quoted_depargs + compiler.get_output_args('$out') + compiler.get_compile_only_args() + ['$in'] description = 'Compiling %s object $out.' % compiler.get_display_language() if isinstance(compiler, VisualStudioCCompiler): deps = 'msvc' @@ -1710,15 +1683,10 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) d = quote_func(d) quoted_depargs.append(d) if isinstance(compiler, VisualStudioCCompiler): - output = '' + output = [] else: - output = ' '.join(compiler.get_output_args('$out')) - command = "{executable} $ARGS {dep_args} {output_args} {compile_only_args} $in".format( - executable=' '.join(compiler.get_exelist()), - dep_args=' '.join(quoted_depargs), - output_args=output, - compile_only_args=' '.join(compiler.get_compile_only_args()) - ) + output = compiler.get_output_args('$out') + command = compiler.get_exelist() + ['$ARGS'] + quoted_depargs + output + compiler.get_compile_only_args() + ['$in'] description = 'Precompiling header $in.' if isinstance(compiler, VisualStudioCCompiler): deps = 'msvc' @@ -1726,7 +1694,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) else: deps = 'gcc' depfile = '$DEPFILE' - self.add_rule(NinjaRule(rule, command, '', description, deps=deps, + self.add_rule(NinjaRule(rule, command, [], description, deps=deps, depfile=depfile)) def generate_compile_rules(self): |