;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 Ricardo Wurmus ;;; ;;; 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 ant-build-system) #:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module (guix build utils) #:use-module (sxml simple) #:use-module (ice-9 match) #:use-module (ice-9 ftw) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:export (%standard-phases ant-build)) ;; Commentary: ;; ;; Builder-side code of the standard build procedure for Java packages using ;; Ant. ;; ;; Code: (define (default-build.xml jar-name prefix) "Create a simple build.xml with standard targets for Ant." (let ((file (open-output-file "build.xml"))) (sxml->xml `(project (@ (basedir ".")) (property (@ (name "classes.dir") (value "${basedir}/build/classes"))) (property (@ (name "jar.dir") (value "${basedir}/build/jar"))) (property (@ (name "dist.dir") (value ,prefix))) ;; respect the CLASSPATH environment variable (property (@ (name "build.sysclasspath") (value "first"))) (property (@ (environment "env"))) (path (@ (id "classpath")) (pathelement (@ (location "${env.CLASSPATH}")))) (target (@ (name "compile")) (mkdir (@ (dir "${classes.dir}"))) (javac (@ (includeantruntime "false") (srcdir "src") (destdir "${classes.dir}") (classpath (@ (refid "classpath")))))) ;; Reset the ctime/mtime on all files to ensure that the ;; jar archive for the same class files is bit-identical. (target (@ (name "touch")) (exec (@ (executable "find")) (arg (@ (line "${classes.dir} -exec touch -d @0 {} ;"))))) (target (@ (name "jar") (depends "compile,touch")) (mkdir (@ (dir "${jar.dir}"))) ;; We cannot use the simpler "jar" task here, because ;; there is no way to disable generation of a ;; manifest. We do not include a generated manifest ;; to ensure determinism, because we cannot easily ;; reset the ctime/mtime before creating the archive. (exec (@ (executable "jar")) (arg (@ (line ,(string-append "-Mcf ${jar.dir}/" jar-name " -C ${classes.dir} .")))))) (target (@ (name "install")) (copy (@ (todir "${dist.dir}")) (fileset (@ (dir "${jar.dir}")) (include (@ (name "**/*.jar"))))))) file) (close-output-port file) (utime "build.xml" 0 0) #t)) (define (generate-classpath inputs) "Return a colon-separated string of full paths to jar files found among the INPUTS." (string-join (apply append (map (match-lambda ((_ . dir) (find-files dir "\\.*jar$"))) inputs)) ":")) (define* (configure #:key inputs outputs (jar-name #f) #:allow-other-keys) (when jar-name (default-build.xml jar-name (string-append (assoc-ref outputs "out") "/share/java"))) (setenv "JAVA_HOME" (assoc-ref inputs "jdk")) (setenv "CLASSPATH" (generate-classpath inputs))) (define* (build #:key (make-flags '()) (build-target "jar") #:allow-other-keys) (zero? (apply system* `("ant" ,build-target ,@make-flags)))) (define* (check #:key target (make-flags '()) (tests? (not target)) (test-target "check") #:allow-other-keys) (if tests? (zero? (apply system* `("ant" ,test-target ,@make-flags))) (begin (format #t "test suite not run~%") #t))) (define* (install #:key (make-flags '()) #:allow-other-keys) (zero? (apply system* `("ant" "install" ,@make-flags)))) (define %standard-phases (modify-phases gnu:%standard-phases (replace 'configure configure) (replace 'build build) (replace 'check check) (replace 'install install))) (define* (ant-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) "Build the given Java package, applying all of PHASES in order." (apply gnu:gnu-build #:inputs inputs #:phases phases args)) ;;; ant-build-system.scm ends here