packages: Build tarballs in sorted order even if tar doesn't support it.

This is a followup to commit 92226a470d.

* guix/packages.scm (patch-and-repack)[build]: Determine if tar supports the
  "--sort=name" option using a run-time test.  If not supported, generate the
  sorted file list with 'find-files' and pass it to tar using "--files-from".
This commit is contained in:
Mark H Weaver 2015-09-06 12:26:55 -04:00
parent f4ae827e26
commit 140b4bc6cd
1 changed files with 26 additions and 7 deletions

View File

@ -425,6 +425,13 @@ IMPORTED-MODULES specify modules to use/import for use by SNIPPET."
(srfi srfi-1)
(guix build utils))
;; The --sort option was added to GNU tar in version 1.28, released
;; 2014-07-28. During bootstrap we must cope with older versions.
(define tar-supports-sort?
(zero? (system* (string-append #+tar "/bin/tar")
"cf" "/dev/null" "--files-from=/dev/null"
"--sort=name")))
(define (apply-patch patch)
(format (current-error-port) "applying '~a'...~%" patch)
@ -484,13 +491,25 @@ IMPORTED-MODULES specify modules to use/import for use by SNIPPET."
#~())
(begin (chdir "..") #t)
(zero? (system* (string-append #+tar "/bin/tar")
"cvfa" #$output directory
;; avoid non-determinism in the archive
"--sort=name"
"--mtime=@0"
"--owner=root:0"
"--group=root:0")))))))
(unless tar-supports-sort?
(call-with-output-file ".file_list"
(lambda (port)
(for-each (lambda (name) (format port "~a~%" name))
(find-files directory
#:directories? #t
#:fail-on-error? #t)))))
(zero? (apply system* (string-append #+tar "/bin/tar")
"cvfa" #$output
;; avoid non-determinism in the archive
"--mtime=@0"
"--owner=root:0"
"--group=root:0"
(if tar-supports-sort?
`("--sort=name"
,directory)
'("--no-recursion"
"--files-from=.file_list")))))))))
(let ((name (tarxz-name original-file-name))
(modules (delete-duplicates (cons '(guix build utils) modules))))