From edf0a458469574280557420509a0ff2d886bcdf3 Mon Sep 17 00:00:00 2001 From: Ben Woodcroft Date: Wed, 10 Aug 2016 12:23:59 +1000 Subject: guix: ruby-build-system: Build compiled gems reproducibly. * guix/build/ruby-build-system.scm (log-file-deletion): New procedure. (install): Remove files containing non-reproducible elements. Print when each file is deleted. --- guix/build/ruby-build-system.scm | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) (limited to 'guix') diff --git a/guix/build/ruby-build-system.scm b/guix/build/ruby-build-system.scm index 79ac380cb8..95793f77b8 100644 --- a/guix/build/ruby-build-system.scm +++ b/guix/build/ruby-build-system.scm @@ -120,18 +120,44 @@ GEM-FLAGS are passed to the 'gem' invokation, if present." 1)) (out (assoc-ref outputs "out")) (gem-home (string-append out "/lib/ruby/gems/" ruby-version ".0")) - (gem-name (first-matching-file "\\.gem$"))) + (gem-file (first-matching-file "\\.gem$")) + (gem-file-basename (basename gem-file)) + (gem-name (substring gem-file-basename + 0 + (- (string-length gem-file-basename) 4))) + (gem-directory (string-append gem-home "/gems/" gem-name))) (setenv "GEM_HOME" gem-home) (mkdir-p gem-home) - (and (apply system* "gem" "install" gem-name + (and (apply system* "gem" "install" gem-file "--local" "--ignore-dependencies" ;; Executables should go into /bin, not /lib/ruby/gems. "--bindir" (string-append out "/bin") gem-flags) - ;; Remove the cached gem file as this is unnecessary and contains - ;; timestamped files rendering builds not reproducible. - (begin (delete-file (string-append gem-home "/cache/" gem-name)) - #t)))) + (begin + ;; Remove the cached gem file as this is unnecessary and contains + ;; timestamped files rendering builds not reproducible. + (let ((cached-gem (string-append gem-home "/cache/" gem-file))) + (log-file-deletion cached-gem) + (delete-file cached-gem)) + ;; For gems with native extensions, several Makefile-related files + ;; are created that contain timestamps or other elements making + ;; them not reproducible. They are unnecessary so we remove them. + (if (file-exists? (string-append gem-directory "/ext")) + (begin + (for-each (lambda (file) + (log-file-deletion file) + (delete-file file)) + (append + (find-files (string-append gem-home "/doc") + "page-Makefile.ri") + (find-files (string-append gem-home "/extensions") + "gem_make.out") + (find-files (string-append gem-directory "/ext") + "Makefile"))))) + #t)))) + +(define (log-file-deletion file) + (display (string-append "deleting '" file "' for reproducibility\n"))) (define %standard-phases (modify-phases gnu:%standard-phases -- cgit v1.2.3 From 75160d4b9d5735ce3594c30f430fab6c9edbc284 Mon Sep 17 00:00:00 2001 From: Ben Woodcroft Date: Mon, 25 Jul 2016 21:53:35 +1000 Subject: guix: ruby-build-system: Add replace-git-ls-files. * guix/build/ruby-build-system.scm (replace-git-ls-files): New variable. (%standard-phases): Add it. --- guix/build/ruby-build-system.scm | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'guix') diff --git a/guix/build/ruby-build-system.scm b/guix/build/ruby-build-system.scm index 95793f77b8..c2d2766279 100644 --- a/guix/build/ruby-build-system.scm +++ b/guix/build/ruby-build-system.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 David Thompson ;;; Copyright © 2015 Pjotr Prins -;;; Copyright © 2015 Ben Woodcroft +;;; Copyright © 2015, 2016 Ben Woodcroft ;;; ;;; This file is part of GNU Guix. ;;; @@ -69,6 +69,16 @@ directory." (define (first-gemspec) (first-matching-file "\\.gemspec$")) +(define* (replace-git-ls-files #:key source #:allow-other-keys) + "Many gemspec files downloaded from outside rubygems.org use `git ls-files` +to list of the files to be included in the built gem. However, since this +operation is not deterministic, we replace it with `find`." + (when (not (gem-archive? source)) + (let ((gemspec (first-gemspec))) + (substitute* gemspec + (("`git ls-files`") "`find . -type f |sort`")))) + #t) + (define* (extract-gemspec #:key source #:allow-other-keys) "Remove the original gemspec, if present, and replace it with a new one. This avoids issues with upstream gemspecs requiring tools such as git to @@ -162,11 +172,12 @@ GEM-FLAGS are passed to the 'gem' invokation, if present." (define %standard-phases (modify-phases gnu:%standard-phases (delete 'configure) + (replace 'unpack unpack) (add-before 'build 'extract-gemspec extract-gemspec) + (add-after 'extract-gemspec 'replace-git-ls-files replace-git-ls-files) (replace 'build build) - (replace 'unpack unpack) - (replace 'install install) - (replace 'check check))) + (replace 'check check) + (replace 'install install))) (define* (ruby-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) -- cgit v1.2.3