aboutsummaryrefslogtreecommitdiff
path: root/ninjabackend.py
diff options
context:
space:
mode:
Diffstat (limited to 'ninjabackend.py')
-rw-r--r--ninjabackend.py64
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)