aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2021-01-29 15:18:12 -0500
committerJussi Pakkanen <jpakkane@gmail.com>2021-01-30 21:28:21 +0000
commit6c6b5d77d696c160a8f65719058dba2faf783b3e (patch)
tree74e172d60ee634e1a7dd344b75c883841749aad2 /mesonbuild
parentc491d48b9d081125f242227ff9e543abbbb838d8 (diff)
downloadmeson-6c6b5d77d696c160a8f65719058dba2faf783b3e.zip
meson-6c6b5d77d696c160a8f65719058dba2faf783b3e.tar.gz
meson-6c6b5d77d696c160a8f65719058dba2faf783b3e.tar.bz2
add_install_script: add skip_if_destdir kwarg
It is common, at least in GNOME projects, to have scripts that must be run only in the final destination, to update system icon cache, etc. Skipping them from Meson ensures we can properly log that they have not been run instead of relying on such scripts to to it (they don't always).
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/backend/backends.py1
-rw-r--r--mesonbuild/interpreter.py7
-rw-r--r--mesonbuild/minstall.py9
3 files changed, 13 insertions, 4 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index caec761..badc2d0 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -137,6 +137,7 @@ class ExecutableSerialisation:
self.extra_paths = extra_paths
self.capture = capture
self.pickled = False
+ self.skip_if_destdir = False
class TestSerialisation:
def __init__(self, name: str, project: str, suite: str, fname: T.List[str],
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index ceaa29a..0ce0fe8 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -2015,15 +2015,20 @@ class MesonMain(InterpreterObject):
'0.55.0', self.interpreter.subproject)
return script_args
- @permittedKwargs(set())
+ @FeatureNewKwargs('add_install_script', '0.57.0', ['skip_if_destdir'])
+ @permittedKwargs({'skip_if_destdir'})
def add_install_script_method(self, args: 'T.Tuple[T.Union[str, mesonlib.File, ExecutableHolder], T.Union[str, mesonlib.File, CustomTargetHolder, CustomTargetIndexHolder, ConfigureFileHolder], ...]', kwargs):
if len(args) < 1:
raise InterpreterException('add_install_script takes one or more arguments')
if isinstance(args[0], mesonlib.File):
FeatureNew.single_use('Passing file object to script parameter of add_install_script',
'0.57.0', self.interpreter.subproject)
+ skip_if_destdir = kwargs.get('skip_if_destdir', False)
+ if not isinstance(skip_if_destdir, bool):
+ raise InterpreterException('skip_if_destdir keyword argument must be boolean')
script_args = self._process_script_args('add_install_script', args[1:], allow_built=True)
script = self._find_source_script(args[0], script_args)
+ script.skip_if_destdir = skip_if_destdir
self.build.install_scripts.append(script)
@permittedKwargs(set())
diff --git a/mesonbuild/minstall.py b/mesonbuild/minstall.py
index db08dfe..18dca8b 100644
--- a/mesonbuild/minstall.py
+++ b/mesonbuild/minstall.py
@@ -429,7 +429,7 @@ class Installer:
self.install_man(d, dm, destdir, fullprefix)
self.install_data(d, dm, destdir, fullprefix)
restore_selinux_contexts()
- self.run_install_script(d, fullprefix)
+ self.run_install_script(d, destdir, fullprefix)
if not self.did_install_something:
self.log('Nothing to install.')
if not self.options.quiet and self.preserved_file_count > 0:
@@ -483,7 +483,7 @@ class Installer:
self.did_install_something = True
set_mode(outfilename, install_mode, d.install_umask)
- def run_install_script(self, d: InstallData, fullprefix: str) -> None:
+ def run_install_script(self, d: InstallData, destdir: str, fullprefix: str) -> None:
env = {'MESON_SOURCE_ROOT': d.source_dir,
'MESON_BUILD_ROOT': d.build_dir,
'MESON_INSTALL_PREFIX': d.prefix,
@@ -494,8 +494,11 @@ class Installer:
env['MESON_INSTALL_QUIET'] = '1'
for i in d.install_scripts:
- self.did_install_something = True # Custom script must report itself if it does nothing.
name = ' '.join(i.cmd_args)
+ if i.skip_if_destdir and destdir:
+ self.log('Skipping custom install script because DESTDIR is set {!r}'.format(name))
+ continue
+ self.did_install_something = True # Custom script must report itself if it does nothing.
self.log('Running custom install script {!r}'.format(name))
try:
rc = run_exe(i, env)