Can specify explicit dependencies for custom targets.

pull/100/head
Jussi Pakkanen 10 years ago
parent a3544847ca
commit e87d3c07ad
  1. 14
      build.py
  2. 6
      ninjabackend.py
  3. 10
      test cases/common/78 ctarget dependency/gen1.py
  4. 9
      test cases/common/78 ctarget dependency/gen2.py
  5. 1
      test cases/common/78 ctarget dependency/input.dat
  6. 20
      test cases/common/78 ctarget dependency/meson.build

@ -668,11 +668,14 @@ class CustomTarget:
'command' : True,
'install' : True,
'install_dir' : True,
'build_always' : True}
'build_always' : True,
'depends' : True}
def __init__(self, name, subdir, kwargs):
self.name = name
self.subdir = subdir
self.dependencies = []
self.extra_depends = []
self.process_kwargs(kwargs)
self.extra_files = []
self.install_rpath = ''
@ -744,6 +747,15 @@ class CustomTarget:
self.build_always = kwargs.get('build_always', False)
if not isinstance(self.build_always, bool):
raise InvalidArguments('Argument build_always must be a boolean.')
extra_deps = kwargs.get('depends', [])
if not isinstance(extra_deps, list):
extra_deps = [extra_deps]
for ed in extra_deps:
while hasattr(ed, 'held_object'):
ed = ed.held_object
if not isinstance(ed, CustomTarget) and not isinstance(ed, BuildTarget):
raise InvalidArguments('Can only depend on toplevel targets.')
self.extra_depends.append(ed)
def get_basename(self):
return self.name

@ -283,6 +283,12 @@ class NinjaBackend(backends.Backend):
if target.build_always:
deps.append('PHONY')
elem = NinjaBuildElement(ofilenames, 'CUSTOM_COMMAND', deps)
for d in target.extra_depends:
tmp = d.get_filename()
if not isinstance(tmp, list):
tmp = [tmp]
for fname in tmp:
elem.add_dep(os.path.join(d.get_subdir(), fname))
cmd = []
for i in target.command:
for (j, src) in enumerate(srcs):

@ -0,0 +1,10 @@
#!/usr/bin/env python3
import time, sys
# Make sure other script runs first if dependency
# is missing.
time.sleep(0.5)
contents = open(sys.argv[1], 'r').read()
open(sys.argv[2], 'w').write(contents)

@ -0,0 +1,9 @@
#!/usr/bin/env python3
import sys
from glob import glob
files = glob('*.tmp')
assert(len(files) == 1)
open(sys.argv[1], 'w').write(open(files[0], 'r').read())

@ -0,0 +1,20 @@
project('custom target dependency', 'c')
# Sometimes custom targets do not take input files
# but instead do globbing or some similar wackiness.
# In this case we need to be able to specify a
# manual dependency between two custom targets,
# if one needs to be run before the other.
g1 = find_program('gen1.py')
g2 = find_program('gen2.py')
c1 = custom_target('medput',
input : 'input.dat',
output : 'medput.tmp',
command : [g1, '@INPUT@', '@OUTPUT@'])
custom_target('output',
output : 'output.dat',
command : [g2, '@OUTPUT@'],
depends : c1)
Loading…
Cancel
Save