[pacman-dev] [PATCH] meson: add a wrapper to bootstrap scripts from within build dir

Dave Reisner dreisner at archlinux.org
Mon Oct 29 06:01:40 UTC 2018


This doesn't do quite as good of a job of "hiding away" the real script
as we did with autotools, but it satisfies the need for being able to
run scripts which depend on libmakepkg with the local copy within the
repo. We do, however, improve upon the autotools script by ensuring that
the bash path used in configuring pacman is the interpreter used to run
the underlying script.
---
Naturally, this applies on top of my previous meson patch.

 build-aux/meson-install-script.sh |  6 ++++++
 build-aux/script-wrapper.sh.in    |  6 ++++++
 meson.build                       |  1 +
 scripts/meson.build               | 33 +++++++++++++++++++++++++++----
 4 files changed, 42 insertions(+), 4 deletions(-)
 create mode 100644 build-aux/meson-install-script.sh
 create mode 100755 build-aux/script-wrapper.sh.in

diff --git a/build-aux/meson-install-script.sh b/build-aux/meson-install-script.sh
new file mode 100644
index 00000000..f5a42fca
--- /dev/null
+++ b/build-aux/meson-install-script.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+built_script=$1
+dest_path=$2
+
+install -Dm755 "$built_script" "$DESTDIR/$dest_path"
diff --git a/build-aux/script-wrapper.sh.in b/build-aux/script-wrapper.sh.in
new file mode 100755
index 00000000..f87ae6f0
--- /dev/null
+++ b/build-aux/script-wrapper.sh.in
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+# This script serves as a trampoline for running scripts which depend on
+# libmakepkg with the libmakepkg within the build tree.
+
+LIBRARY=@BUILDDIR@/libmakepkg exec @BASH@ -$- @REAL_PROGPATH@ "$@"
diff --git a/meson.build b/meson.build
index d81c86b7..1ec63a56 100644
--- a/meson.build
+++ b/meson.build
@@ -33,6 +33,7 @@ SED = find_program('sed')
 DU = find_program('du')
 LDCONFIG = get_option('ldconfig')
 MESON_MAKE_SYMLINK = join_paths(meson.source_root(), 'build-aux/meson-make-symlink.sh')
+MESON_INSTALL_SCRIPT = join_paths(meson.source_root(), 'build-aux/meson-install-script.sh')
 
 BASH = find_program('bash4', 'bash')
 if BASH.found()
diff --git a/scripts/meson.build b/scripts/meson.build
index 1fe3fb78..535eccba 100644
--- a/scripts/meson.build
+++ b/scripts/meson.build
@@ -24,14 +24,39 @@ m4_edit = generator(
   capture : true)
 
 foreach script : scripts
-  custom_target(
+  script_shortname = script.split('.')[0]
+
+  # Build the script, but don't install it. We want to keep it as a "private"
+  # artifact that we reference from a wrapper script in order to bootstrap it
+  # the build directory.
+  internal_script = custom_target(
     script,
     input : m4_edit.process(script),
     command : [ SCRIPT_EDITOR, '@INPUT@', '@OUTPUT@', '0755'],
-    output : script.split('.')[0],
+    output : script,
     depend_files : library_files,
-    install : true,
-    install_dir : get_option('bindir'))
+    build_by_default : true)
+
+  # Create a wrapper script that bootstraps the real script within the build
+  # directory.
+  custom_target(
+    'wrap_ at 0@'.format(script_shortname),
+    input : join_paths(meson.source_root(), 'build-aux', 'script-wrapper.sh.in'),
+    output : script_shortname,
+    build_by_default : true,
+    command : [
+      SED,
+      '-e', 's, at BASH@,"@0@",'.format(BASH.path()),
+      '-e', 's, at BUILDDIR@,"@0@",'.format(meson.current_build_dir()),
+      '-e', 's, at REAL_PROGPATH@,"@0@",'.format(internal_script.full_path()),
+      '@INPUT@',
+    ],
+    capture : true)
+
+  # Install the real script
+  meson.add_install_script(MESON_INSTALL_SCRIPT,
+                           internal_script.full_path(),
+                           join_paths(BINDIR, script_shortname))
 endforeach
 
 foreach symlink : ['repo-remove', 'repo-elephant']
-- 
2.19.1


More information about the pacman-dev mailing list