guix_mirror_bot pushed a commit to branch java-team
in repository guix.
commit ec96489e9f8b04e07834c2c45a11d4079d6f5213
Author: Maxim Cournoyer <[email protected]>
AuthorDate: Tue Feb 17 15:45:03 2026 +0900
gnu: icedtea-7: Modernize.
* gnu/packages/java.scm (system->icedtea-arch): New procedure.
(icedtea-7) [arguments]: Use gexps and output variables.
[#:phases] {install-libjvm}: Use system->icedtea-arch.
Change-Id: Id672fc9f02f4a148aa016cdfcaffc4f081bcb676
---
gnu/packages/java.scm | 944 ++++++++++++++++++++++++--------------------------
1 file changed, 462 insertions(+), 482 deletions(-)
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index 9cc2f77081..83ae501119 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -13,7 +13,7 @@
;;; Copyright © 2019, 2020, 2021 Björn Höfling
<[email protected]>
;;; Copyright © 2020, 2025 Janneke Nieuwenhuizen <[email protected]>
;;; Copyright © 2020 Raghav Gururajan <[email protected]>
-;;; Copyright © 2020, 2022, 2025 Maxim Cournoyer <[email protected]>
+;;; Copyright © 2020, 2022, 2025-2026 Maxim Cournoyer <[email protected]>
;;; Copyright © 2021 Vincent Legoll <[email protected]>
;;; Copyright © 2021 Mike Gerwitz <[email protected]>
;;; Copyright © 2021 Pierre Langlois <[email protected]>
@@ -103,10 +103,24 @@
#:use-module (gnu packages xdisorg)
#:use-module (gnu packages xorg)
#:use-module (gnu packages texinfo)
- #:use-module ((srfi srfi-1) #:select (fold alist-delete))
+ #:use-module ((srfi srfi-1) #:select (first fold alist-delete))
#:use-module (srfi srfi-11)
#:use-module (ice-9 match))
+(define* (system->icedtea-arch #:optional (system (or (%current-target-system)
+ (%current-system))))
+ "Return the Icedtea architecture string, such as \"ppc64le\", of SYSTEM."
+ ;; See INSTALL_ARCH_DIR in the configure script of icedtea.
+ (match system
+ ("i686-linux" "i386")
+ ("x86_64-linux" "amd64")
+ ("armhf-linux" "arm")
+ ("powerpc-linux" "ppc")
+ ("powerpc64le-linux" "ppc64le")
+ (system
+ ;; Turn e.g. "aarch64-linux" into "aarch64".
+ (first (string-split system #\-)))))
+
(define-public icedtea-7
(let* ((version "2.6.13")
(drop (lambda* (name hash #:optional (patches '()))
@@ -130,492 +144,458 @@
"1w331rdqx1dcx2xb0fmjmrkdc71xqn20fxsgw8by4xhiblh88khh"))
(modules '((guix build utils)))
(snippet
- '(begin
- (substitute* "Makefile.in"
- ;; do not leak information about the build host
- (("DISTRIBUTION_ID=\"\\$\\(DIST_ID\\)\"")
- "DISTRIBUTION_ID=\"\\\"guix\\\"\""))
- #t))))
+ '(substitute* "Makefile.in"
+ ;; 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
+ (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
- ;; server running at test time, yet others are a
- ;; complete mystery to me.
-
- ;; hotspot: passed: 241; failed: 45; error: 2
- ;; 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
-
- #:modules ((guix build utils)
+ (list
+ ;; There are many test failures. Some are known to fail upstream,
+ ;; others relate to not having an X server running at test time, yet
+ ;; others are a complete mystery to me.
+
+ ;; hotspot: passed: 241; failed: 45; error: 2
+ ;; langtools: passed: 1,934; failed: 26
+ ;; jdk: unknown
+ #:tests? #f
+ ;; The validate-runpath phase fails on internal libraries depending on
+ ;; libraries found under e.g. 'lib/amd64' on x86_64, and the build
+ ;; system blissfully ignores LDFLAGS; disable it.
+ #:validate-runpath? #f
+ #:modules '((guix build utils)
(guix build gnu-build-system)
(ice-9 match)
(ice-9 popen)
(srfi srfi-19)
(srfi srfi-26))
-
- #:configure-flags
- ;; TODO: package sctp and add to inputs
- `("--disable-system-sctp"
- "--enable-system-pcsc"
- "--enable-system-lcms"
- "--enable-bootstrap"
- "--enable-nss"
- "--without-rhino"
- ,(string-append "--with-parallel-jobs="
- (number->string (parallel-job-count)))
- "--disable-downloading"
- "--disable-tests" ;they are run in the check phase instead
- "--with-openjdk-src-dir=./openjdk.src"
- ,(string-append "--with-ecj="
- (assoc-ref %build-inputs "ecj4-javac-wrapper")
- "/bin/javac")
- ,(string-append "--with-jdk-home="
- (assoc-ref %build-inputs "classpath"))
- ,(string-append "--with-java="
- (assoc-ref %build-inputs "jamvm")
- "/bin/jamvm")
- ,(string-append "--with-jar="
- (assoc-ref %build-inputs "classpath")
- "/bin/gjar"))
- #: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)
- (invoke "tar" "xvf"
- (assoc-ref inputs name)
- "-C" dir
- "--strip-components=1")))))
- (mkdir target)
- (invoke "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)))))))
- (add-after 'unpack 'use-classpath
- (lambda* (#:key inputs #:allow-other-keys)
- (let ((tools (search-input-file inputs
"/share/classpath/tools.zip"))
- (rt.jar (search-input-file inputs "/lib/rt.jar")))
- ;; GNU Classpath does not provide rt.jar, but jamvm provides
- ;; Classpath's glibj.zip as rt.jar, so we just use that.
- (substitute* "Makefile.in"
- (("\\$\\(SYSTEM_JDK_DIR\\)/jre/lib/rt.jar") rt.jar))
- ;; Make sure we can find all classes.
- (setenv "CLASSPATH"
- (string-append rt.jar ":" tools))
- (setenv "JAVACFLAGS"
- (string-append "-cp " rt.jar ":" tools)))))
- (add-after 'unpack 'patch-bitrot
- (lambda _
- (substitute* '("patches/boot/revert-6973616.patch"
-
"openjdk.src/jdk/make/common/shared/Defs-versions.gmk")
- (("REQUIRED_FREETYPE_VERSION = 2.2.1")
- "REQUIRED_FREETYPE_VERSION = 2.10.1"))
- ;; As of attr 2.4.48 this header is no longer
- ;; included. It is provided by the libc instead.
- (substitute* '("configure"
-
"openjdk.src/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c")
- (("attr/xattr.h") "sys/xattr.h"))))
- (add-after 'unpack 'fix-openjdk
- (lambda _
- (substitute* "openjdk.src/jdk/make/common/Defs-linux.gmk"
- (("CFLAGS_COMMON = -fno-strict-aliasing" all)
- (string-append all
- " -fcommon"
- " -Wno-error=implicit-function-declaration"
- " -Wno-error=implicit-int"
- " -Wno-error=incompatible-pointer-types"
- " -Wno-error=int-conversion")))
- (substitute*
-
'("openjdk.src/jdk/src/solaris/native/java/net/PlainSocketImpl.c"
-
"openjdk.src/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c")
- (("#include <sys/sysctl.h>")
- "#include <linux/sysctl.h>"))
-
- ;; XXX 'ldd' in glibc 2.35 segfaults upon reading
- ;; openjdk.build-boot/lib/amd64/libnio.so (!).
- ;; It is only used as a verification step, so ignore it;
- ;; try removing this substitution for newer versions of glibc.
- (substitute* "openjdk.src/jdk/make/common/shared/Defs-linux.gmk"
- (("\\$\\(LDD\\) \\$1 &&")
- ""))
-
- ;; It looks like the "h = 31 * h + c" line of the jsum()
- ;; function gets miscompiled. After a few iterations of the loop
- ;; the result of "31 * h" is always 0x8000000000000000.
- ;; Disable optimizations of dump.cpp as a workaround.
- (substitute* "openjdk.src/hotspot/make/linux/makefiles/gcc.make"
- (("OPT_CFLAGS/NOOPT.*" all)
- (string-append all "\n"
- "OPT_CFLAGS/dump.o += -O0")))))
- (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\\)\\)") ""))))
- (add-after 'unpack 'patch-paths
- (lambda* (#:key inputs #:allow-other-keys)
- ;; 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 inputs "coreutils") "/bin/"))
- (binbin (string-append
- (assoc-ref inputs "binutils") "/bin/"))
- (grepbin (string-append
- (assoc-ref 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 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 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)
- (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 (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-before 'build 'disable-os-version-check
- ;; allow build on linux major version change
- (lambda _
- (setenv "DISABLE_HOTSPOT_OS_VERSION_CHECK" "ok")))
- (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")))))
- (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"))))))
- (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"))))))
- (replace 'check
- (lambda* (#:key tests? #:allow-other-keys)
- ;; 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.
- (when tests?
- (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)
- (error "test failed"))
- (else (loop)))))))
- (run-test (lambda (test)
- (invoke "make" test)
- (call-with-input-file
- (string-append "test/" test ".log")
- checker))))
- (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))))
- ;; Some of the libraries in the lib/amd64 folder link to libjvm.so.
- ;; But that shared object is located in the server/ folder, so it
- ;; cannot be found. This phase creates a symbolic link in the
- ;; lib/amd64 folder so that the other libraries can find it.
- ;;
- ;; See:
- ;;
https://lists.gnu.org/archive/html/guix-devel/2017-10/msg00169.html
- ;;
- ;; FIXME: Find the bug in the build system, so that this symlink is
- ;; not needed.
- (add-after 'install 'install-libjvm
- (lambda* (#:key inputs outputs #:allow-other-keys)
- (let* ((lib-path (string-append (assoc-ref outputs "out")
- ;; See 'INSTALL_ARCH_DIR' in
- ;; 'configure'.
- ,(match (%current-system)
- ("i686-linux"
- "/lib/i386")
- ("x86_64-linux"
- "/lib/amd64")
- ("armhf-linux"
- "/lib/arm")
- ("aarch64-linux"
- "/lib/aarch64")
- ("powerpc-linux"
- "/lib/ppc")
- ("powerpc64le-linux"
- "/lib/ppc64le")
- ;; We need a catch-all,
dropping
- ;; '-linux' works in most
cases.
- (_
- (string-append
- "/lib/"
- (string-drop-right
- (%current-system)
6)))))))
- (symlink (string-append lib-path "/server/libjvm.so")
- (string-append lib-path "/libjvm.so")))))
- ;; 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)
- (use-modules (ice-9 rdelim))
- (let* ((keystore "cacerts")
- (certs-dir (search-input-directory inputs
- "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 "C.UTF-8")
- (setenv "LC_ALL" "C.UTF-8")
-
- (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"))))))))
+ #:configure-flags
+ ;; TODO: package sctp and add to inputs
+ #~(list "--disable-system-sctp"
+ "--enable-system-pcsc"
+ "--enable-system-lcms"
+ "--enable-bootstrap"
+ "--enable-nss"
+ "--without-rhino"
+ (string-append "--with-parallel-jobs="
+ (number->string (parallel-job-count)))
+ "--disable-downloading"
+ "--disable-tests" ;they are run in the check phase instead
+ "--with-openjdk-src-dir=./openjdk.src"
+ (string-append
+ "--with-ecj=" (search-input-file %build-inputs "bin/javac"))
+ (string-append "--with-jdk-home="
+ #$(this-package-native-input "classpath"))
+ (string-append "--with-java="
+ (search-input-file %build-inputs "bin/jamvm"))
+ (string-append "--with-jar="
+ (search-input-file %build-inputs "/bin/gjar")))
+ #:phases
+ #~(modify-phases %standard-phases
+ (replace 'unpack
+ (lambda* (#:key source inputs #:allow-other-keys)
+ (let ((target (string-append "icedtea-"
+ #$(package-version this-package)))
+ (unpack (lambda* (name #:optional dir)
+ (let ((dir (or dir
+ (string-drop-right name 5))))
+ (mkdir dir)
+ (invoke "tar" "xvf"
+ (assoc-ref inputs name)
+ "-C" dir
+ "--strip-components=1")))))
+ (mkdir target)
+ (invoke "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)))))))
+ (add-after 'unpack 'use-classpath
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((tools (search-input-file inputs
+ "share/classpath/tools.zip"))
+ (rt.jar (search-input-file inputs "lib/rt.jar")))
+ ;; GNU Classpath does not provide rt.jar, but jamvm provides
+ ;; Classpath's glibj.zip as rt.jar, so we just use that.
+ (substitute* "Makefile.in"
+ (("\\$\\(SYSTEM_JDK_DIR\\)/jre/lib/rt.jar") rt.jar))
+ ;; Make sure we can find all classes.
+ (setenv "CLASSPATH"
+ (string-append rt.jar ":" tools))
+ (setenv "JAVACFLAGS"
+ (string-append "-cp " rt.jar ":" tools)))))
+ (add-after 'unpack 'patch-bitrot
+ (lambda _
+ (substitute*
+ '("patches/boot/revert-6973616.patch"
+ "openjdk.src/jdk/make/common/shared/Defs-versions.gmk")
+ (("REQUIRED_FREETYPE_VERSION = 2.2.1")
+ "REQUIRED_FREETYPE_VERSION = 2.10.1"))
+ ;; As of attr 2.4.48 this header is no longer
+ ;; included. It is provided by the libc instead.
+ (substitute* '("configure"
+ "openjdk.src/jdk/src/solaris/native/sun/\
+nio/fs/LinuxNativeDispatcher.c")
+ (("attr/xattr.h") "sys/xattr.h"))))
+ (add-after 'unpack 'fix-openjdk
+ (lambda _
+ (with-directory-excursion "openjdk.src"
+ (substitute* "jdk/make/common/Defs-linux.gmk"
+ (("CFLAGS_COMMON = -fno-strict-aliasing" all)
+ (string-append all
+ " -fcommon"
+ " -Wno-error=implicit-function-declaration"
+ " -Wno-error=implicit-int"
+ " -Wno-error=incompatible-pointer-types"
+ " -Wno-error=int-conversion")))
+ (substitute*
+ '("jdk/src/solaris/native/java/net/PlainSocketImpl.c"
+
"jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c")
+ (("#include <sys/sysctl.h>")
+ "#include <linux/sysctl.h>"))
+
+ ;; XXX 'ldd' in glibc 2.35 segfaults upon reading
+ ;; openjdk.build-boot/lib/amd64/libnio.so (!).
+ ;; It is only used as a verification step, so ignore it; try
+ ;; removing this substitution for newer versions of glibc.
+ (substitute* "jdk/make/common/shared/Defs-linux.gmk"
+ (("\\$\\(LDD\\) \\$1 &&")
+ ""))
+
+ ;; It looks like the "h = 31 * h + c" line of the jsum()
+ ;; function gets miscompiled. After a few iterations of the
+ ;; loop the result of "31 * h" is always 0x8000000000000000.
+ ;; Disable optimizations of dump.cpp as a workaround.
+ (substitute* "hotspot/make/linux/makefiles/gcc.make"
+ (("OPT_CFLAGS/NOOPT.*" all)
+ (string-append all "\n"
+ "OPT_CFLAGS/dump.o += -O0"))))))
+ (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 #$(this-package-input "libxrender")
+ "/include/X11/extensions"
+ " -I" #$(this-package-input "libxtst")
+ "/include/X11/extensions"
+ " -I" #$(this-package-input "libxinerama")
+ "/include/X11/extensions"))
+ (("\\$\\(wildcard /usr/include/X11/extensions\\)\\)") ""))))
+ (add-after 'unpack 'patch-paths
+ (lambda* (#:key native-inputs inputs #:allow-other-keys)
+ ;; buildtree.make generates shell scripts, so we need to
replace
+ ;; the generated shebang.
+ (with-directory-excursion "openjdk.src"
+ (substitute* "hotspot/make/linux/makefiles/buildtree.make"
+ (("/bin/sh") (which "bash")))
+
+ (let ((corebin (dirname (search-input-file
+ (or native-inputs inputs)
+ "bin/cp")))) ;coreutils
+ (substitute* '("jdk/make/common/shared/Defs-linux.gmk"
+ "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 = "
+ (dirname (search-input-file
+ (or native-inputs inputs)
+ "bin/gcc"))))
+ (("DEF_OBJCOPY *=.*objcopy")
+ (string-append "DEF_OBJCOPY = " (which "objcopy"))))
+
+ ;; Fix path to alsa header.
+ (substitute* "jdk/make/common/shared/Sanity.gmk"
+ (("ALSA_INCLUDE=/usr/include/alsa/version.h")
+ (string-append "ALSA_INCLUDE="
+ (search-input-file
+ inputs "include/alsa/version.h"))))
+
+ ;; Fix hard-coded utility paths.
+ (substitute* '("jdk/make/common/shared/Defs-utils.gmk"
+ "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* "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)
+ (setenv "CC" "gcc")
+ (setenv "CPATH"
+ (string-append #$(this-package-input "libxcomposite")
+ "/include/X11/extensions" ":"
+ #$(this-package-input "libxrender")
+ "/include/X11/extensions" ":"
+ #$(this-package-input "libxtst")
+ "/include/X11/extensions" ":"
+ #$(this-package-input "libxinerama")
+ "/include/X11/extensions" ":"
+ (or (getenv "CPATH") "")))
+ (setenv "ALT_OBJCOPY" (which "objcopy"))
+ (setenv "ALT_CUPS_HEADERS_PATH"
+ (string-append #$(this-package-input "cups")
+ "/include"))
+ (setenv "ALT_FREETYPE_HEADERS_PATH"
+ (string-append #$(this-package-input "freetype")
+ "/include"))
+ (setenv "ALT_FREETYPE_LIB_PATH"
+ (string-append #$(this-package-input "freetype")
+ "/lib"))))
+ (add-before 'build 'disable-os-version-check
+ ;; allow build on linux major version change
+ (lambda _
+ (setenv "DISABLE_HOTSPOT_OS_VERSION_CHECK" "ok")))
+ (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")))))
+ (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"))))))
+ (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"))))))
+ (replace 'check
+ (lambda* (#:key tests? #:allow-other-keys)
+ ;; 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.
+ (when tests?
+ (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)
+ (error "test failed"))
+ (else (loop)))))))
+ (run-test (lambda (test)
+ (invoke "make" test)
+ (call-with-input-file
+ (string-append "test/" test ".log")
+ checker))))
+ (run-test "check-hotspot")
+ (run-test "check-langtools")
+ (run-test "check-jdk")))))
+ (replace 'install
+ (lambda _
+ (copy-recursively "openjdk.build/docs"
+ (string-append #$output:doc
+ "/share/doc/icedtea"))
+ (copy-recursively "openjdk.build/j2re-image" #$output)
+ (copy-recursively "openjdk.build/j2sdk-image" #$output:jdk)))
+ (add-after 'install 'install-libjvm
+ ;; Some of the libraries in the lib/amd64 folder link to
libjvm.so.
+ ;; But that shared object is located in the server/ folder, so it
+ ;; cannot be found. This phase creates a symbolic link in the
+ ;; lib/amd64 folder so that the other libraries can find it.
+ ;;
+ ;; See:
+ ;;
https://lists.gnu.org/archive/html/guix-devel/2017-10/msg00169.html
+ ;;
+ ;; FIXME: Find the bug in the build system, so that this symlink
is
+ ;; not needed.
+ (lambda _
+ (let ((lib-path (string-append #$output "/lib/"
+ #$(system->icedtea-arch))))
+ (symlink (string-append lib-path "/server/libjvm.so")
+ (string-append lib-path "/libjvm.so")))))
+ ;; 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 #:allow-other-keys)
+ (use-modules (ice-9 rdelim))
+ (let* ((keystore "cacerts")
+ (certs-dir (search-input-directory inputs
+ "etc/ssl/certs"))
+ (keytool (string-append #$output: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 "C.UTF-8")
+ (setenv "LC_ALL" "C.UTF-8")
+
+ (for-each import-cert (find-files certs-dir "\\.pem$"))
+ (mkdir-p (string-append #$output "/lib/security"))
+ (mkdir-p (string-append #$output: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 #$output "/lib/security/" keystore)
+ #o644)
+ (chmod (string-append #$output:jdk
+ "/jre/lib/security/" keystore) #o644)
+
+ (install-file keystore
+ (string-append #$output "/lib/security"))
+ (install-file keystore
+ (string-append #$output:jdk
+ "/jre/lib/security"))))))))
(native-inputs
;; XXX: Compiling with gcc-14 will encounter the following error:
;; BUILD FAILED:
@@ -675,7 +655,7 @@
("libxslt" ,libxslt) ;for xsltproc
("nss-certs" ,nss-certs)
("perl" ,perl)
- ("procps" ,procps))) ;for "free", even though I'm not sure we should
use it
+ ("procps" ,procps))) ;for "free", even though I'm not sure we should
use it
(inputs
(list alsa-lib
cups