From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark H Weaver Subject: Re: [PATCH] Improve shell script headers and pre-inst-env handling Date: Mon, 11 Feb 2013 21:24:43 -0500 Message-ID: <87d2w6z2tw.fsf@tines.lan> References: <87haliz4nt.fsf@tines.lan> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([208.118.235.92]:41730) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U55ef-0001xB-Q7 for bug-guix@gnu.org; Mon, 11 Feb 2013 21:31:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U55ec-0003lW-KO for bug-guix@gnu.org; Mon, 11 Feb 2013 21:31:33 -0500 Received: from world.peace.net ([96.39.62.75]:43792) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U55YM-0002E1-Eb for bug-guix@gnu.org; Mon, 11 Feb 2013 21:25:02 -0500 In-Reply-To: <87haliz4nt.fsf@tines.lan> (Mark H. Weaver's message of "Mon, 11 Feb 2013 20:45:10 -0500") List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org To: bug-guix@gnu.org --=-=-= Content-Type: text/plain I wrote: > I've attached two patches. The first arranges to make sure that > 'pre-inst-env' will be rebuilt when 'pre-inst-env.in' is modified. > > The second patch is the main subject of this email. It reworks the > shell script headers at the top of 'guix-package' and the other scripts > to avoid modifying environment variables (which could propagate to > unrelated subprocesses that use libguile), and to avoid prepending > installed directories to the guile load paths in the case where > 'pre-inst-env' is being used. > > My approach here might be controversial, given that the resulting code > is a bit longer, so if you don't like it, no worries :) > > However, I do find it nice to write more scheme and less shell code, and > as a bonus the scheme code at the top is properly handled by emacs and > paredit as if it were in the main body of the file. > > What do you think? And here are the actual patches (oops :) Mark --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Add-noinst_SCRIPTS-pre-inst-env-to-Makefile.am.patch Content-Description: [PATCH 1/2] Add noinst_SCRIPTS = pre-inst-env to Makefile.am >From 172011c586a96cd15e6401cf813fd6d6ea59b355 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Mon, 11 Feb 2013 19:23:20 -0500 Subject: [PATCH 1/2] Add noinst_SCRIPTS = pre-inst-env to Makefile.am. * Makefile.am: Add noinst_SCRIPTS = pre-inst-env. --- Makefile.am | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile.am b/Makefile.am index b90f7e0..9ec7f55 100644 --- a/Makefile.am +++ b/Makefile.am @@ -24,6 +24,9 @@ bin_SCRIPTS = \ guix-package \ guix-gc +noinst_SCRIPTS = \ + pre-inst-env + MODULES = \ guix/base32.scm \ guix/utils.scm \ -- 1.7.10.4 --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: inline; filename=0002-Improve-shell-script-headers-and-pre-inst-env-handli.patch Content-Transfer-Encoding: quoted-printable Content-Description: [PATCH 2/2] Improve shell script headers and pre-inst-env handling >From 4df3f71782256c7a90f9a7445f093a545fcaa1b1 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Mon, 11 Feb 2013 19:13:32 -0500 Subject: [PATCH 2/2] Improve shell script headers and pre-inst-env handling. * pre-inst-env.in: Define $GUIX_UNINSTALLED. * guix-build.in, guix-download.in, guix-gc.in, guix-import.in, guix-package.in: Rewrite shell script headers to adjust '%load-path' and '%load-compiled-path' within Guile itself instead of setting environment variables. Inhibit this behavior if $GUIX_UNINSTALLED is set to a non-em= pty string. --- guix-build.in | 22 ++++++++++++++++------ guix-download.in | 22 ++++++++++++++++------ guix-gc.in | 24 +++++++++++++++++------- guix-import.in | 22 ++++++++++++++++------ guix-package.in | 24 +++++++++++++++++------- pre-inst-env.in | 7 ++++++- 6 files changed, 88 insertions(+), 33 deletions(-) diff --git a/guix-build.in b/guix-build.in index f8c7115..6b79962 100644 --- a/guix-build.in +++ b/guix-build.in @@ -1,15 +1,25 @@ #!/bin/sh # aside from this initial boilerplate, this is actually -*- scheme -*- code =20 +script=3Dguix-build + prefix=3D"@prefix@" datarootdir=3D"@datarootdir@" +moduledir=3D"@guilemoduledir@" =20 -GUILE_LOAD_COMPILED_PATH=3D"@guilemoduledir@:$GUILE_LOAD_COMPILED_PATH" -export GUILE_LOAD_COMPILED_PATH - -main=3D'(module-ref (resolve-interface '\''(guix-build)) '\'guix-build')' -exec ${GUILE-@GUILE@} -L "@guilemoduledir@" -l "$0" \ - -c "(apply $main (cdr (command-line)))" "$@" +start=3D" +(let () + (define (main interp guix-uninstalled-str module-dir script-file . args) + (let* ((guix-uninstalled? (not (string-null? guix-uninstalled-str))) + (path-to-prepend (if guix-uninstalled? '() (list module-dir)))) + (set! %load-path (append path-to-prepend %load-path)) + (set! %load-compiled-path (append path-to-prepend %load-compiled-pat= h)) + (load script-file) + (let (($script (module-ref (resolve-interface '($script)) '$script))) + (apply $script args)))) + (apply main (command-line))) +" +exec "${GUILE-@GUILE@}" -c "$start" "$GUIX_UNINSTALLED" "$moduledir" "$0" = "$@" !# ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2012, 2013 Ludovic Court=C3=A8s diff --git a/guix-download.in b/guix-download.in index ea62b09..f6f226e 100644 --- a/guix-download.in +++ b/guix-download.in @@ -1,15 +1,25 @@ #!/bin/sh # aside from this initial boilerplate, this is actually -*- scheme -*- code =20 +script=3Dguix-download + prefix=3D"@prefix@" datarootdir=3D"@datarootdir@" +moduledir=3D"@guilemoduledir@" =20 -GUILE_LOAD_COMPILED_PATH=3D"@guilemoduledir@:$GUILE_LOAD_COMPILED_PATH" -export GUILE_LOAD_COMPILED_PATH - -main=3D'(module-ref (resolve-interface '\''(guix-download)) '\'guix-downlo= ad')' -exec ${GUILE-@GUILE@} -L "@guilemoduledir@" -l "$0" \ - -c "(apply $main (cdr (command-line)))" "$@" +start=3D" +(let () + (define (main interp guix-uninstalled-str module-dir script-file . args) + (let* ((guix-uninstalled? (not (string-null? guix-uninstalled-str))) + (path-to-prepend (if guix-uninstalled? '() (list module-dir)))) + (set! %load-path (append path-to-prepend %load-path)) + (set! %load-compiled-path (append path-to-prepend %load-compiled-pat= h)) + (load script-file) + (let (($script (module-ref (resolve-interface '($script)) '$script))) + (apply $script args)))) + (apply main (command-line))) +" +exec "${GUILE-@GUILE@}" -c "$start" "$GUIX_UNINSTALLED" "$moduledir" "$0" = "$@" !# ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2012, 2013 Ludovic Court=C3=A8s diff --git a/guix-gc.in b/guix-gc.in index 1a4a541..aa30a5f 100644 --- a/guix-gc.in +++ b/guix-gc.in @@ -1,15 +1,25 @@ #!/bin/sh # aside from this initial boilerplate, this is actually -*- scheme -*- code =20 +script=3Dguix-gc + prefix=3D"@prefix@" datarootdir=3D"@datarootdir@" - -GUILE_LOAD_COMPILED_PATH=3D"@guilemoduledir@:$GUILE_LOAD_COMPILED_PATH" -export GUILE_LOAD_COMPILED_PATH - -main=3D'(module-ref (resolve-interface '\''(guix-gc)) '\'guix-gc')' -exec ${GUILE-@GUILE@} -L "@guilemoduledir@" -l "$0" \ - -c "(apply $main (cdr (command-line)))" "$@" +moduledir=3D"@guilemoduledir@" + +start=3D" +(let () + (define (main interp guix-uninstalled-str module-dir script-file . args) + (let* ((guix-uninstalled? (not (string-null? guix-uninstalled-str))) + (path-to-prepend (if guix-uninstalled? '() (list module-dir)))) + (set! %load-path (append path-to-prepend %load-path)) + (set! %load-compiled-path (append path-to-prepend %load-compiled-pat= h)) + (load script-file) + (let (($script (module-ref (resolve-interface '($script)) '$script))) + (apply $script args)))) + (apply main (command-line))) +" +exec "${GUILE-@GUILE@}" -c "$start" "$GUIX_UNINSTALLED" "$moduledir" "$0" = "$@" !# ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2012, 2013 Ludovic Court=C3=A8s diff --git a/guix-import.in b/guix-import.in index 97619a9..525fa30 100644 --- a/guix-import.in +++ b/guix-import.in @@ -1,15 +1,25 @@ #!/bin/sh # aside from this initial boilerplate, this is actually -*- scheme -*- code =20 +script=3Dguix-import + prefix=3D"@prefix@" datarootdir=3D"@datarootdir@" +moduledir=3D"@guilemoduledir@" =20 -GUILE_LOAD_COMPILED_PATH=3D"@guilemoduledir@:$GUILE_LOAD_COMPILED_PATH" -export GUILE_LOAD_COMPILED_PATH - -main=3D'(module-ref (resolve-interface '\''(guix-import)) '\'guix-import')' -exec ${GUILE-@GUILE@} -L "@guilemoduledir@" -l "$0" \ - -c "(apply $main (cdr (command-line)))" "$@" +start=3D" +(let () + (define (main interp guix-uninstalled-str module-dir script-file . args) + (let* ((guix-uninstalled? (not (string-null? guix-uninstalled-str))) + (path-to-prepend (if guix-uninstalled? '() (list module-dir)))) + (set! %load-path (append path-to-prepend %load-path)) + (set! %load-compiled-path (append path-to-prepend %load-compiled-pat= h)) + (load script-file) + (let (($script (module-ref (resolve-interface '($script)) '$script))) + (apply $script args)))) + (apply main (command-line))) +" +exec "${GUILE-@GUILE@}" -c "$start" "$GUIX_UNINSTALLED" "$moduledir" "$0" = "$@" !# ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2012, 2013 Ludovic Court=C3=A8s diff --git a/guix-package.in b/guix-package.in index ae3d2cd..2082a93 100644 --- a/guix-package.in +++ b/guix-package.in @@ -1,15 +1,25 @@ #!/bin/sh # aside from this initial boilerplate, this is actually -*- scheme -*- code =20 +script=3Dguix-package + prefix=3D"@prefix@" datarootdir=3D"@datarootdir@" - -GUILE_LOAD_COMPILED_PATH=3D"@guilemoduledir@:$GUILE_LOAD_COMPILED_PATH" -export GUILE_LOAD_COMPILED_PATH - -main=3D'(module-ref (resolve-interface '\''(guix-package)) '\'guix-package= ')' -exec ${GUILE-@GUILE@} -L "@guilemoduledir@" -l "$0" \ - -c "(apply $main (cdr (command-line)))" "$@" +moduledir=3D"@guilemoduledir@" + +start=3D" +(let () + (define (main interp guix-uninstalled-str module-dir script-file . args) + (let* ((guix-uninstalled? (not (string-null? guix-uninstalled-str))) + (path-to-prepend (if guix-uninstalled? '() (list module-dir)))) + (set! %load-path (append path-to-prepend %load-path)) + (set! %load-compiled-path (append path-to-prepend %load-compiled-pat= h)) + (load script-file) + (let (($script (module-ref (resolve-interface '($script)) '$script))) + (apply $script args)))) + (apply main (command-line))) +" +exec "${GUILE-@GUILE@}" -c "$start" "$GUIX_UNINSTALLED" "$moduledir" "$0" = "$@" !# ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2012, 2013 Ludovic Court=C3=A8s diff --git a/pre-inst-env.in b/pre-inst-env.in index 1dc63cd..5349c4c 100644 --- a/pre-inst-env.in +++ b/pre-inst-env.in @@ -43,7 +43,12 @@ export NIX_ROOT_FINDER NIX_SETUID_HELPER # auto-compilation. =20 NIX_HASH=3D"@NIX_HASH@" - export NIX_HASH =20 +# Define $GUIX_UNINSTALLED to prevent `guix-package' and other scripts from +# prepending @guilemoduledir@ to the Guile load paths. + +GUIX_UNINSTALLED=3D1 +export GUIX_UNINSTALLED + exec "$@" --=20 1.7.10.4 --=-=-=--