From 3ca00bb51e3ff906a700b6925e0ce81558c8c469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Fri, 28 Feb 2014 10:42:09 +0100 Subject: [PATCH] packages: Support 'patches' and 'snippets' for sources that are directories. * guix/packages.scm (patch-and-repack)[numeric-extension?, tarxz-name]: New procedures. [builder]: Adjust to deal with SOURCE when it's a directory. : Use 'tarxz-name'. Always add (guix build utils) to IMPORTED-MODULES. --- guix/packages.scm | 67 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/guix/packages.scm b/guix/packages.scm index d345900f79..f2119bebce 100644 --- a/guix/packages.scm +++ b/guix/packages.scm @@ -315,6 +315,20 @@ IMPORTED-MODULES specify modules to use/import for use by SNIPPET." (dash (string-index sans #\-))) (string-drop sans (+ 1 dash)))) + (define (numeric-extension? file-name) + ;; Return true if FILE-NAME ends with digits. + (string-every char-set:hex-digit (file-extension file-name))) + + (define (tarxz-name file-name) + ;; Return a '.tar.xz' file name based on FILE-NAME. + (let ((base (if (numeric-extension? file-name) + original-file-name + (file-sans-extension file-name)))) + (string-append base + (if (equal? (file-extension base) "tar") + ".xz" + ".tar.xz")))) + (define patch-inputs (map (lambda (number patch) (list (string-append "patch" (number->string number)) @@ -327,7 +341,8 @@ IMPORTED-MODULES specify modules to use/import for use by SNIPPET." (define builder `(begin (use-modules (ice-9 ftw) - (srfi srfi-1)) + (srfi srfi-1) + (guix build utils)) (let ((out (assoc-ref %outputs "out")) (xz (assoc-ref %build-inputs "xz")) @@ -342,14 +357,28 @@ IMPORTED-MODULES specify modules to use/import for use by SNIPPET." (format (current-error-port) "applying '~a'...~%" patch*) (zero? (system* patch "--batch" ,@flags "--input" patch*)))) + (define (first-file directory) + ;; Return the name of the first file in DIRECTORY. + (car (scandir directory + (lambda (name) + (not (member name '("." ".."))))))) + (setenv "PATH" (string-append xz "/bin" ":" decomp "/bin")) - (and (zero? (system* tar "xvf" source)) - (let ((directory (car (scandir "." - (lambda (name) - (not - (member name - '("." "..")))))))) + + ;; SOURCE may be either a directory or a tarball. + (and (if (file-is-directory? source) + (let* ((store (or (getenv "NIX_STORE") + "/nix/store")) + (len (+ 1 (string-length store))) + (base (string-drop source len)) + (dash (string-index base #\-)) + (directory (string-drop base (+ 1 dash)))) + (mkdir directory) + (copy-recursively source directory) + #t) + (zero? (system* tar "xvf" source))) + (let ((directory (first-file "."))) (format (current-error-port) "source is under '~a'~%" directory) (chdir directory) @@ -375,23 +404,23 @@ IMPORTED-MODULES specify modules to use/import for use by SNIPPET." (zero? (system* tar "cvfa" out directory)))))))) - (let ((name (string-append (file-sans-extension original-file-name) - ".xz")) - (inputs (filter-map (match-lambda - ((name (? package? p)) - (and (member name (cons decompression-type - '("tar" "xz" "patch"))) - (list name - (package-derivation store p - system))))) - (or inputs (%standard-patch-inputs))))) + (let ((name (tarxz-name original-file-name)) + (inputs (filter-map (match-lambda + ((name (? package? p)) + (and (member name (cons decompression-type + '("tar" "xz" "patch"))) + (list name + (package-derivation store p + system))))) + (or inputs (%standard-patch-inputs)))) + (modules (delete-duplicates (cons '(guix build utils) modules)))) - (build-expression->derivation store name builder + (build-expression->derivation store name builder #:inputs `(("source" ,source) ,@inputs ,@patch-inputs) #:system system - #:modules imported-modules + #:modules modules #:guile-for-build guile-for-build))) (define* (package-source-derivation store source