aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r--mesonbuild/backend/backends.py16
-rw-r--r--mesonbuild/backend/ninjabackend.py10
2 files changed, 22 insertions, 4 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index 8943464..68efb3d 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -131,6 +131,7 @@ class InstallData:
self.symlinks: T.List[InstallSymlinkData] = []
self.install_scripts: T.List[ExecutableSerialisation] = []
self.install_subdirs: T.List[SubdirInstallData] = []
+ self.install_opaque: T.List[(str, str)] = []
@dataclass(eq=False)
class TargetInstallData:
@@ -1510,6 +1511,7 @@ class Backend:
self.generate_symlink_install(d)
self.generate_custom_install_script(d)
self.generate_subdir_install(d)
+ self.generate_opaque_install(d)
return d
def create_install_data_files(self) -> None:
@@ -1637,6 +1639,11 @@ class Backend:
tag=tag)
d.targets.append(i)
elif isinstance(t, build.CustomTarget):
+ if t.is_opaque:
+ # The contents of opaque dirs are installed in a separate function.
+ # The "output" of this target is the stampfile and we do not want
+ # to install that.
+ continue
# If only one install_dir is specified, assume that all
# outputs will be installed into it. This is for
# backwards-compatibility and because it makes sense to
@@ -1771,6 +1778,15 @@ class Backend:
i = SubdirInstallData(src_dir, dst_dir, dst_name, sd.install_mode, sd.exclude, sd.subproject, sd.install_tag)
d.install_subdirs.append(i)
+ def generate_opaque_install(self, d: InstallData) -> None:
+ for ct in self.build.get_targets().values():
+ if isinstance(ct, build.CustomTarget) and ct.is_opaque:
+ opdata = mesonlib.get_opaque_data(ct.subproject, ct.name)
+ if len(ct.install_dir) !=1:
+ raise RuntimeError('Internal error, install_dir must have only one string.')
+ installdir = ct.install_dir[0]
+ d.install_opaque.append((opdata.out, installdir))
+
def get_introspection_data(self, target_id: str, target: build.Target) -> T.List['TargetIntrospectionData']:
'''
Returns a list of source dicts with the following format for a given target:
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 593c201..8377dcf 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -3445,15 +3445,17 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
# empty. https://github.com/mesonbuild/meson/issues/1220
ctlist = []
for t in self.build.get_targets().values():
- if isinstance(t, build.CustomTarget):
+ if isinstance(t, build.CustomTarget) and not t.is_opaque:
# Create a list of all custom target outputs
for o in t.get_outputs():
ctlist.append(os.path.join(self.get_target_dir(t), o))
# As above, but restore the top level directory after deletion.
+ gendir_list = []
for t in self.build.get_targets().values():
- if isinstance(t, build.CustomTarget):
- if False:
- gendir_list.append('fake')
+ if isinstance(t, build.CustomTarget) and t.is_opaque:
+ opdata = mesonlib.get_opaque_data(t.subproject, t.name)
+ gendir_list.append(opdata.scratch)
+ gendir_list.append(opdata.out)
if ctlist or gendir_list:
elem.add_dep(self.generate_custom_target_clean(ctlist, gendir_list))