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 return filename
def get_target_dir(self, target): 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) os.makedirs(os.path.join(self.environment.get_build_dir(), dirname), exist_ok=True)
return dirname return dirname
@ -257,8 +258,15 @@ class Backend():
if not isinstance(target, build.Executable): if not isinstance(target, build.Executable):
print(target) print(target)
return [] return []
prospectives = target.get_transitive_rpaths() prospectives = target.get_transitive_link_deps()
return [os.path.join(self.environment.get_build_dir(), i) for i in prospectives if len(i) > 0] 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): def write_test_file(self, datafile):
arr = [] arr = []

@ -267,13 +267,13 @@ class BuildTarget():
def extract_all_objects(self): def extract_all_objects(self):
return ExtractedObjects(self, self.sources) return ExtractedObjects(self, self.sources)
def get_rpaths(self): def get_all_link_deps(self):
return self.get_transitive_rpaths() return self.get_transitive_link_deps()
def get_transitive_rpaths(self): def get_transitive_link_deps(self):
result = [] result = []
for i in self.link_targets: for i in self.link_targets:
result += i.get_rpaths() result += i.get_all_link_deps()
return result return result
def get_custom_install_dir(self): def get_custom_install_dir(self):
@ -648,8 +648,8 @@ class SharedLibrary(BuildTarget):
def get_import_filename(self): def get_import_filename(self):
return self.prefix + self.name + '.' + self.importsuffix return self.prefix + self.name + '.' + self.importsuffix
def get_rpaths(self): def get_all_link_deps(self):
return [self.subdir] + self.get_transitive_rpaths() return [self] + self.get_transitive_link_deps()
def get_filename(self): def get_filename(self):
'''Works on all platforms except OSX, which does its own thing.''' '''Works on all platforms except OSX, which does its own thing.'''
@ -744,13 +744,7 @@ class CustomTarget:
final_cmd += c.get_command() final_cmd += c.get_command()
elif isinstance(c, BuildTarget) or isinstance(c, CustomTarget): elif isinstance(c, BuildTarget) or isinstance(c, CustomTarget):
self.dependencies.append(c) self.dependencies.append(c)
# GIR scanner will attempt to execute this binary but final_cmd.append(c)
# 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
elif isinstance(c, list): elif isinstance(c, list):
# Hackety hack, only supports one level of flattening. Should really # Hackety hack, only supports one level of flattening. Should really
# work to arbtrary depth. # work to arbtrary depth.

@ -198,7 +198,7 @@ class NinjaBackend(backends.Backend):
for gensource in target.get_generated_sources(): for gensource in target.get_generated_sources():
if isinstance(gensource, build.CustomTarget): if isinstance(gensource, build.CustomTarget):
for src in gensource.output: 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 self.environment.is_source(src) and not self.environment.is_header(src):
if is_unity: if is_unity:
unity_deps.append(os.path.join(self.environment.get_build_dir(), RawFilename(src))) 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: if not tname in self.processed_targets:
self.generate_target(t, outfile) 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): def generate_custom_target(self, target, outfile):
ofilenames = [os.path.join(target.subdir, i) for i in target.output] ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output]
# FIXME, should not grab element at zero but rather expand all. deps = []
deps = [os.path.join(i.get_subdir(), self.hackety_hack(i.get_filename())) for i in target.get_dependencies()] 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 = [] srcs = []
for i in target.sources: for i in target.sources:
if isinstance(i, str): if isinstance(i, str):
@ -291,9 +290,14 @@ class NinjaBackend(backends.Backend):
if not isinstance(tmp, list): if not isinstance(tmp, list):
tmp = [tmp] tmp = [tmp]
for fname in 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 = [] cmd = []
for i in target.command: 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): for (j, src) in enumerate(srcs):
i = i.replace('@INPUT%d@' % j, src) i = i.replace('@INPUT%d@' % j, src)
for (j, res) in enumerate(ofilenames): for (j, res) in enumerate(ofilenames):
@ -302,8 +306,11 @@ class NinjaBackend(backends.Backend):
cmd += srcs cmd += srcs
elif i == '@OUTPUT@': elif i == '@OUTPUT@':
cmd += ofilenames cmd += ofilenames
elif i == '@OUTDIR@':
cmd.append(self.get_target_dir(target))
else: else:
cmd.append(i) cmd.append(i)
elem.add_item('COMMAND', cmd) elem.add_item('COMMAND', cmd)
elem.add_item('description', 'Generating %s with a custom command.' % target.name) elem.add_item('description', 'Generating %s with a custom command.' % target.name)
elem.write(outfile) elem.write(outfile)
@ -1190,6 +1197,14 @@ rule FORTRAN_DEP_HACK
sargs = compiler.get_include_args(srctreedir) sargs = compiler.get_include_args(srctreedir)
commands += bargs commands += bargs
commands += sargs 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: if self.environment.coredata.use_pch:
commands += self.get_pch_include_args(compiler, target) commands += self.get_pch_include_args(compiler, target)
crstr = '' crstr = ''
@ -1359,7 +1374,7 @@ rule FORTRAN_DEP_HACK
for dep in d.get_external_deps(): for dep in d.get_external_deps():
commands += dep.get_link_args() commands += dep.get_link_args()
commands += linker.build_rpath_args(self.environment.get_build_dir(),\ 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: if self.environment.coredata.coverage:
commands += linker.get_coverage_link_args() commands += linker.get_coverage_link_args()
commands += extra_args commands += extra_args
@ -1371,6 +1386,15 @@ rule FORTRAN_DEP_HACK
elem.add_item('LINK_ARGS', commands) elem.add_item('LINK_ARGS', commands)
return elem 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): def get_dependency_filename(self, t):
if isinstance(t, build.SharedLibrary): if isinstance(t, build.SharedLibrary):
return os.path.join(self.get_target_private_dir_abs(t), self.get_target_filename(t) + '.symbols') 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') comp = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler.py')
comp2 = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler2.py') comp2 = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler2.py')
infile = '@0@/@1@'.format(meson.current_source_dir(), 'data_source.txt') 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', mytarget = custom_target('bindat',
output : 'data.dat', output : 'data.dat',
command : [python, comp, infile, outfile], command : [python, comp, infile, '@OUTPUT@'],
) )
mytarget2 = custom_target('bindat2', mytarget2 = custom_target('bindat2',
output : 'data2.dat', output : 'data2.dat',
command : [python, comp2, mytarget, outfile2], command : [python, comp2, mytarget, '@OUTPUT@'],
install : true, install : true,
install_dir : 'subdir' install_dir : 'subdir'
) )

@ -2,7 +2,7 @@ project('source generation', 'c')
ct = custom_target('gen', ct = custom_target('gen',
output : ['mylib.h', 'mylib.c'], 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) e = executable('prog', 'main.c', ct)

Loading…
Cancel
Save