diff options
Diffstat (limited to 'ninjabackend.py')
-rw-r--r-- | ninjabackend.py | 64 |
1 files changed, 10 insertions, 54 deletions
diff --git a/ninjabackend.py b/ninjabackend.py index 350e195..9081736 100644 --- a/ninjabackend.py +++ b/ninjabackend.py @@ -21,7 +21,7 @@ from mesonlib import File from meson_install import InstallData from build import InvalidArguments from coredata import MesonException -import os, sys, shutil, pickle, re +import os, sys, pickle, re if mesonlib.is_windows(): quote_char = '"' @@ -236,7 +236,7 @@ class NinjaBackend(backends.Backend): obj_list.append(os.path.join(self.get_target_private_dir_abs(target), src)) elif not self.environment.is_header(src): if is_unity: - if '/' in src: + if self.has_dir_part(src): rel_src = src else: rel_src = os.path.join(self.get_target_private_dir_abs(target), src) @@ -287,19 +287,13 @@ class NinjaBackend(backends.Backend): self.generate_target(t, outfile) def generate_custom_target(self, target, outfile): - ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output] + (srcs, ofilenames, cmd) = self.eval_custom_target_command(target) deps = [] for i in target.get_dependencies(): # FIXME, should not grab element at zero but rather expand all. if isinstance(i, list): i = i[0] deps.append(os.path.join(self.get_target_dir(i), i.get_filename()[0])) - srcs = [] - for i in target.sources: - if isinstance(i, str): - srcs.append(os.path.join(self.build_to_src, target.subdir, i)) - else: - srcs.append(i.rel_to_builddir(self.build_to_src)) if target.build_always: deps.append('PHONY') elem = NinjaBuildElement(ofilenames, 'CUSTOM_COMMAND', srcs) @@ -315,36 +309,6 @@ class NinjaBackend(backends.Backend): tmp = [tmp] for fname in tmp: elem.add_dep(os.path.join(self.get_target_dir(d), fname)) - cmd = [] - for i in target.command: - if isinstance(i, build.CustomTarget): - # GIR scanner will attempt to execute this binary but - # it assumes that it is in path, so always give it a full path. - tmp = i.get_filename()[0] - i = os.path.join(self.get_target_dir(i), tmp) - for (j, src) in enumerate(srcs): - i = i.replace('@INPUT%d@' % j, src) - for (j, res) in enumerate(ofilenames): - i = i.replace('@OUTPUT%d@' % j, res) - if i == '@INPUT@': - cmd += srcs - elif i == '@OUTPUT@': - cmd += ofilenames - else: - if '@OUTDIR@' in i: - i = i.replace('@OUTDIR@', self.get_target_dir(target)) - elif '@PRIVATE_OUTDIR_' in i: - match = re.search('@PRIVATE_OUTDIR_(ABS_)?([-a-zA-Z0-9.@:]*)@', i) - source = match.group(0) - if match.group(1) is None: - lead_dir = '' - else: - lead_dir = self.environment.get_build_dir() - target_id = match.group(2) - i = i.replace(source, - os.path.join(lead_dir, - self.get_target_dir(self.build.targets[target_id]))) - cmd.append(i) elem.add_item('COMMAND', cmd) elem.add_item('description', 'Generating %s with a custom command.' % target.name) @@ -1270,7 +1234,7 @@ rule FORTRAN_DEP_HACK if isinstance(src, RawFilename): rel_src = src.fname elif is_generated: - if '/' in src: + if self.has_dir_part(src): rel_src = src else: rel_src = os.path.join(self.get_target_private_dir_abs(target), src) @@ -1347,7 +1311,7 @@ rule FORTRAN_DEP_HACK for d in header_deps: if isinstance(d, RawFilename): d = d.fname - elif not '/' in d: + elif not self.has_dir_part(d): d = os.path.join(self.get_target_private_dir_abs(target), d) element.add_dep(d) for d in extra_deps: @@ -1355,7 +1319,7 @@ rule FORTRAN_DEP_HACK for d in order_deps: if isinstance(d, RawFilename): d = d.fname - elif not '/' in d : + elif not self.has_dir_part(d): d = os.path.join(self.get_target_private_dir_abs(target), d) element.add_orderdep(d) element.add_orderdep(pch_dep) @@ -1368,6 +1332,9 @@ rule FORTRAN_DEP_HACK self.check_outputs(element) return rel_obj + def has_dir_part(self, fname): + return '/' in fname or '\\' in fname + # Fortran is a bit weird (again). When you link against a library, just compiling a source file # requires the mod files that are output when single files are built. To do this right we would need to # scan all inputs and write out explicit deps for each file. That is stoo slow and too much effort so @@ -1610,18 +1577,7 @@ rule FORTRAN_DEP_HACK elem.write(outfile) self.check_outputs(elem) - deps = [os.path.join(self.build_to_src, df) \ - for df in self.interpreter.get_build_def_files()] - if self.environment.is_cross_build(): - deps.append(os.path.join(self.build_to_src, - self.environment.coredata.cross_file)) - deps.append('meson-private/coredata.dat') - if os.path.exists(os.path.join(self.environment.get_source_dir(), 'meson_options.txt')): - deps.append(os.path.join(self.build_to_src, 'meson_options.txt')) - for sp in self.build.subprojects.keys(): - fname = os.path.join(self.environment.get_source_dir(), sp, 'meson_options.txt') - if os.path.isfile(fname): - deps.append(os.path.join(self.build_to_src, sp, 'meson_options.txt')) + deps = self.get_regen_filelist() elem = NinjaBuildElement('build.ninja', 'REGENERATE_BUILD', deps) elem.add_item('pool', 'console') elem.write(outfile) |