diff options
Diffstat (limited to 'gnu/packages/java.scm')
-rw-r--r-- | gnu/packages/java.scm | 1000 |
1 files changed, 436 insertions, 564 deletions
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm index 1abdf607f5..cf4ba69d6a 100644 --- a/gnu/packages/java.scm +++ b/gnu/packages/java.scm @@ -335,463 +335,6 @@ and is best suited to building Java projects. Ant uses XML to describe the build process and its dependencies, whereas Make uses Makefile format.") (license license:asl2.0))) -(define-public icedtea-6 - (package - (name "icedtea") - (version "1.13.13") - (source (origin - (method url-fetch) - (uri (string-append - "http://icedtea.wildebeest.org/download/source/icedtea6-" - version ".tar.xz")) - (sha256 - (base32 - "0bg9sb4f7qbq77c0zf9m17p47ga0kf0r9622g9p12ysg26jd1ksg")) - (modules '((guix build utils))) - (snippet - '(substitute* "Makefile.in" - ;; link against libgcj to avoid linker error - (("-o native-ecj") - "-lgcj -o native-ecj") - ;; do not leak information about the build host - (("DISTRIBUTION_ID=\"\\$\\(DIST_ID\\)\"") - "DISTRIBUTION_ID=\"\\\"guix\\\"\""))))) - (build-system gnu-build-system) - (outputs '("out" ; Java Runtime Environment - "jdk" ; Java Development Kit - "doc")) ; all documentation - (arguments - `(;; There are many failing tests and many are known to fail upstream. - ;; - ;; * Hotspot VM tests: - ;; FAILED: compiler/7082949/Test7082949.java - ;; FAILED: compiler/7088020/Test7088020.java - ;; FAILED: runtime/6929067/Test6929067.sh - ;; FAILED: serviceability/sa/jmap-hashcode/Test8028623.java - ;; => Test results: passed: 161; failed: 4 - ;; - ;; * langtools tests: - ;; FAILED: com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java - ;; FAILED: tools/javac/6627362/T6627362.java - ;; FAILED: tools/javac/7003595/T7003595.java - ;; FAILED: tools/javac/7024568/T7024568.java - ;; FAILED: tools/javap/4111861/T4111861.java - ;; FAILED: tools/javap/ListTest.java - ;; FAILED: tools/javap/OptionTest.java - ;; FAILED: tools/javap/T4884240.java - ;; FAILED: tools/javap/T4975569.java - ;; --> fails because of insignificant whitespace differences - ;; in output of javap - ;; FAILED: tools/javap/T6868539.java - ;; => Test results: passed: 1,445; failed: 10 - ;; - ;; * JDK tests: - ;; Tests are incomplete because of a segfault after this test: - ;; javax/crypto/spec/RC5ParameterSpec/RC5ParameterSpecEquals.java - ;; A bug report has already been filed upstream: - ;; http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=2188 - ;; - ;; The tests require xvfb-run, a wrapper script around Xvfb, which - ;; has not been packaged yet. Without it many AWT tests fail, so I - ;; made no attempts to make a list of failing JDK tests. At least - ;; 222 tests are failing of which at least 132 are AWT tests. - #:tests? #f - - ;; The DSOs use $ORIGIN to refer to each other, but (guix build - ;; gremlin) doesn't support it yet, so skip this phase. - #:validate-runpath? #f - - #:modules ((guix build utils) - (guix build gnu-build-system) - (ice-9 popen) - (ice-9 rdelim) - (srfi srfi-19)) - - #:configure-flags - (let* ((gcjdir (assoc-ref %build-inputs "gcj")) - (ecj (string-append gcjdir "/share/java/ecj.jar")) - (jdk (string-append gcjdir "/lib/jvm/")) - (gcj (string-append gcjdir "/bin/gcj"))) - `("--enable-bootstrap" - "--enable-nss" - "--without-rhino" - "--disable-downloading" - "--disable-tests" ;they are run in the check phase instead - "--with-openjdk-src-dir=./openjdk.src" - ,(string-append "--with-javac=" jdk "/bin/javac") - ,(string-append "--with-ecj-jar=" ecj) - ,(string-append "--with-gcj=" gcj) - ,(string-append "--with-jdk-home=" jdk) - ,(string-append "--with-java=" jdk "/bin/java"))) - #:phases - (modify-phases %standard-phases - (replace 'unpack - (lambda* (#:key source inputs #:allow-other-keys) - (and (zero? (system* "tar" "xvf" source)) - (begin - (chdir (string-append "icedtea6-" ,version)) - (mkdir "openjdk.src") - (with-directory-excursion "openjdk.src" - (copy-file (assoc-ref inputs "openjdk6-src") - "openjdk6-src.tar.xz") - (zero? (system* "tar" "xvf" "openjdk6-src.tar.xz"))))))) - (add-after 'unpack 'patch-patches - (lambda _ - ;; shebang in patches so that they apply cleanly - (substitute* '("patches/jtreg-jrunscript.patch" - "patches/hotspot/hs23/drop_unlicensed_test.patch") - (("#!/bin/sh") (string-append "#!" (which "sh")))) - #t)) - (add-after 'unpack 'patch-paths - (lambda _ - ;; buildtree.make generates shell scripts, so we need to replace - ;; the generated shebang - (substitute* '("openjdk.src/hotspot/make/linux/makefiles/buildtree.make") - (("/bin/sh") (which "bash"))) - - (let ((corebin (string-append - (assoc-ref %build-inputs "coreutils") "/bin/")) - (binbin (string-append - (assoc-ref %build-inputs "binutils") "/bin/")) - (grepbin (string-append - (assoc-ref %build-inputs "grep") "/bin/"))) - (substitute* '("openjdk.src/jdk/make/common/shared/Defs-linux.gmk" - "openjdk.src/corba/make/common/shared/Defs-linux.gmk") - (("UNIXCOMMAND_PATH = /bin/") - (string-append "UNIXCOMMAND_PATH = " corebin)) - (("USRBIN_PATH = /usr/bin/") - (string-append "USRBIN_PATH = " corebin)) - (("DEVTOOLS_PATH *= */usr/bin/") - (string-append "DEVTOOLS_PATH = " corebin)) - (("COMPILER_PATH *= */usr/bin/") - (string-append "COMPILER_PATH = " - (assoc-ref %build-inputs "gcc") "/bin/")) - (("DEF_OBJCOPY *=.*objcopy") - (string-append "DEF_OBJCOPY = " (which "objcopy")))) - - ;; fix path to alsa header - (substitute* "openjdk.src/jdk/make/common/shared/Sanity.gmk" - (("ALSA_INCLUDE=/usr/include/alsa/version.h") - (string-append "ALSA_INCLUDE=" - (assoc-ref %build-inputs "alsa-lib") - "/include/alsa/version.h"))) - - ;; fix hard-coded utility paths - (substitute* '("openjdk.src/jdk/make/common/shared/Defs-utils.gmk" - "openjdk.src/corba/make/common/shared/Defs-utils.gmk") - (("ECHO *=.*echo") - (string-append "ECHO = " (which "echo"))) - (("^GREP *=.*grep") - (string-append "GREP = " (which "grep"))) - (("EGREP *=.*egrep") - (string-append "EGREP = " (which "egrep"))) - (("CPIO *=.*cpio") - (string-append "CPIO = " (which "cpio"))) - (("READELF *=.*readelf") - (string-append "READELF = " (which "readelf"))) - (("^ *AR *=.*ar") - (string-append "AR = " (which "ar"))) - (("^ *TAR *=.*tar") - (string-append "TAR = " (which "tar"))) - (("AS *=.*as") - (string-append "AS = " (which "as"))) - (("LD *=.*ld") - (string-append "LD = " (which "ld"))) - (("STRIP *=.*strip") - (string-append "STRIP = " (which "strip"))) - (("NM *=.*nm") - (string-append "NM = " (which "nm"))) - (("^SH *=.*sh") - (string-append "SH = " (which "bash"))) - (("^FIND *=.*find") - (string-append "FIND = " (which "find"))) - (("LDD *=.*ldd") - (string-append "LDD = " (which "ldd"))) - (("NAWK *=.*(n|g)awk") - (string-append "NAWK = " (which "gawk"))) - (("XARGS *=.*xargs") - (string-append "XARGS = " (which "xargs"))) - (("UNZIP *=.*unzip") - (string-append "UNZIP = " (which "unzip"))) - (("ZIPEXE *=.*zip") - (string-append "ZIPEXE = " (which "zip"))) - (("SED *=.*sed") - (string-append "SED = " (which "sed")))) - - ;; Some of these timestamps cause problems as they are more than - ;; 10 years ago, failing the build process. - (substitute* - "openjdk.src/jdk/src/share/classes/java/util/CurrencyData.properties" - (("AZ=AZM;2005-12-31-20-00-00;AZN") "AZ=AZN") - (("MZ=MZM;2006-06-30-22-00-00;MZN") "MZ=MZN") - (("RO=ROL;2005-06-30-21-00-00;RON") "RO=RON") - (("TR=TRL;2004-12-31-22-00-00;TRY") "TR=TRY"))))) - (add-before 'configure 'set-additional-paths - (lambda* (#:key inputs #:allow-other-keys) - (let* ((gcjdir (assoc-ref %build-inputs "gcj")) - (gcjlib (string-append gcjdir "/lib")) - ;; Get target-specific include directory so that - ;; libgcj-config.h is found when compiling hotspot. - (gcjinclude (let* ((port (open-input-pipe "gcj -print-file-name=include")) - (str (read-line port))) - (close-pipe port) - str))) - (setenv "CPATH" - (string-append gcjinclude ":" - (assoc-ref %build-inputs "libxrender") - "/include/X11/extensions" ":" - (assoc-ref %build-inputs "libxtst") - "/include/X11/extensions" ":" - (assoc-ref %build-inputs "libxinerama") - "/include/X11/extensions" ":" - (or (getenv "CPATH") ""))) - (setenv "ALT_CUPS_HEADERS_PATH" - (string-append (assoc-ref %build-inputs "cups") - "/include")) - (setenv "ALT_FREETYPE_HEADERS_PATH" - (string-append (assoc-ref %build-inputs "freetype") - "/include")) - (setenv "ALT_FREETYPE_LIB_PATH" - (string-append (assoc-ref %build-inputs "freetype") - "/lib"))))) - (add-before 'check 'fix-test-framework - (lambda _ - ;; Fix PATH in test environment - (substitute* "src/jtreg/com/sun/javatest/regtest/Main.java" - (("PATH=/bin:/usr/bin") - (string-append "PATH=" (getenv "PATH")))) - (substitute* "src/jtreg/com/sun/javatest/util/SysEnv.java" - (("/usr/bin/env") (which "env"))) - #t)) - (add-before 'check 'fix-hotspot-tests - (lambda _ - (with-directory-excursion "openjdk.src/hotspot/test/" - (substitute* "jprt.config" - (("PATH=\"\\$\\{path4sdk\\}\"") - (string-append "PATH=" (getenv "PATH"))) - (("make=/usr/bin/make") - (string-append "make=" (which "make")))) - (substitute* '("runtime/6626217/Test6626217.sh" - "runtime/7110720/Test7110720.sh") - (("/bin/rm") (which "rm")) - (("/bin/cp") (which "cp")) - (("/bin/mv") (which "mv")))) - #t)) - (add-before 'check 'fix-jdk-tests - (lambda _ - (with-directory-excursion "openjdk.src/jdk/test/" - (substitute* "com/sun/jdi/JdbReadTwiceTest.sh" - (("/bin/pwd") (which "pwd"))) - (substitute* "com/sun/jdi/ShellScaffold.sh" - (("/bin/kill") (which "kill"))) - (substitute* "start-Xvfb.sh" - ;;(("/usr/bin/X11/Xvfb") (which "Xvfb")) - (("/usr/bin/nohup") (which "nohup"))) - (substitute* "javax/security/auth/Subject/doAs/Test.sh" - (("/bin/rm") (which "rm"))) - (substitute* "tools/launcher/MultipleJRE.sh" - (("echo \"#!/bin/sh\"") - (string-append "echo \"#!" (which "rm") "\"")) - (("/usr/bin/zip") (which "zip"))) - (substitute* "com/sun/jdi/OnThrowTest.java" - (("#!/bin/sh") (string-append "#!" (which "sh")))) - (substitute* "java/lang/management/OperatingSystemMXBean/GetSystemLoadAverage.java" - (("/usr/bin/uptime") (which "uptime"))) - (substitute* "java/lang/ProcessBuilder/Basic.java" - (("/usr/bin/env") (which "env")) - (("/bin/false") (which "false")) - (("/bin/true") (which "true")) - (("/bin/cp") (which "cp")) - (("/bin/sh") (which "sh"))) - (substitute* "java/lang/ProcessBuilder/FeelingLucky.java" - (("/bin/sh") (which "sh"))) - (substitute* "java/lang/ProcessBuilder/Zombies.java" - (("/usr/bin/perl") (which "perl")) - (("/bin/ps") (which "ps")) - (("/bin/true") (which "true"))) - (substitute* "java/lang/Runtime/exec/ConcurrentRead.java" - (("/usr/bin/tee") (which "tee"))) - (substitute* "java/lang/Runtime/exec/ExecWithDir.java" - (("/bin/true") (which "true"))) - (substitute* "java/lang/Runtime/exec/ExecWithInput.java" - (("/bin/cat") (which "cat"))) - (substitute* "java/lang/Runtime/exec/ExitValue.java" - (("/bin/sh") (which "sh")) - (("/bin/true") (which "true")) - (("/bin/kill") (which "kill"))) - (substitute* "java/lang/Runtime/exec/LotsOfDestroys.java" - (("/usr/bin/echo") (which "echo"))) - (substitute* "java/lang/Runtime/exec/LotsOfOutput.java" - (("/usr/bin/cat") (which "cat"))) - (substitute* "java/lang/Runtime/exec/SleepyCat.java" - (("/bin/cat") (which "cat")) - (("/bin/sleep") (which "sleep")) - (("/bin/sh") (which "sh"))) - (substitute* "java/lang/Runtime/exec/StreamsSurviveDestroy.java" - (("/bin/cat") (which "cat"))) - (substitute* "java/rmi/activation/CommandEnvironment/SetChildEnv.java" - (("/bin/chmod") (which "chmod"))) - (substitute* "java/util/zip/ZipFile/Assortment.java" - (("/bin/sh") (which "sh")))) - #t)) - (replace 'check - (lambda _ - ;; The "make check-*" targets always return zero, so we need to - ;; check for errors in the associated log files to determine - ;; whether any tests have failed. - (use-modules (ice-9 rdelim)) - (let* ((error-pattern (make-regexp "^(Error|FAILED):.*")) - (checker (lambda (port) - (let loop () - (let ((line (read-line port))) - (cond - ((eof-object? line) #t) - ((regexp-exec error-pattern line) #f) - (else (loop))))))) - (run-test (lambda (test) - (system* "make" test) - (call-with-input-file - (string-append "test/" test ".log") - checker)))) - (or #t ; skip tests - (and (run-test "check-hotspot") - (run-test "check-langtools") - (run-test "check-jdk")))))) - (replace 'install - (lambda* (#:key outputs #:allow-other-keys) - (let ((doc (string-append (assoc-ref outputs "doc") - "/share/doc/icedtea")) - (jre (assoc-ref outputs "out")) - (jdk (assoc-ref outputs "jdk"))) - (copy-recursively "openjdk.build/docs" doc) - (copy-recursively "openjdk.build/j2re-image" jre) - (copy-recursively "openjdk.build/j2sdk-image" jdk)))) - ;; By default IcedTea only generates an empty keystore. In order to - ;; be able to use certificates in Java programs we need to generate a - ;; keystore from a set of certificates. For convenience we use the - ;; certificates from the nss-certs package. - (add-after 'install 'install-keystore - (lambda* (#:key inputs outputs #:allow-other-keys) - (let* ((keystore "cacerts") - (certs-dir (string-append (assoc-ref inputs "nss-certs") - "/etc/ssl/certs")) - (keytool (string-append (assoc-ref outputs "jdk") - "/bin/keytool"))) - (define (extract-cert file target) - (call-with-input-file file - (lambda (in) - (call-with-output-file target - (lambda (out) - (let loop ((line (read-line in 'concat)) - (copying? #f)) - (cond - ((eof-object? line) #t) - ((string-prefix? "-----BEGIN" line) - (display line out) - (loop (read-line in 'concat) #t)) - ((string-prefix? "-----END" line) - (display line out) - #t) - (else - (when copying? (display line out)) - (loop (read-line in 'concat) copying?))))))))) - (define (import-cert cert) - (format #t "Importing certificate ~a\n" (basename cert)) - (let ((temp "tmpcert")) - (extract-cert cert temp) - (let ((port (open-pipe* OPEN_WRITE keytool - "-import" - "-alias" (basename cert) - "-keystore" keystore - "-storepass" "changeit" - "-file" temp))) - (display "yes\n" port) - (when (not (zero? (status:exit-val (close-pipe port)))) - (format #t "failed to import ~a\n" cert))) - (delete-file temp))) - - ;; This is necessary because the certificate directory contains - ;; files with non-ASCII characters in their names. - (setlocale LC_ALL "en_US.utf8") - (setenv "LC_ALL" "en_US.utf8") - - (for-each import-cert (find-files certs-dir "\\.pem$")) - (mkdir-p (string-append (assoc-ref outputs "out") - "/lib/security")) - (mkdir-p (string-append (assoc-ref outputs "jdk") - "/jre/lib/security")) - - ;; The cacerts files we are going to overwrite are chmod'ed as - ;; read-only (444) in icedtea-8 (which derives from this - ;; package). We have to change this so we can overwrite them. - (chmod (string-append (assoc-ref outputs "out") - "/lib/security/" keystore) #o644) - (chmod (string-append (assoc-ref outputs "jdk") - "/jre/lib/security/" keystore) #o644) - - (install-file keystore - (string-append (assoc-ref outputs "out") - "/lib/security")) - (install-file keystore - (string-append (assoc-ref outputs "jdk") - "/jre/lib/security")) - #t)))))) - (native-inputs - `(("ant" ,ant) - ("alsa-lib" ,alsa-lib) - ("attr" ,attr) - ("autoconf" ,autoconf) - ("automake" ,automake) - ("coreutils" ,coreutils) - ("diffutils" ,diffutils) ;for tests - ("gawk" ,gawk) - ("grep" ,grep) - ("libtool" ,libtool) - ("pkg-config" ,pkg-config) - ("cups" ,cups) - ("wget" ,wget) - ("which" ,which) - ("cpio" ,cpio) - ("zip" ,zip) - ("unzip" ,unzip) - ("fastjar" ,fastjar) - ("libxslt" ,libxslt) ;for xsltproc - ("mit-krb5" ,mit-krb5) - ("nss" ,nss) - ("nss-certs" ,nss-certs) - ("libx11" ,libx11) - ("libxcomposite" ,libxcomposite) - ("libxt" ,libxt) - ("libxtst" ,libxtst) - ("libxi" ,libxi) - ("libxinerama" ,libxinerama) - ("libxrender" ,libxrender) - ("libjpeg" ,libjpeg) - ("libpng" ,libpng) - ("giflib" ,giflib) - ("perl" ,perl) - ("procps" ,procps) ;for "free", even though I'm not sure we should use it - ("openjdk6-src" - ,(origin - (method url-fetch) - (uri "https://java.net/downloads/openjdk6/openjdk-6-src-b41-04_jan_2017.tar.xz") - (sha256 - (base32 - "058szix0j280g14jzajvsixx1j2dxmc10r848f5swpy6rr8x8d4f")))) - ("lcms" ,lcms) - ("zlib" ,zlib) - ("gtk" ,gtk+-2) - ("fontconfig" ,fontconfig) - ("freetype" ,freetype) - ("gcj" ,gcj))) - (home-page "http://icedtea.classpath.org") - (synopsis "Java development kit") - (description - "The OpenJDK built with the IcedTea build harness.") - ;; IcedTea is released under the GPL2 + Classpath exception, which is the - ;; same license as both GNU Classpath and OpenJDK. - (license license:gpl2+))) - (define-public icedtea-7 (let* ((version "2.6.9") (drop (lambda (name hash) @@ -801,7 +344,8 @@ build process and its dependencies, whereas Make uses Makefile format.") "http://icedtea.classpath.org/download/drops/" "/icedtea7/" version "/" name ".tar.bz2")) (sha256 (base32 hash)))))) - (package (inherit icedtea-6) + (package + (name "icedtea") (version version) (source (origin (method url-fetch) @@ -820,6 +364,10 @@ build process and its dependencies, whereas Make uses Makefile format.") ;; do not leak information about the build host (("DISTRIBUTION_ID=\"\\$\\(DIST_ID\\)\"") "DISTRIBUTION_ID=\"\\\"guix\\\"\""))))) + (build-system gnu-build-system) + (outputs '("out" ; Java Runtime Environment + "jdk" ; Java Development Kit + "doc")) ; all documentation (arguments `(;; There are many test failures. Some are known to ;; fail upstream, others relate to not having an X @@ -830,110 +378,390 @@ build process and its dependencies, whereas Make uses Makefile format.") ;; langtools: passed: 1,934; failed: 26 ;; jdk: unknown #:tests? #f + + ;; The DSOs use $ORIGIN to refer to each other, but (guix build + ;; gremlin) doesn't support it yet, so skip this phase. + #:validate-runpath? #f + ;; Apparently, the C locale is needed for some of the tests. #:locale "C" - ,@(substitute-keyword-arguments (package-arguments icedtea-6) - ((#:modules modules) - `((ice-9 match) - (srfi srfi-26) - ,@modules)) - ((#:configure-flags flags) - ;; TODO: package pcsc and sctp, and add to inputs - `(append '("--disable-system-pcsc" - "--disable-system-sctp") - ,flags)) - ((#:phases phases) - `(modify-phases ,phases - (replace 'unpack - (lambda* (#:key source inputs #:allow-other-keys) - (let ((target (string-append "icedtea-" ,version)) - (unpack (lambda* (name #:optional dir) - (let ((dir (or dir - (string-drop-right name 5)))) - (mkdir dir) - (zero? (system* "tar" "xvf" - (assoc-ref inputs name) - "-C" dir - "--strip-components=1")))))) - (mkdir target) - (and - (zero? (system* "tar" "xvf" source - "-C" target "--strip-components=1")) - (chdir target) - (unpack "openjdk-src" "openjdk.src") - (with-directory-excursion "openjdk.src" - (for-each unpack - (filter (cut string-suffix? "-drop" <>) - (map (match-lambda - ((name . _) name)) - inputs)))) - #t)))) - (replace - 'set-additional-paths - (lambda* (#:key inputs #:allow-other-keys) - (let (;; Get target-specific include directory so that - ;; libgcj-config.h is found when compiling hotspot. - (gcjinclude (let* ((port (open-input-pipe "gcj -print-file-name=include")) - (str (read-line port))) - (close-pipe port) - str))) - (substitute* "openjdk.src/jdk/make/common/shared/Sanity.gmk" - (("ALSA_INCLUDE=/usr/include/alsa/version.h") - (string-append "ALSA_INCLUDE=" - (assoc-ref inputs "alsa-lib") - "/include/alsa/version.h"))) - (setenv "CC" "gcc") - (setenv "CPATH" - (string-append gcjinclude ":" - (assoc-ref inputs "libxcomposite") - "/include/X11/extensions" ":" - (assoc-ref inputs "libxrender") - "/include/X11/extensions" ":" - (assoc-ref inputs "libxtst") - "/include/X11/extensions" ":" - (assoc-ref inputs "libxinerama") - "/include/X11/extensions" ":" - (or (getenv "CPATH") ""))) - (setenv "ALT_OBJCOPY" (which "objcopy")) - (setenv "ALT_CUPS_HEADERS_PATH" - (string-append (assoc-ref inputs "cups") - "/include")) - (setenv "ALT_FREETYPE_HEADERS_PATH" - (string-append (assoc-ref inputs "freetype") - "/include")) - (setenv "ALT_FREETYPE_LIB_PATH" - (string-append (assoc-ref inputs "freetype") - "/lib"))))) - (add-after - 'unpack 'fix-x11-extension-include-path - (lambda* (#:key inputs #:allow-other-keys) - (substitute* "openjdk.src/jdk/make/sun/awt/mawt.gmk" - (((string-append "\\$\\(firstword \\$\\(wildcard " - "\\$\\(OPENWIN_HOME\\)" - "/include/X11/extensions\\).*$")) - (string-append (assoc-ref inputs "libxrender") - "/include/X11/extensions" - " -I" (assoc-ref inputs "libxtst") - "/include/X11/extensions" - " -I" (assoc-ref inputs "libxinerama") - "/include/X11/extensions")) - (("\\$\\(wildcard /usr/include/X11/extensions\\)\\)") "")) - #t)) - (replace - 'fix-test-framework - (lambda _ - ;; Fix PATH in test environment - (substitute* "test/jtreg/com/sun/javatest/regtest/Main.java" - (("PATH=/bin:/usr/bin") - (string-append "PATH=" (getenv "PATH")))) - (substitute* "test/jtreg/com/sun/javatest/util/SysEnv.java" - (("/usr/bin/env") (which "env"))) - (substitute* "openjdk.src/hotspot/test/test_env.sh" - (("/bin/rm") (which "rm")) - (("/bin/cp") (which "cp")) - (("/bin/mv") (which "mv"))) - #t)) - (delete 'patch-patches)))))) + + #:modules ((guix build utils) + (guix build gnu-build-system) + (ice-9 match) + (ice-9 popen) + (ice-9 rdelim) + (srfi srfi-19) + (srfi srfi-26)) + + #:configure-flags + (let* ((gcjdir (assoc-ref %build-inputs "gcj")) + (ecj (string-append gcjdir "/share/java/ecj.jar")) + (jdk (string-append gcjdir "/lib/jvm/")) + (gcj (string-append gcjdir "/bin/gcj"))) + ;; TODO: package pcsc and sctp, and add to inputs + `("--disable-system-pcsc" + "--disable-system-sctp" + "--enable-bootstrap" + "--enable-nss" + "--without-rhino" + "--disable-downloading" + "--disable-tests" ;they are run in the check phase instead + "--with-openjdk-src-dir=./openjdk.src" + ,(string-append "--with-javac=" jdk "/bin/javac") + ,(string-append "--with-ecj-jar=" ecj) + ,(string-append "--with-gcj=" gcj) + ,(string-append "--with-jdk-home=" jdk) + ,(string-append "--with-java=" jdk "/bin/java"))) + + #:phases + (modify-phases %standard-phases + (replace 'unpack + (lambda* (#:key source inputs #:allow-other-keys) + (let ((target (string-append "icedtea-" ,version)) + (unpack (lambda* (name #:optional dir) + (let ((dir (or dir + (string-drop-right name 5)))) + (mkdir dir) + (zero? (system* "tar" "xvf" + (assoc-ref inputs name) + "-C" dir + "--strip-components=1")))))) + (mkdir target) + (and + (zero? (system* "tar" "xvf" source + "-C" target "--strip-components=1")) + (chdir target) + (unpack "openjdk-src" "openjdk.src") + (with-directory-excursion "openjdk.src" + (for-each unpack + (filter (cut string-suffix? "-drop" <>) + (map (match-lambda + ((name . _) name)) + inputs)))) + #t)))) + (add-after 'unpack 'fix-x11-extension-include-path + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "openjdk.src/jdk/make/sun/awt/mawt.gmk" + (((string-append "\\$\\(firstword \\$\\(wildcard " + "\\$\\(OPENWIN_HOME\\)" + "/include/X11/extensions\\).*$")) + (string-append (assoc-ref inputs "libxrender") + "/include/X11/extensions" + " -I" (assoc-ref inputs "libxtst") + "/include/X11/extensions" + " -I" (assoc-ref inputs "libxinerama") + "/include/X11/extensions")) + (("\\$\\(wildcard /usr/include/X11/extensions\\)\\)") "")) + #t)) + (add-after 'unpack 'patch-paths + (lambda _ + ;; buildtree.make generates shell scripts, so we need to replace + ;; the generated shebang + (substitute* '("openjdk.src/hotspot/make/linux/makefiles/buildtree.make") + (("/bin/sh") (which "bash"))) + + (let ((corebin (string-append + (assoc-ref %build-inputs "coreutils") "/bin/")) + (binbin (string-append + (assoc-ref %build-inputs "binutils") "/bin/")) + (grepbin (string-append + (assoc-ref %build-inputs "grep") "/bin/"))) + (substitute* '("openjdk.src/jdk/make/common/shared/Defs-linux.gmk" + "openjdk.src/corba/make/common/shared/Defs-linux.gmk") + (("UNIXCOMMAND_PATH = /bin/") + (string-append "UNIXCOMMAND_PATH = " corebin)) + (("USRBIN_PATH = /usr/bin/") + (string-append "USRBIN_PATH = " corebin)) + (("DEVTOOLS_PATH *= */usr/bin/") + (string-append "DEVTOOLS_PATH = " corebin)) + (("COMPILER_PATH *= */usr/bin/") + (string-append "COMPILER_PATH = " + (assoc-ref %build-inputs "gcc") "/bin/")) + (("DEF_OBJCOPY *=.*objcopy") + (string-append "DEF_OBJCOPY = " (which "objcopy")))) + + ;; fix path to alsa header + (substitute* "openjdk.src/jdk/make/common/shared/Sanity.gmk" + (("ALSA_INCLUDE=/usr/include/alsa/version.h") + (string-append "ALSA_INCLUDE=" + (assoc-ref %build-inputs "alsa-lib") + "/include/alsa/version.h"))) + + ;; fix hard-coded utility paths + (substitute* '("openjdk.src/jdk/make/common/shared/Defs-utils.gmk" + "openjdk.src/corba/make/common/shared/Defs-utils.gmk") + (("ECHO *=.*echo") + (string-append "ECHO = " (which "echo"))) + (("^GREP *=.*grep") + (string-append "GREP = " (which "grep"))) + (("EGREP *=.*egrep") + (string-append "EGREP = " (which "egrep"))) + (("CPIO *=.*cpio") + (string-append "CPIO = " (which "cpio"))) + (("READELF *=.*readelf") + (string-append "READELF = " (which "readelf"))) + (("^ *AR *=.*ar") + (string-append "AR = " (which "ar"))) + (("^ *TAR *=.*tar") + (string-append "TAR = " (which "tar"))) + (("AS *=.*as") + (string-append "AS = " (which "as"))) + (("LD *=.*ld") + (string-append "LD = " (which "ld"))) + (("STRIP *=.*strip") + (string-append "STRIP = " (which "strip"))) + (("NM *=.*nm") + (string-append "NM = " (which "nm"))) + (("^SH *=.*sh") + (string-append "SH = " (which "bash"))) + (("^FIND *=.*find") + (string-append "FIND = " (which "find"))) + (("LDD *=.*ldd") + (string-append "LDD = " (which "ldd"))) + (("NAWK *=.*(n|g)awk") + (string-append "NAWK = " (which "gawk"))) + (("XARGS *=.*xargs") + (string-append "XARGS = " (which "xargs"))) + (("UNZIP *=.*unzip") + (string-append "UNZIP = " (which "unzip"))) + (("ZIPEXE *=.*zip") + (string-append "ZIPEXE = " (which "zip"))) + (("SED *=.*sed") + (string-append "SED = " (which "sed")))) + + ;; Some of these timestamps cause problems as they are more than + ;; 10 years ago, failing the build process. + (substitute* + "openjdk.src/jdk/src/share/classes/java/util/CurrencyData.properties" + (("AZ=AZM;2005-12-31-20-00-00;AZN") "AZ=AZN") + (("MZ=MZM;2006-06-30-22-00-00;MZN") "MZ=MZN") + (("RO=ROL;2005-06-30-21-00-00;RON") "RO=RON") + (("TR=TRL;2004-12-31-22-00-00;TRY") "TR=TRY"))) + #t)) + (add-before 'configure 'set-additional-paths + (lambda* (#:key inputs #:allow-other-keys) + (let ( ;; Get target-specific include directory so that + ;; libgcj-config.h is found when compiling hotspot. + (gcjinclude (let* ((port (open-input-pipe "gcj -print-file-name=include")) + (str (read-line port))) + (close-pipe port) + str))) + (substitute* "openjdk.src/jdk/make/common/shared/Sanity.gmk" + (("ALSA_INCLUDE=/usr/include/alsa/version.h") + (string-append "ALSA_INCLUDE=" + (assoc-ref inputs "alsa-lib") + "/include/alsa/version.h"))) + (setenv "CC" "gcc") + (setenv "CPATH" + (string-append gcjinclude ":" + (assoc-ref inputs "libxcomposite") + "/include/X11/extensions" ":" + (assoc-ref inputs "libxrender") + "/include/X11/extensions" ":" + (assoc-ref inputs "libxtst") + "/include/X11/extensions" ":" + (assoc-ref inputs "libxinerama") + "/include/X11/extensions" ":" + (or (getenv "CPATH") ""))) + (setenv "ALT_OBJCOPY" (which "objcopy")) + (setenv "ALT_CUPS_HEADERS_PATH" + (string-append (assoc-ref inputs "cups") + "/include")) + (setenv "ALT_FREETYPE_HEADERS_PATH" + (string-append (assoc-ref inputs "freetype") + "/include")) + (setenv "ALT_FREETYPE_LIB_PATH" + (string-append (assoc-ref inputs "freetype") + "/lib"))) + #t)) + (add-before 'check 'fix-test-framework + (lambda _ + ;; Fix PATH in test environment + (substitute* "test/jtreg/com/sun/javatest/regtest/Main.java" + (("PATH=/bin:/usr/bin") + (string-append "PATH=" (getenv "PATH")))) + (substitute* "test/jtreg/com/sun/javatest/util/SysEnv.java" + (("/usr/bin/env") (which "env"))) + (substitute* "openjdk.src/hotspot/test/test_env.sh" + (("/bin/rm") (which "rm")) + (("/bin/cp") (which "cp")) + (("/bin/mv") (which "mv"))) + #t)) + (add-before 'check 'fix-hotspot-tests + (lambda _ + (with-directory-excursion "openjdk.src/hotspot/test/" + (substitute* "jprt.config" + (("PATH=\"\\$\\{path4sdk\\}\"") + (string-append "PATH=" (getenv "PATH"))) + (("make=/usr/bin/make") + (string-append "make=" (which "make")))) + (substitute* '("runtime/6626217/Test6626217.sh" + "runtime/7110720/Test7110720.sh") + (("/bin/rm") (which "rm")) + (("/bin/cp") (which "cp")) + (("/bin/mv") (which "mv")))) + #t)) + (add-before 'check 'fix-jdk-tests + (lambda _ + (with-directory-excursion "openjdk.src/jdk/test/" + (substitute* "com/sun/jdi/JdbReadTwiceTest.sh" + (("/bin/pwd") (which "pwd"))) + (substitute* "com/sun/jdi/ShellScaffold.sh" + (("/bin/kill") (which "kill"))) + (substitute* "start-Xvfb.sh" + ;;(("/usr/bin/X11/Xvfb") (which "Xvfb")) + (("/usr/bin/nohup") (which "nohup"))) + (substitute* "javax/security/auth/Subject/doAs/Test.sh" + (("/bin/rm") (which "rm"))) + (substitute* "tools/launcher/MultipleJRE.sh" + (("echo \"#!/bin/sh\"") + (string-append "echo \"#!" (which "rm") "\"")) + (("/usr/bin/zip") (which "zip"))) + (substitute* "com/sun/jdi/OnThrowTest.java" + (("#!/bin/sh") (string-append "#!" (which "sh")))) + (substitute* "java/lang/management/OperatingSystemMXBean/GetSystemLoadAverage.java" + (("/usr/bin/uptime") (which "uptime"))) + (substitute* "java/lang/ProcessBuilder/Basic.java" + (("/usr/bin/env") (which "env")) + (("/bin/false") (which "false")) + (("/bin/true") (which "true")) + (("/bin/cp") (which "cp")) + (("/bin/sh") (which "sh"))) + (substitute* "java/lang/ProcessBuilder/FeelingLucky.java" + (("/bin/sh") (which "sh"))) + (substitute* "java/lang/ProcessBuilder/Zombies.java" + (("/usr/bin/perl") (which "perl")) + (("/bin/ps") (which "ps")) + (("/bin/true") (which "true"))) + (substitute* "java/lang/Runtime/exec/ConcurrentRead.java" + (("/usr/bin/tee") (which "tee"))) + (substitute* "java/lang/Runtime/exec/ExecWithDir.java" + (("/bin/true") (which "true"))) + (substitute* "java/lang/Runtime/exec/ExecWithInput.java" + (("/bin/cat") (which "cat"))) + (substitute* "java/lang/Runtime/exec/ExitValue.java" + (("/bin/sh") (which "sh")) + (("/bin/true") (which "true")) + (("/bin/kill") (which "kill"))) + (substitute* "java/lang/Runtime/exec/LotsOfDestroys.java" + (("/usr/bin/echo") (which "echo"))) + (substitute* "java/lang/Runtime/exec/LotsOfOutput.java" + (("/usr/bin/cat") (which "cat"))) + (substitute* "java/lang/Runtime/exec/SleepyCat.java" + (("/bin/cat") (which "cat")) + (("/bin/sleep") (which "sleep")) + (("/bin/sh") (which "sh"))) + (substitute* "java/lang/Runtime/exec/StreamsSurviveDestroy.java" + (("/bin/cat") (which "cat"))) + (substitute* "java/rmi/activation/CommandEnvironment/SetChildEnv.java" + (("/bin/chmod") (which "chmod"))) + (substitute* "java/util/zip/ZipFile/Assortment.java" + (("/bin/sh") (which "sh")))) + #t)) + (replace 'check + (lambda _ + ;; The "make check-*" targets always return zero, so we need to + ;; check for errors in the associated log files to determine + ;; whether any tests have failed. + (use-modules (ice-9 rdelim)) + (let* ((error-pattern (make-regexp "^(Error|FAILED):.*")) + (checker (lambda (port) + (let loop () + (let ((line (read-line port))) + (cond + ((eof-object? line) #t) + ((regexp-exec error-pattern line) #f) + (else (loop))))))) + (run-test (lambda (test) + (system* "make" test) + (call-with-input-file + (string-append "test/" test ".log") + checker)))) + (or #t ; skip tests + (and (run-test "check-hotspot") + (run-test "check-langtools") + (run-test "check-jdk")))))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((doc (string-append (assoc-ref outputs "doc") + "/share/doc/icedtea")) + (jre (assoc-ref outputs "out")) + (jdk (assoc-ref outputs "jdk"))) + (copy-recursively "openjdk.build/docs" doc) + (copy-recursively "openjdk.build/j2re-image" jre) + (copy-recursively "openjdk.build/j2sdk-image" jdk)) + #t)) + ;; By default IcedTea only generates an empty keystore. In order to + ;; be able to use certificates in Java programs we need to generate a + ;; keystore from a set of certificates. For convenience we use the + ;; certificates from the nss-certs package. + (add-after 'install 'install-keystore + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((keystore "cacerts") + (certs-dir (string-append (assoc-ref inputs "nss-certs") + "/etc/ssl/certs")) + (keytool (string-append (assoc-ref outputs "jdk") + "/bin/keytool"))) + (define (extract-cert file target) + (call-with-input-file file + (lambda (in) + (call-with-output-file target + (lambda (out) + (let loop ((line (read-line in 'concat)) + (copying? #f)) + (cond + ((eof-object? line) #t) + ((string-prefix? "-----BEGIN" line) + (display line out) + (loop (read-line in 'concat) #t)) + ((string-prefix? "-----END" line) + (display line out) + #t) + (else + (when copying? (display line out)) + (loop (read-line in 'concat) copying?))))))))) + (define (import-cert cert) + (format #t "Importing certificate ~a\n" (basename cert)) + (let ((temp "tmpcert")) + (extract-cert cert temp) + (let ((port (open-pipe* OPEN_WRITE keytool + "-import" + "-alias" (basename cert) + "-keystore" keystore + "-storepass" "changeit" + "-file" temp))) + (display "yes\n" port) + (when (not (zero? (status:exit-val (close-pipe port)))) + (format #t "failed to import ~a\n" cert))) + (delete-file temp))) + + ;; This is necessary because the certificate directory contains + ;; files with non-ASCII characters in their names. + (setlocale LC_ALL "en_US.utf8") + (setenv "LC_ALL" "en_US.utf8") + + (for-each import-cert (find-files certs-dir "\\.pem$")) + (mkdir-p (string-append (assoc-ref outputs "out") + "/lib/security")) + (mkdir-p (string-append (assoc-ref outputs "jdk") + "/jre/lib/security")) + + ;; The cacerts files we are going to overwrite are chmod'ed as + ;; read-only (444) in icedtea-8 (which derives from this + ;; package). We have to change this so we can overwrite them. + (chmod (string-append (assoc-ref outputs "out") + "/lib/security/" keystore) #o644) + (chmod (string-append (assoc-ref outputs "jdk") + "/jre/lib/security/" keystore) #o644) + + (install-file keystore + (string-append (assoc-ref outputs "out") + "/lib/security")) + (install-file keystore + (string-append (assoc-ref outputs "jdk") + "/jre/lib/security")) + #t)))))) (native-inputs `(("openjdk-src" ,(drop "openjdk" @@ -956,11 +784,55 @@ build process and its dependencies, whereas Make uses Makefile format.") ("hotspot-drop" ,(drop "hotspot" "16ijxy8br8dla339m4i90wr9xpf7s8z3nrhfyxm7jahr8injpzyl")) - ,@(fold alist-delete (package-native-inputs icedtea-6) - '("openjdk6-src")))) + ("ant" ,ant) + ("attr" ,attr) + ("autoconf" ,autoconf) + ("automake" ,automake) + ("coreutils" ,coreutils) + ("diffutils" ,diffutils) ;for tests + ("gawk" ,gawk) + ("grep" ,grep) + ("libtool" ,libtool) + ("pkg-config" ,pkg-config) + ("wget" ,wget) + ("which" ,which) + ("cpio" ,cpio) + ("zip" ,zip) + ("unzip" ,unzip) + ("fastjar" ,fastjar) + ("libxslt" ,libxslt) ;for xsltproc + ("nss-certs" ,nss-certs) + ("perl" ,perl) + ("procps" ,procps) ;for "free", even though I'm not sure we should use it + ("gcj" ,gcj))) (inputs - `(("libxcomposite" ,libxcomposite) - ,@(package-inputs icedtea-6)))))) + `(("alsa-lib" ,alsa-lib) + ("cups" ,cups) + ("libx11" ,libx11) + ("libxcomposite" ,libxcomposite) + ("libxt" ,libxt) + ("libxtst" ,libxtst) + ("libxi" ,libxi) + ("libxinerama" ,libxinerama) + ("libxrender" ,libxrender) + ("libjpeg" ,libjpeg) + ("libpng" ,libpng) + ("mit-krb5" ,mit-krb5) + ("nss" ,nss) + ("giflib" ,giflib) + ("fontconfig" ,fontconfig) + ("freetype" ,freetype) + ("lcms" ,lcms) + ("zlib" ,zlib) + ("gtk" ,gtk+-2))) + (home-page "http://icedtea.classpath.org") + (synopsis "Java development kit") + (description + "This package provides the Java development kit OpenJDK built with the +IcedTea build harness.") + ;; IcedTea is released under the GPL2 + Classpath exception, which is the + ;; same license as both GNU Classpath and OpenJDK. + (license license:gpl2+)))) (define-public icedtea-8 (let* ((version "3.3.0") |