aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/Reference-manual.md3
-rw-r--r--docs/markdown/snippets/custom-target-depends.md4
-rw-r--r--mesonbuild/backend/ninjabackend.py3
-rw-r--r--mesonbuild/build.py12
-rw-r--r--mesonbuild/interpreter.py2
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)