|
|
|
@ -67,9 +67,9 @@ def ninja_quote(text, is_build_line=False): |
|
|
|
|
if '\n' in text: |
|
|
|
|
errmsg = '''Ninja does not support newlines in rules. The content was: |
|
|
|
|
|
|
|
|
|
%s |
|
|
|
|
{} |
|
|
|
|
|
|
|
|
|
Please report this error with a test case to the Meson bug tracker.''' % text |
|
|
|
|
Please report this error with a test case to the Meson bug tracker.'''.format(text) |
|
|
|
|
raise MesonException(errmsg) |
|
|
|
|
return text |
|
|
|
|
|
|
|
|
@ -101,18 +101,18 @@ class NinjaRule: |
|
|
|
|
if not self.refcount: |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
outfile.write('rule %s\n' % self.name) |
|
|
|
|
outfile.write('rule {}\n'.format(self.name)) |
|
|
|
|
if self.rspable: |
|
|
|
|
outfile.write(' command = %s @$out.rsp\n' % ' '.join(self.command)) |
|
|
|
|
outfile.write(' command = {} @$out.rsp\n'.format(' '.join(self.command))) |
|
|
|
|
outfile.write(' rspfile = $out.rsp\n') |
|
|
|
|
outfile.write(' rspfile_content = %s\n' % ' '.join(self.args)) |
|
|
|
|
outfile.write(' rspfile_content = {}\n'.format(' '.join(self.args))) |
|
|
|
|
else: |
|
|
|
|
outfile.write(' command = %s\n' % ' '.join(self.command + self.args)) |
|
|
|
|
outfile.write(' command = {}\n'.format(' '.join(self.command + self.args))) |
|
|
|
|
if self.deps: |
|
|
|
|
outfile.write(' deps = %s\n' % self.deps) |
|
|
|
|
outfile.write(' deps = {}\n'.format(self.deps)) |
|
|
|
|
if self.depfile: |
|
|
|
|
outfile.write(' depfile = %s\n' % self.depfile) |
|
|
|
|
outfile.write(' description = %s\n' % self.description) |
|
|
|
|
outfile.write(' depfile = {}\n'.format(self.depfile)) |
|
|
|
|
outfile.write(' description = {}\n'.format(self.description)) |
|
|
|
|
if self.extra: |
|
|
|
|
for l in self.extra.split('\n'): |
|
|
|
|
outfile.write(' ') |
|
|
|
@ -185,7 +185,7 @@ class NinjaBuildElement: |
|
|
|
|
for e in self.elems: |
|
|
|
|
(name, elems) = e |
|
|
|
|
should_quote = name not in raw_names |
|
|
|
|
line = ' %s = ' % name |
|
|
|
|
line = ' {} = '.format(name) |
|
|
|
|
newelems = [] |
|
|
|
|
for i in elems: |
|
|
|
|
if not should_quote or i == '&&': # Hackety hack hack |
|
|
|
@ -204,7 +204,7 @@ class NinjaBuildElement: |
|
|
|
|
def check_outputs(self): |
|
|
|
|
for n in self.outfilenames: |
|
|
|
|
if n in self.all_outputs: |
|
|
|
|
raise MesonException('Multiple producers for Ninja target "%s". Please rename your targets.' % n) |
|
|
|
|
raise MesonException('Multiple producers for Ninja target "{}". Please rename your targets.'.format(n)) |
|
|
|
|
self.all_outputs[n] = True |
|
|
|
|
|
|
|
|
|
class NinjaBackend(backends.Backend): |
|
|
|
@ -299,8 +299,7 @@ int dummy; |
|
|
|
|
outfilename = os.path.join(self.environment.get_build_dir(), self.ninja_filename) |
|
|
|
|
tempfilename = outfilename + '~' |
|
|
|
|
with open(tempfilename, 'w', encoding='utf-8') as outfile: |
|
|
|
|
outfile.write('# This is the build file for project "%s"\n' % |
|
|
|
|
self.build.get_project()) |
|
|
|
|
outfile.write('# This is the build file for project "{}"\n'.format(self.build.get_project())) |
|
|
|
|
outfile.write('# It is autogenerated by the Meson build system.\n') |
|
|
|
|
outfile.write('# Do not edit by hand.\n\n') |
|
|
|
|
outfile.write('ninja_required_version = 1.7.1\n\n') |
|
|
|
@ -308,9 +307,9 @@ int dummy; |
|
|
|
|
num_pools = self.environment.coredata.backend_options['backend_max_links'].value |
|
|
|
|
if num_pools > 0: |
|
|
|
|
outfile.write('''pool link_pool |
|
|
|
|
depth = %d |
|
|
|
|
depth = {} |
|
|
|
|
|
|
|
|
|
''' % num_pools) |
|
|
|
|
'''.format(num_pools)) |
|
|
|
|
|
|
|
|
|
with self.detect_vs_dep_prefix(tempfilename) as outfile: |
|
|
|
|
self.generate_rules() |
|
|
|
@ -765,7 +764,7 @@ int dummy; |
|
|
|
|
target_name = 'meson-{}'.format(self.build_run_target_name(target)) |
|
|
|
|
elem = NinjaBuildElement(self.all_outputs, target_name, 'CUSTOM_COMMAND', []) |
|
|
|
|
elem.add_item('COMMAND', cmd) |
|
|
|
|
elem.add_item('description', 'Running external command %s' % target.name) |
|
|
|
|
elem.add_item('description', 'Running external command {}'.format(target.name)) |
|
|
|
|
elem.add_item('pool', 'console') |
|
|
|
|
# Alias that runs the target defined above with the name the user specified |
|
|
|
|
self.create_target_alias(target_name) |
|
|
|
@ -980,12 +979,12 @@ int dummy; |
|
|
|
|
ofilename = os.path.join(self.get_target_private_dir(target), ofilebase) |
|
|
|
|
elem = NinjaBuildElement(self.all_outputs, ofilename, "CUSTOM_COMMAND", rel_sourcefile) |
|
|
|
|
elem.add_item('COMMAND', ['resgen', rel_sourcefile, ofilename]) |
|
|
|
|
elem.add_item('DESC', 'Compiling resource %s' % rel_sourcefile) |
|
|
|
|
elem.add_item('DESC', 'Compiling resource {}'.format(rel_sourcefile)) |
|
|
|
|
self.add_build(elem) |
|
|
|
|
deps.append(ofilename) |
|
|
|
|
a = '-resource:' + ofilename |
|
|
|
|
else: |
|
|
|
|
raise InvalidArguments('Unknown resource file %s.' % r) |
|
|
|
|
raise InvalidArguments('Unknown resource file {}.'.format(r)) |
|
|
|
|
args.append(a) |
|
|
|
|
return args, deps |
|
|
|
|
|
|
|
|
@ -1278,7 +1277,7 @@ int dummy; |
|
|
|
|
main_rust_file = None |
|
|
|
|
for i in target.get_sources(): |
|
|
|
|
if not rustc.can_compile(i): |
|
|
|
|
raise InvalidArguments('Rust target %s contains a non-rust source file.' % target.get_basename()) |
|
|
|
|
raise InvalidArguments('Rust target {} contains a non-rust source file.'.format(target.get_basename())) |
|
|
|
|
if main_rust_file is None: |
|
|
|
|
main_rust_file = i.rel_to_builddir(self.build_to_src) |
|
|
|
|
if main_rust_file is None: |
|
|
|
@ -1377,11 +1376,11 @@ int dummy; |
|
|
|
|
|
|
|
|
|
@classmethod |
|
|
|
|
def get_compiler_rule_name(cls, lang: str, for_machine: MachineChoice) -> str: |
|
|
|
|
return '%s_COMPILER%s' % (lang, cls.get_rule_suffix(for_machine)) |
|
|
|
|
return '{}_COMPILER{}'.format(lang, cls.get_rule_suffix(for_machine)) |
|
|
|
|
|
|
|
|
|
@classmethod |
|
|
|
|
def get_pch_rule_name(cls, lang: str, for_machine: MachineChoice) -> str: |
|
|
|
|
return '%s_PCH%s' % (lang, cls.get_rule_suffix(for_machine)) |
|
|
|
|
return '{}_PCH{}'.format(lang, cls.get_rule_suffix(for_machine)) |
|
|
|
|
|
|
|
|
|
@classmethod |
|
|
|
|
def compiler_to_rule_name(cls, compiler: Compiler) -> str: |
|
|
|
@ -1453,7 +1452,7 @@ int dummy; |
|
|
|
|
abs_headers.append(absh) |
|
|
|
|
header_imports += swiftc.get_header_import_args(absh) |
|
|
|
|
else: |
|
|
|
|
raise InvalidArguments('Swift target %s contains a non-swift source file.' % target.get_basename()) |
|
|
|
|
raise InvalidArguments('Swift target {} contains a non-swift source file.'.format(target.get_basename())) |
|
|
|
|
os.makedirs(self.get_target_private_dir_abs(target), exist_ok=True) |
|
|
|
|
compile_args = swiftc.get_compile_only_args() |
|
|
|
|
compile_args += swiftc.get_optimization_args(self.get_option_for_target('optimization', target)) |
|
|
|
@ -1540,7 +1539,7 @@ int dummy; |
|
|
|
|
static_linker = self.build.static_linker[for_machine] |
|
|
|
|
if static_linker is None: |
|
|
|
|
return |
|
|
|
|
rule = 'STATIC_LINKER%s' % self.get_rule_suffix(for_machine) |
|
|
|
|
rule = 'STATIC_LINKER{}'.format(self.get_rule_suffix(for_machine)) |
|
|
|
|
cmdlist = [] |
|
|
|
|
args = ['$in'] |
|
|
|
|
# FIXME: Must normalize file names with pathlib.Path before writing |
|
|
|
@ -1574,7 +1573,7 @@ int dummy; |
|
|
|
|
or langname == 'rust' \ |
|
|
|
|
or langname == 'cs': |
|
|
|
|
continue |
|
|
|
|
rule = '%s_LINKER%s' % (langname, self.get_rule_suffix(for_machine)) |
|
|
|
|
rule = '{}_LINKER{}'.format(langname, self.get_rule_suffix(for_machine)) |
|
|
|
|
command = compiler.get_linker_exelist() |
|
|
|
|
args = ['$ARGS'] + compiler.get_linker_output_args('$out') + ['$in', '$LINK_ARGS'] |
|
|
|
|
description = 'Linking target $out' |
|
|
|
@ -1645,7 +1644,7 @@ int dummy; |
|
|
|
|
self.add_rule(NinjaRule(rule, command, [], description)) |
|
|
|
|
|
|
|
|
|
def generate_fortran_dep_hack(self, crstr): |
|
|
|
|
rule = 'FORTRAN_DEP_HACK%s' % (crstr) |
|
|
|
|
rule = 'FORTRAN_DEP_HACK{}'.format(crstr) |
|
|
|
|
if mesonlib.is_windows(): |
|
|
|
|
cmd = ['cmd', '/C'] |
|
|
|
|
else: |
|
|
|
@ -1698,7 +1697,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
|
|
|
|
|
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() |
|
|
|
|
description = 'Compiling {} object $out'.format(compiler.get_display_language()) |
|
|
|
|
if isinstance(compiler, VisualStudioLikeCompiler): |
|
|
|
|
deps = 'msvc' |
|
|
|
|
depfile = None |
|
|
|
@ -1859,9 +1858,8 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
modname = modmatch.group(1).lower() |
|
|
|
|
if modname in module_files: |
|
|
|
|
raise InvalidArguments( |
|
|
|
|
'Namespace collision: module %s defined in ' |
|
|
|
|
'two files %s and %s.' % |
|
|
|
|
(modname, module_files[modname], s)) |
|
|
|
|
'Namespace collision: module {} defined in ' |
|
|
|
|
'two files {} and {}.'.format(modname, module_files[modname], s)) |
|
|
|
|
module_files[modname] = s |
|
|
|
|
else: |
|
|
|
|
submodmatch = submodre.match(line) |
|
|
|
@ -1872,9 +1870,8 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) |
|
|
|
|
|
|
|
|
|
if submodname in submodule_files: |
|
|
|
|
raise InvalidArguments( |
|
|
|
|
'Namespace collision: submodule %s defined in ' |
|
|
|
|
'two files %s and %s.' % |
|
|
|
|
(submodname, submodule_files[submodname], s)) |
|
|
|
|
'Namespace collision: submodule {} defined in ' |
|
|
|
|
'two files {} and {}.'.format(submodname, submodule_files[submodname], s)) |
|
|
|
|
submodule_files[submodname] = s |
|
|
|
|
|
|
|
|
|
self.fortran_deps[target.get_basename()] = {**module_files, **submodule_files} |
|
|
|
|