diff options
author | Ludovic Courtès <ludo@gnu.org> | 2013-05-08 23:24:05 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2013-05-08 23:45:02 +0200 |
commit | 3309e3a103d7dfe62364346977e139e3519eb580 (patch) | |
tree | 3702f9843c0ce866f91c6996b7d8cc96a1e88c15 /guix/build | |
parent | e789d9a80bd2758012743d56a53e98746201ac9a (diff) | |
download | gnu-guix-3309e3a103d7dfe62364346977e139e3519eb580.tar gnu-guix-3309e3a103d7dfe62364346977e139e3519eb580.tar.gz |
Add (guix build rpath).
* guix/build/rpath.scm: New file.
* Makefile.am (MODULES): Add it.
* gnu/packages/python.scm (python): Use it; remove local copy of
the *rpath* procedures.
* gnu/packages/samba.scm (samba): Likewise.
Diffstat (limited to 'guix/build')
-rw-r--r-- | guix/build/rpath.scm | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/guix/build/rpath.scm b/guix/build/rpath.scm new file mode 100644 index 0000000000..75a1fef5ef --- /dev/null +++ b/guix/build/rpath.scm @@ -0,0 +1,59 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (guix build rpath) + #:use-module (ice-9 popen) + #:use-module (ice-9 rdelim) + #:export (%patchelf + file-rpath + augment-rpath)) + +;;; Commentary: +;;; +;;; Tools to manipulate the RPATH and RUNPATH of ELF binaries. Currently they +;;; rely on PatchELF. +;;; +;;; Code: + +(define %patchelf + ;; The `patchelf' command. + (make-parameter "patchelf")) + +(define %not-colon + (char-set-complement (char-set #\:))) + +(define (file-rpath file) + "Return the RPATH (or RUNPATH) of FILE as a list of directory names, or #f +on failure." + (let* ((p (open-pipe* OPEN_READ (%patchelf) "--print-rpath" file)) + (l (read-line p))) + (and (zero? (close-pipe p)) + (string-tokenize l %not-colon)))) + +(define (augment-rpath file dir) + "Add DIR to the front of the RPATH and RUNPATH of FILE. Return the new +RPATH as a list, or #f on failure." + (let* ((rpath (or (file-rpath file) '())) + (rpath* (cons dir rpath))) + (format #t "~a: changing RPATH from ~s to ~s~%" + file rpath rpath*) + (and (zero? (system* (%patchelf) "--set-rpath" + (string-join rpath* ":") file)) + rpath*))) + +;;; rpath.scm ends here |