diff options
-rw-r--r-- | docs/markdown/Reference-manual.md | 3 | ||||
-rw-r--r-- | docs/markdown/snippets/custom-target-depends.md | 4 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 3 | ||||
-rw-r--r-- | mesonbuild/build.py | 12 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 2 |
5 files changed, 23 insertions, 1 deletions
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md index 9b1c96f..a5733a2 100644 --- a/docs/markdown/Reference-manual.md +++ b/docs/markdown/Reference-manual.md @@ -285,6 +285,9 @@ the following special string substitutions: - `@PLAINNAME@`: the input filename, without a path - `@BASENAME@`: the input filename, with extension removed +The `depfile` keyword argument also accepts the `@BASENAME@` and `@PLAINNAME@` +substitutions. *(since 0.47)* + The returned object also has methods that are documented in the [object methods section](#custom-target-object) below. diff --git a/docs/markdown/snippets/custom-target-depends.md b/docs/markdown/snippets/custom-target-depends.md new file mode 100644 index 0000000..e2b2ed7 --- /dev/null +++ b/docs/markdown/snippets/custom-target-depends.md @@ -0,0 +1,4 @@ +## Substitutions in `custom_target(depends:)` + +The `depfile` keyword argument to `custom_target` now accepts the `@BASENAME@` +and `@PLAINNAME@` substitutions. diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index e9892b4..b327338 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -546,7 +546,8 @@ int dummy; else: cmd_type = 'custom' if target.depfile is not None: - rel_dfile = os.path.join(self.get_target_dir(target), target.depfile) + depfile = target.get_dep_outname(elem.infilenames) + rel_dfile = os.path.join(self.get_target_dir(target), depfile) abs_pdir = os.path.join(self.environment.get_build_dir(), self.get_target_dir(target)) os.makedirs(abs_pdir, exist_ok=True) elem.add_item('DEPFILE', rel_dfile) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 1e7f5fe..c5e50da 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1835,6 +1835,18 @@ class CustomTarget(Target): def get_generated_sources(self): return self.get_generated_lists() + def get_dep_outname(self, infilenames): + if self.depfile is None: + raise InvalidArguments('Tried to get depfile name for custom_target that does not have depfile defined.') + if len(infilenames): + plainname = os.path.basename(infilenames[0]) + basename = os.path.splitext(plainname)[0] + return self.depfile.replace('@BASENAME@', basename).replace('@PLAINNAME@', plainname) + else: + if '@BASENAME@' in self.depfile or '@PLAINNAME@' in self.depfile: + raise InvalidArguments('Substitution in depfile for custom_target that does not have an input file.') + return self.depfile + def type_suffix(self): return "@cus" diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index b596ddc..564558e 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2939,6 +2939,8 @@ root and issuing %s. def func_custom_target(self, node, args, kwargs): if len(args) != 1: raise InterpreterException('custom_target: Only one positional argument is allowed, and it must be a string name') + if 'depfile' in kwargs and ('@BASENAME@' in kwargs['depfile'] or '@PLAINNAME@' in kwargs['depfile']): + FeatureNew('substitutions in custom_target depfile', '0.47.0').use() name = args[0] kwargs['install_mode'] = self._get_kwarg_install_mode(kwargs) tg = CustomTargetHolder(build.CustomTarget(name, self.subdir, self.subproject, kwargs), self) |