gnu: racket: Patch dynamically loaded libraries with absolute paths.

* gnu/packages/scheme.scm (racket)[arguments]: Patch 'ffi-lib' calls to
absolute paths in 'pre-configure' phase.  Remove 'wrap-programs' phase.
This commit is contained in:
宋文武 2016-07-19 20:57:51 +08:00
parent 8d63dddac1
commit e8c6811bf1
No known key found for this signature in database
GPG Key ID: 26525665AE727D37
1 changed files with 67 additions and 40 deletions

View File

@ -408,46 +408,73 @@ implementation techniques and as an expository tool.")
(build-system gnu-build-system)
(arguments
'(#:phases
(let* ((gui-libs
(lambda (inputs)
(define (lib input)
(string-append (assoc-ref inputs input) "/lib"))
(list (lib "glib")
(lib "cairo")
(lib "pango")
(lib "libjpeg")
(lib "gtk")
(lib "gdk-pixbuf")
(lib "fontconfig")
(lib "sqlite"))))) ;to build the doc
(alist-cons-before
'configure 'pre-configure
(lambda* (#:key inputs #:allow-other-keys)
(chdir "src")
;; The GUI libs are dynamically opened through the FFI, so they
;; must be in the loader's search path.
(setenv "LD_LIBRARY_PATH" (string-join (gui-libs inputs) ":")))
(alist-cons-after
'unpack 'patch-/bin/sh
(lambda _
(substitute* "collects/racket/system.rkt"
(("/bin/sh") (which "sh"))))
(alist-cons-after
'install 'wrap-programs
(lambda* (#:key inputs outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out")))
(define (wrap prog)
(wrap-program prog
`("LD_LIBRARY_PATH" ":" prefix
,(gui-libs inputs))))
(with-directory-excursion (string-append out "/bin")
(for-each wrap
(list "gracket" "drracket" "slideshow" "mred"))
#t)))
%standard-phases))))
(alist-cons-before
'configure 'pre-configure
(lambda* (#:key inputs #:allow-other-keys)
;; Patch dynamically loaded libraries with their absolute paths.
(let* ((library-path (search-path-as-string->list
(getenv "LIBRARY_PATH")))
(find-so (lambda (soname)
(search-path
library-path
(format #f "~a.so" soname))))
(patch-ffi-libs (lambda (file libs)
(for-each
(lambda (lib)
(substitute* file
(((format #f "\"~a\"" lib))
(format #f "\"~a\"" (find-so lib)))))
libs))))
(substitute* "collects/db/private/sqlite3/ffi.rkt"
(("ffi-lib sqlite-so")
(format #f "ffi-lib \"~a\"" (find-so "libsqlite3"))))
(substitute* "collects/openssl/libssl.rkt"
(("ffi-lib libssl-so")
(format #f "ffi-lib \"~a\"" (find-so "libssl"))))
(substitute* "collects/openssl/libcrypto.rkt"
(("ffi-lib libcrypto-so")
(format #f "ffi-lib \"~a\"" (find-so "libcrypto"))))
(substitute* "share/pkgs/math-lib/math/private/bigfloat/gmp.rkt"
(("ffi-lib libgmp-so")
(format #f "ffi-lib \"~a\"" (find-so "libgmp"))))
(substitute* "share/pkgs/math-lib/math/private/bigfloat/mpfr.rkt"
(("ffi-lib libmpfr-so")
(format #f "ffi-lib \"~a\"" (find-so "libmpfr"))))
(for-each
(lambda (x) (apply patch-ffi-libs x))
'(("share/pkgs/draw-lib/racket/draw/unsafe/cairo-lib.rkt"
("libfontconfig" "libcairo"))
("share/pkgs/draw-lib/racket/draw/unsafe/glib.rkt"
("libglib-2.0" "libgmodule-2.0" "libgobject-2.0"))
("share/pkgs/draw-lib/racket/draw/unsafe/jpeg.rkt"
("libjpeg"))
("share/pkgs/draw-lib/racket/draw/unsafe/pango.rkt"
("libpango-1.0" "libpangocairo-1.0"))
("share/pkgs/draw-lib/racket/draw/unsafe/png.rkt"
("libpng"))
("share/pkgs/db-lib/db/private/odbc/ffi.rkt"
("libodbc"))
("share/pkgs/gui-lib/mred/private/wx/gtk/x11.rkt"
("libX11"))
("share/pkgs/gui-lib/mred/private/wx/gtk/gsettings.rkt"
("libgio-2.0"))
("share/pkgs/gui-lib/mred/private/wx/gtk/gtk3.rkt"
("libgdk-3" "libgtk-3"))
("share/pkgs/gui-lib/mred/private/wx/gtk/unique.rkt"
("libunique-1.0"))
("share/pkgs/gui-lib/mred/private/wx/gtk/utils.rkt"
("libgdk-x11-2.0" "libgdk_pixbuf-2.0" "libgtk-x11-2.0"))
("share/pkgs/gui-lib/mred/private/wx/gtk/gl-context.rkt"
("libGL"))
("share/pkgs/sgl/gl.rkt"
("libGL" "libGLU")))))
(chdir "src"))
(alist-cons-after
'unpack 'patch-/bin/sh
(lambda _
(substitute* "collects/racket/system.rkt"
(("/bin/sh") (which "sh"))))
%standard-phases))
#:tests? #f ; XXX: how to run them?
))
(inputs `(("libffi" ,libffi)