;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013, 2015 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (guix build perl-build-system) #:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module (guix build utils) #:use-module (ice-9 ftw) #:use-module (ice-9 match) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (%standard-phases perl-build)) ;; Commentary: ;; ;; Builder-side code of the standard Perl package build procedure. ;; ;; Code: (define* (configure #:key outputs make-maker? (make-maker-flags '()) (module-build-flags '()) #:allow-other-keys) "Configure the given Perl package." (let* ((out (assoc-ref outputs "out")) (args (cond ;; Prefer to use Module::Build unless otherwise told ((and (file-exists? "Build.PL") (not make-maker?)) `("Build.PL" ,(string-append "--prefix=" out) "--installdirs=site" ,@module-build-flags)) ((file-exists? "Makefile.PL") `("Makefile.PL" ,(string-append "PREFIX=" out) "INSTALLDIRS=site" ,@make-maker-flags)) (else (error "no Build.PL or Makefile.PL found"))))) (format #t "running `perl' with arguments ~s~%" args) (zero? (apply system* "perl" args)))) (define-syntax-rule (define-w/gnu-fallback* (name args ...) body ...) (define* (name args ... #:rest rest) (if (access? "Build" X_OK) (begin body ...) (apply (assoc-ref gnu:%standard-phases 'name) rest)))) (define-w/gnu-fallback* (build) (zero? (system* "./Build"))) (define-w/gnu-fallback* (check #:key target (tests? (not target)) (test-flags '()) #:allow-other-keys) (if tests? (zero? (apply system* "./Build" "test" test-flags)) (begin (format #t "test suite not run~%") #t))) (define-w/gnu-fallback* (install) (zero? (system* "./Build" "install"))) (define* (wrap #:key inputs outputs #:allow-other-keys) (define (list-of-files dir) (map (cut string-append dir "/" <>) (or (scandir dir (lambda (f) (let ((s (stat (string-append dir "/" f)))) (eq? 'regular (stat:type s))))) '()))) (define bindirs (append-map (match-lambda ((_ . dir) (list (string-append dir "/bin") (string-append dir "/sbin")))) outputs)) (let* ((out (assoc-ref outputs "out")) (var `("PERL5LIB" prefix ,(search-path-as-string->list (or (getenv "PERL5LIB") ""))))) (for-each (lambda (dir) (let ((files (list-of-files dir))) (for-each (cut wrap-program <> var) files))) bindirs))) (define %standard-phases ;; Everything is as with the GNU Build System except for the `configure', ;; `build', `check', and `install' phases. (modify-phases gnu:%standard-phases (replace 'install install) (replace 'check check) (replace 'build build) (add-after 'install 'wrap wrap) (replace 'configure configure))) (define* (perl-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) "Build the given Perl package, applying all of PHASES in order." (apply gnu:gnu-build #:inputs inputs #:phases phases args)) ;;; perl-build-system.scm ends here