diff options
-rw-r--r-- | backends.py | 14 | ||||
-rw-r--r-- | build.py | 20 | ||||
-rw-r--r-- | ninjabackend.py | 46 | ||||
-rw-r--r-- | test cases/common/57 custom target chain/meson.build | 14 | ||||
-rw-r--r-- | test cases/common/61 custom target source output/meson.build | 2 |
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 = [] @@ -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) |