From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nikita Karetnikov Subject: [PATCH] utils: Add 'wrap-program'. (was: Toward 0.2) Date: Sun, 03 Mar 2013 16:52:05 +0400 Message-ID: <87sj4ck5my.fsf_-_@karetnikov.org> References: <877gm7f01v.fsf@gnu.org> <87obfigz7g.fsf@karetnikov.org> <87y5el6hph.fsf@gnu.org> <87fw0rom1n.fsf@karetnikov.org> <87ehgbql5w.fsf@gnu.org> <87hal5ftyu.fsf@karetnikov.org> <874nh4ju7b.fsf@gnu.org> <87hakzwdzu.fsf@karetnikov.org> <87wqtu3n0z.fsf@gnu.org> <87ehg0rwfd.fsf@karetnikov.org> <87bob38ord.fsf@gnu.org> <87sj4f6u39.fsf@karetnikov.org> <87hakv6ndr.fsf@gnu.org> <87mwula74u.fsf@karetnikov.org> <87ehfx32wi.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" Return-path: Received: from eggs.gnu.org ([208.118.235.92]:51929) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UC8N6-00025D-04 for bug-guix@gnu.org; Sun, 03 Mar 2013 07:50:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UC8N2-00029H-ML for bug-guix@gnu.org; Sun, 03 Mar 2013 07:50:31 -0500 In-Reply-To: <87ehfx32wi.fsf@gnu.org> ("Ludovic =?utf-8?Q?Court=C3=A8s=22'?= =?utf-8?Q?s?= message of "Sat, 02 Mar 2013 22:30:53 +0100") 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: Ludovic =?utf-8?Q?Court=C3=A8s?= Cc: bug-guix@gnu.org --==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable > I wouldn=E2=80=99t bother, though, because it will be used in contexts wh= ere > there=E2=80=99s no risk of =E2=80=98prog=E2=80=99 being used while we=E2= =80=99re fiddling with it > (single-threaded, after =E2=80=98make install=E2=80=99). Better safe than sorry. So I added '.PROG-tmp'. > Can you just expound the docstring before pushing? Is it OK? Can I push? --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename=0001-utils-Add-wrap-program.patch Content-Transfer-Encoding: quoted-printable From=200ffa1b39556c9f7b0b18a864080df2d18651ed1e Mon Sep 17 00:00:00 2001 From: Nikita Karetnikov Date: Sun, 3 Mar 2013 12:40:49 +0000 Subject: [PATCH] utils: Add 'wrap-program'. * guix/build/utils.scm (wrap-program): New procedure. =2D-- guix/build/utils.scm | 68 ++++++++++++++++++++++++++++++++++++++++++++++= +++- 1 files changed, 67 insertions(+), 1 deletions(-) diff --git a/guix/build/utils.scm b/guix/build/utils.scm index 6921e31..3395f02 100644 =2D-- a/guix/build/utils.scm +++ b/guix/build/utils.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright =C2=A9 2012, 2013 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2013 Nikita Karetnikov ;;; ;;; This file is part of GNU Guix. ;;; @@ -49,7 +50,8 @@ patch-shebang patch-makefile-SHELL fold-port-matches =2D remove-store-references)) + remove-store-references + wrap-program)) =20 ;;; @@ -605,6 +607,70 @@ known as `nuke-refs' in Nixpkgs." (put-u8 out (char->integer char)) result)))))) =20 +(define* (wrap-program prog #:rest vars) + "Rename PROG to .PROG-real and make PROG a wrapper. VARS should look li= ke +this: + + '(VARIABLE DELIMITER POSITION LIST-OF-DIRECTORIES) + +where DELIMITER is optional. ':' will be used if DELIMITER is not given. + +For example, this command: + + (wrap-program \"foo\" + '(\"PATH\" \":\" =3D (\"/nix/.../bar/bin\")) + '(\"CERT_PATH\" suffix (\"/nix/.../baz/certs\" + \"/qux/certs\"))) + +will copy 'foo' to '.foo-real' and create the file 'foo' with the following +contents: + + #!location/of/bin/bash + export PATH=3D\"/nix/.../bar/bin\" + export CERT_PATH=3D\"$CERT_PATH${CERT_PATH:+:}/nix/.../baz/certs:/qux/ce= rts\" + exec location/of/.foo-real + +This is useful for scripts that expect particular programs to be in $PATH,= for +programs that expect particular shared libraries to be in $LD_LIBRARY_PATH= , or +modules in $GUILE_LOAD_PATH, etc." + (let ((prog-real (string-append "." prog "-real")) + (prog-tmp (string-append "." prog "-tmp"))) + (define (export-variable lst) + ;; Return a string that exports an environment variable. + (match lst + ((var sep '=3D rest) + (format #f "export ~a=3D\"~a\"" + var (string-join rest sep))) + ((var sep 'prefix rest) + (format #f "export ~a=3D\"~a${~a~a+~a}$~a\"" + var (string-join rest sep) var sep sep var)) + ((var sep 'suffix rest) + (format #f "export ~a=3D\"$~a${~a~a+~a}~a\"" + var var var sep sep (string-join rest sep))) + ((var '=3D rest) + (format #f "export ~a=3D\"~a\"" + var (string-join rest ":"))) + ((var 'prefix rest) + (format #f "export ~a=3D\"~a${~a:+:}$~a\"" + var (string-join rest ":") var var)) + ((var 'suffix rest) + (format #f "export ~a=3D\"$~a${~a:+:}~a\"" + var var var (string-join rest ":"))))) + + (copy-file prog prog-real) + + (with-output-to-file prog-tmp + (lambda () + (format #t + "#!~a~%~a~%exec ~a~%" + (which "bash") + (string-join (map export-variable vars) + "\n") + (canonicalize-path prog-real)))) + + (chmod prog-tmp #o755) + (rename-file prog-tmp prog))) + ;;; Local Variables: ;;; eval: (put 'call-with-output-file/atomic 'scheme-indent-function 1) ;;; eval: (put 'with-throw-handler 'scheme-indent-function 1) =2D-=20 1.7.5.4 --=-=-=-- --==-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQIcBAEBAgAGBQJRM0d6AAoJEM+IQzI9IQ38zJkQAJiHUOvqACeNF1mZG90n1+1U LIaY5EJRJ0DXuEPeWePdXkTM/ZBTJa/bfl6oYOn/BXeERQWeZq23diseTc3IxuFv H0rJODMeY3QaVgrO9rfqz4+0v8reE5I4tcnjAiYpgiOSp1hVkQqNSByFr4QtM7gV LIkldDnV6R/YLRpClWV5K3tJk5M0xQEUqtdyEFgW73IITu9398kmOJhHPR5cxJ6O Q8cpKeKxq/cOCxK3R710G6y70GZEdmKp+0eNJhIhxOmDtLokl6AfbjOVvF2wYfy7 qpKBjXDyXdIAaeBgSPQq4KuWROOBuxsR8RsQJky/degpLiGCJ6+W2UJ0+UeS8ji2 goH9REjzCVzWjJShzCrOdccO1ZAr7t5/I/V1CfMiAc4EjxxmzWjsUWinOsN6q8zh ax04QQfWKNaNoGR+8p11s3K72wcMDLgukRKe8Y+dW8uiLElMDHT+sTijTzKUvTbr PT9xqIv+Voj4ogMLSfsKiia5pBQvl8SD+padJh1nFnQf1C4u0oFVnwTnoZmTAi1y cuvjv/HEdUrnzoK7KaZmVm7NjVIvNMhjUICTvV2s2nlhGn4fHBH93gc35Pa0FCRi Yr9vyw8KltOGlAciusuH3IeRuHqsdDPaIMmBx5wil6maB36sUOVVqflVm+qQfsPS Q8jtr/afrNIFhM5nQer/ =k4Gh -----END PGP SIGNATURE----- --==-=-=--