diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2022-10-16 18:19:33 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2022-10-16 18:19:33 +0300 |
commit | 2b43f1ec1dd72e774162642c91421f4a6ae38f9c (patch) | |
tree | f2e544cf9a1dac65797a6ac06ae1cfdc24f504e1 /mesonbuild/backend | |
parent | 5937bbf6ee99d31b2f7d47d4e5cae7892bcb88d8 (diff) | |
download | meson-biggen.zip meson-biggen.tar.gz meson-biggen.tar.bz2 |
Add support for opaque build targets. Closes #10627.biggen
Diffstat (limited to 'mesonbuild/backend')
-rw-r--r-- | mesonbuild/backend/backends.py | 16 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 10 |
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)) |