(use-modules ((guix licenses) #:prefix license:) (guix packages) (guix download) (guix git-download) (guix build-system ruby) (guix build-system trivial) (guix utils) (gnu packages bash) (gnu packages ruby) (ice-9 rdelim) (ice-9 popen)) (define ruby-ast-2.4.2-bootstrap (package (inherit ruby-ast) (version "2.4.2") (source (origin (method url-fetch) (uri (rubygems-uri "ast" version)) (sha256 (base32 "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y")))) (arguments `(#:tests? #f)))) (define ruby-ast-2.4.2 (package (inherit ruby-ast-2.4.2-bootstrap) (arguments `(#:tests? #f ,@(substitute-keyword-arguments (package-arguments ruby-ast) ((#:phases phases) `(modify-phases ,phases (add-after 'unpack 'rld (lambda _ (apply invoke "rld" "-ip." (find-files "." "\\.(rb|ru)$")))) (delete 'remove-coveralls-requirement) (delete 'remove-unnecessary-requirements)))))) (native-inputs `(("rld" ,rld-bootstrap) ,@(package-native-inputs ruby-ast))))) (define ruby-parser-with-rld ((package-input-rewriting `((,ruby-ast . ,ruby-ast-2.4.2))) (package (inherit ruby-parser) (arguments `(#:tests? #f #:phases (modify-phases %standard-phases (add-after 'unpack 'rld (lambda* (#:key inputs #:allow-other-keys) (apply invoke ; We can't use the wrapped bootstrap rld or it sets a GEM_PATH for a different ast gem (string-append (assoc-ref inputs "ruby2.7") "/bin/ruby") "-Ilib" (string-append (assoc-ref inputs "rld") "/bin/.rld-real") "-ip." ; gauntlet_parser can only be used if gauntlet is present, but we ; don't want to require it, so do not link to it (delete "./lib/gauntlet_parser.rb" (find-files "." "\\.(rb|ru)$")))))))) (native-inputs `(("rld" ,rld-bootstrap) ("ruby2.7" ,ruby-2.7) ,@(package-native-inputs ruby-parser)))))) ;;;; (define %source-dir (dirname (current-filename))) (define %git-dir (string-append %source-dir "/.git")) (define %module (current-module)) ; Bake a template by eval'ing the leaves (define (bake tmpl) (cons (car tmpl) (map (lambda (x) (list (car x) (eval (cadr x) %module))) (cdr tmpl)))) (define rld-template '(package (name "rld") (version (read-line (open-pipe* OPEN_READ "git" "--git-dir" %git-dir "describe" "--always" "--dirty"))) (source `(origin (method git-fetch) (uri (git-reference (recursive? #t) (url "https://git.singpolyma.net/rld") (commit ,(read-line (open-pipe* OPEN_READ "git" "--git-dir" %git-dir "rev-parse" "HEAD"))))) (file-name (git-file-name name version)) (sha256 (base32 ,(read-line (open-pipe* OPEN_READ "guix" "hash" "-rx" %source-dir)))))) (build-system 'trivial-build-system) (arguments '`(#:modules ((guix build utils)) #:builder (let* ((bindir (string-append (assoc-ref %outputs "out") "/bin")) (outbin (string-append bindir "/rld"))) (use-modules (guix build utils)) (mkdir-p bindir) (set-path-environment-variable "PATH" '("bin") (list (assoc-ref %build-inputs "ruby")) #:separator ":") (set-path-environment-variable "GEM_PATH" '("lib/ruby/vendor_ruby") (list (assoc-ref %build-inputs "ruby-parser") (assoc-ref %build-inputs "ruby-ast")) #:separator ":") (chdir (assoc-ref %build-inputs "source")) (invoke "ruby" "bin/rld" "-p." "-o" outbin "bin/rld") (patch-shebang outbin) (chmod outbin #o755)))) (inputs '`(("ruby" ,ruby-2.7) ("ruby-parser" ,ruby-parser-with-rld))) (synopsis "Linker for Ruby") (description "") (home-page "https://git.singpolyma.net/rld") (license 'license:agpl3))) (define rld-bootstrap (package (inherit (eval (bake rld-template) %module)) (version "bootstrap-be3900") (source (origin (method git-fetch) (uri (git-reference (recursive? #t) (url "https://git.singpolyma.net/rld") (commit "be390053302623e569164b2eaf5297fabd0bcd47"))) (file-name (git-file-name "rld" "be3900")) (sha256 (base32 "06878bywadm57l5w2sni40gmrwv87d2i4fj5c2axp0vsqvsz3q38")))) (inputs `(("bash" ,bash-minimal) ("ruby" ,ruby-2.7) ("ruby-parser" ,((package-input-rewriting `((,ruby-ast . ,ruby-ast-2.4.2-bootstrap))) ruby-parser)))) (arguments '(#:modules ((guix build utils)) #:builder (let* ((bindir (string-append (assoc-ref %outputs "out") "/bin")) (outbin (string-append bindir "/rld"))) (use-modules (guix build utils)) (set-path-environment-variable "PATH" '("bin") (list (assoc-ref %build-inputs "ruby") (assoc-ref %build-inputs "bash")) #:separator ":") (set-path-environment-variable "GEM_PATH" '("lib/ruby/vendor_ruby") (list (assoc-ref %build-inputs "ruby-parser") (assoc-ref %build-inputs "ruby-ast")) #:separator ":") (chdir (assoc-ref %build-inputs "source")) (install-file "bin/rld" bindir) (patch-shebang outbin) (wrap-program outbin `("GEM_PATH" ":" prefix (,(getenv "GEM_PATH"))))))))) (eval (bake rld-template) %module)