Converted a bunch of locations to support different target output path.

pull/255/head
Jussi Pakkanen 10 years ago
parent 363bc42c5c
commit f9060a70bb
  1. 14
      backends.py
  2. 20
      build.py
  3. 46
      ninjabackend.py
  4. 14
      test cases/common/57 custom target chain/meson.build
  5. 2
      test cases/common/61 custom target source output/meson.build

@ -69,7 +69,8 @@ class Backend():
return filename
def get_target_dir(self, target):
dirname = target.get_subdir()
# dirname = target.get_subdir()
dirname = 'meson-out'
os.makedirs(os.path.join(self.environment.get_build_dir(), dirname), exist_ok=True)
return dirname
@ -257,8 +258,15 @@ class Backend():
if not isinstance(target, build.Executable):
print(target)
return []
prospectives = target.get_transitive_rpaths()
return [os.path.join(self.environment.get_build_dir(), i) for i in prospectives if len(i) > 0]
prospectives = target.get_transitive_link_deps()
result = []
for ld in prospectives:
if ld == '' or ld == '.':
continue
dirseg = os.path.join(self.environment.get_build_dir(), self.get_target_dir())
if dirseg not in result:
result.append(dirseg)
return result
def write_test_file(self, datafile):
arr = []

@ -267,13 +267,13 @@ class BuildTarget():
def extract_all_objects(self):
return ExtractedObjects(self, self.sources)
def get_rpaths(self):
return self.get_transitive_rpaths()
def get_all_link_deps(self):
return self.get_transitive_link_deps()
def get_transitive_rpaths(self):
def get_transitive_link_deps(self):
result = []
for i in self.link_targets:
result += i.get_rpaths()
result += i.get_all_link_deps()
return result
def get_custom_install_dir(self):
@ -648,8 +648,8 @@ class SharedLibrary(BuildTarget):
def get_import_filename(self):
return self.prefix + self.name + '.' + self.importsuffix
def get_rpaths(self):
return [self.subdir] + self.get_transitive_rpaths()
def get_all_link_deps(self):
return [self] + self.get_transitive_link_deps()
def get_filename(self):
'''Works on all platforms except OSX, which does its own thing.'''
@ -744,13 +744,7 @@ class CustomTarget:
final_cmd += c.get_command()
elif isinstance(c, BuildTarget) or isinstance(c, CustomTarget):
self.dependencies.append(c)
# GIR scanner will attempt to execute this binary but
# it assumes that it is in path, so always give it a full path.
tmp = c.get_filename()
if isinstance(tmp, str):
tmp =[tmp]
totarget = [os.path.join('.', c.get_subdir(), i) for i in tmp]
final_cmd += totarget
final_cmd.append(c)
elif isinstance(c, list):
# Hackety hack, only supports one level of flattening. Should really
# work to arbtrary depth.

@ -198,7 +198,7 @@ class NinjaBackend(backends.Backend):
for gensource in target.get_generated_sources():
if isinstance(gensource, build.CustomTarget):
for src in gensource.output:
src = os.path.join(gensource.subdir, src)
src = os.path.join(self.get_target_dir(gensource), src)
if self.environment.is_source(src) and not self.environment.is_header(src):
if is_unity:
unity_deps.append(os.path.join(self.environment.get_build_dir(), RawFilename(src)))
@ -267,15 +267,14 @@ class NinjaBackend(backends.Backend):
if not tname in self.processed_targets:
self.generate_target(t, outfile)
def hackety_hack(self, hack):
if isinstance(hack, list):
return hack[0]
return hack
def generate_custom_target(self, target, outfile):
ofilenames = [os.path.join(target.subdir, i) for i in target.output]
# FIXME, should not grab element at zero but rather expand all.
deps = [os.path.join(i.get_subdir(), self.hackety_hack(i.get_filename())) for i in target.get_dependencies()]
ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output]
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):
@ -291,9 +290,14 @@ class NinjaBackend(backends.Backend):
if not isinstance(tmp, list):
tmp = [tmp]
for fname in tmp:
elem.add_dep(os.path.join(d.get_subdir(), fname))
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):
@ -302,8 +306,11 @@ class NinjaBackend(backends.Backend):
cmd += srcs
elif i == '@OUTPUT@':
cmd += ofilenames
elif i == '@OUTDIR@':
cmd.append(self.get_target_dir(target))
else:
cmd.append(i)
elem.add_item('COMMAND', cmd)
elem.add_item('description', 'Generating %s with a custom command.' % target.name)
elem.write(outfile)
@ -1190,6 +1197,14 @@ rule FORTRAN_DEP_HACK
sargs = compiler.get_include_args(srctreedir)
commands += bargs
commands += sargs
custom_target_include_dirs = []
for i in target.generated:
if isinstance(i, build.CustomTarget):
idir = self.get_target_dir(i)
if idir not in custom_target_include_dirs:
custom_target_include_dirs.append(idir)
for i in custom_target_include_dirs:
commands+= compiler.get_include_args(i)
if self.environment.coredata.use_pch:
commands += self.get_pch_include_args(compiler, target)
crstr = ''
@ -1359,7 +1374,7 @@ rule FORTRAN_DEP_HACK
for dep in d.get_external_deps():
commands += dep.get_link_args()
commands += linker.build_rpath_args(self.environment.get_build_dir(),\
target.get_rpaths(), target.install_rpath)
self.determine_rpath_dirs(target), target.install_rpath)
if self.environment.coredata.coverage:
commands += linker.get_coverage_link_args()
commands += extra_args
@ -1371,6 +1386,15 @@ rule FORTRAN_DEP_HACK
elem.add_item('LINK_ARGS', commands)
return elem
def determine_rpath_dirs(self, target):
link_deps = target.get_all_link_deps()
result = []
for ld in link_deps:
prospective = self.get_target_dir(ld)
if not prospective in result:
result.append(prospective)
return result
def get_dependency_filename(self, t):
if isinstance(t, build.SharedLibrary):
return os.path.join(self.get_target_private_dir_abs(t), self.get_target_filename(t) + '.symbols')

@ -5,17 +5,15 @@ python = find_program('python3')
comp = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler.py')
comp2 = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler2.py')
infile = '@0@/@1@'.format(meson.current_source_dir(), 'data_source.txt')
outfile = '@0@/@1@'.format(meson.current_build_dir(), 'data.dat')
outfile2 = '@0@/@1@'.format(meson.current_build_dir(), 'data2.dat')
mytarget = custom_target('bindat',
output : 'data.dat',
command : [python, comp, infile, outfile],
output : 'data.dat',
command : [python, comp, infile, '@OUTPUT@'],
)
mytarget2 = custom_target('bindat2',
output : 'data2.dat',
command : [python, comp2, mytarget, outfile2],
install : true,
install_dir : 'subdir'
output : 'data2.dat',
command : [python, comp2, mytarget, '@OUTPUT@'],
install : true,
install_dir : 'subdir'
)

@ -2,7 +2,7 @@ project('source generation', 'c')
ct = custom_target('gen',
output : ['mylib.h', 'mylib.c'],
command : [find_program('generator.py'), meson.current_build_dir()],
command : [find_program('generator.py'), '@OUTDIR@'],
)
e = executable('prog', 'main.c', ct)

Loading…
Cancel
Save