aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends.py14
-rw-r--r--build.py20
-rw-r--r--ninjabackend.py46
-rw-r--r--test cases/common/57 custom target chain/meson.build14
-rw-r--r--test cases/common/61 custom target source output/meson.build2
5 files changed, 60 insertions, 36 deletions
diff --git a/backends.py b/backends.py
index a6f230f..11b0e1d 100644
--- a/backends.py
+++ b/backends.py
@@ -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 = []
diff --git a/build.py b/build.py
index f1ce15d..6d6c013 100644
--- a/build.py
+++ b/build.py
@@ -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.
diff --git a/ninjabackend.py b/ninjabackend.py
index 2a2548c..9258131 100644
--- a/ninjabackend.py
+++ b/ninjabackend.py
@@ -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')
diff --git a/test cases/common/57 custom target chain/meson.build b/test cases/common/57 custom target chain/meson.build
index 7bfcddb..f53206e 100644
--- a/test cases/common/57 custom target chain/meson.build
+++ b/test cases/common/57 custom target chain/meson.build
@@ -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'
)
diff --git a/test cases/common/61 custom target source output/meson.build b/test cases/common/61 custom target source output/meson.build
index ae65055..f9d039d 100644
--- a/test cases/common/61 custom target source output/meson.build
+++ b/test cases/common/61 custom target source output/meson.build
@@ -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)