summary refs log tree commit diff
path: root/pkgs/development/compilers/openjdk/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/compilers/openjdk/default.nix')
-rw-r--r--pkgs/development/compilers/openjdk/default.nix195
1 files changed, 112 insertions, 83 deletions
diff --git a/pkgs/development/compilers/openjdk/default.nix b/pkgs/development/compilers/openjdk/default.nix
index 0be36379f33..6a07c7af69e 100644
--- a/pkgs/development/compilers/openjdk/default.nix
+++ b/pkgs/development/compilers/openjdk/default.nix
@@ -1,30 +1,6 @@
-{ stdenv
-, fetchurl
-, unzip
-, zip
-, procps
-, coreutils
-, alsaLib
-, ant
-, freetype
-, cups
-, which
-, jdk
-, nettools
-, libX11
-, libXt
-, libXext
-, libXrender
-, libXtst
-, libXi
-, libXinerama
-, libXcursor
-, fontconfig
-, cpio
-, cacert
-, jreOnly ? false
-, perl
-}:
+{ stdenv, fetchurl, unzip, zip, procps, coreutils, alsaLib, ant, freetype
+, which, jdk, nettools, xorg, file
+, fontconfig, cpio, cacert, perl, setJavaClassPath }:
 
 let
 
@@ -39,106 +15,159 @@ let
     else
       throw "openjdk requires i686-linux or x86_64 linux";
 
-  update = "6";
+  update = "65";
 
-  build = "24";
+  build = "32";
+
+  # On x86 for heap sizes over 700MB disable SEGMEXEC and PAGEEXEC as well.
+  paxflags = if stdenv.isi686 then "msp" else "m";
+
+  cupsSrc = fetchurl {
+    url = http://ftp.easysw.com/pub/cups/1.5.4/cups-1.5.4-source.tar.bz2;
+    md5 = "de3006e5cf1ee78a9c6145ce62c4e982";
+  };
 
 in
 
 stdenv.mkDerivation rec {
-  name = "openj${if jreOnly then "re" else "dk"}-7u${update}b${build}";
+  name = "openjdk-7u${update}b${build}";
 
   src = fetchurl {
-    url = "http://www.java.net/download/openjdk/jdk7u6/promoted/b24/openjdk-7u6-fcs-src-b24-28_aug_2012.zip";
-    sha256 = "1x1iq8ga0hqqh0bpcmydzzy19757hknn2yvgzib85p7b7dx0vfx9";
+    url = "http://tarballs.nixos.org/openjdk-7u${update}-b${build}.tar.xz";
+    sha256 = "0lyp75sl5w4b9azphb2nq5cwzli85inpksq4943q4j349rkmdprx";
   };
 
-#  outputs = [ "out" ] ++ stdenv.lib.optionals (! jreOnly) [ "jre" ];
-
-  buildInputs = [
-    unzip
-    procps
-    ant
-    which
-    zip
-    cpio
-    nettools
-    alsaLib
-    libX11
-    libXt
-    libXext
-    libXrender
-    libXtst
-    libXi
-    libXinerama
-    libXcursor
-    fontconfig
-    perl
-  ];
+  outputs = [ "out" "jre" ];
+
+  buildInputs =
+    [ unzip procps ant which zip cpio nettools alsaLib
+      xorg.libX11 xorg.libXt xorg.libXext xorg.libXrender xorg.libXtst
+      xorg.libXi xorg.libXinerama xorg.libXcursor xorg.lndir
+      fontconfig perl file
+    ];
 
   NIX_LDFLAGS = "-lfontconfig -lXcursor -lXinerama";
 
   postUnpack = ''
     sed -i -e "s@/usr/bin/test@${coreutils}/bin/test@" \
       -e "s@/bin/ls@${coreutils}/bin/ls@" \
-      openjdk/hotspot/make/linux/makefiles/sa.make
+      openjdk*/hotspot/make/linux/makefiles/sa.make
 
     sed -i "s@/bin/echo -e@${coreutils}/bin/echo -e@" \
-      openjdk/{jdk,corba}/make/common/shared/Defs-utils.gmk
+      openjdk*/{jdk,corba}/make/common/shared/Defs-utils.gmk
 
-    sed -i "s@<Xrender.h>@<X11/extensions/Xrender.h>@" \
-      openjdk/jdk/src/solaris/native/sun/java2d/x11/XRSurfaceData.c
+    tar xf ${cupsSrc}
+    cupsDir=$(echo $(pwd)/cups-*)
+    makeFlagsArray+=(CUPS_HEADERS_PATH=$cupsDir)
   '';
 
-  patches = [
-    ./cppflags-include-fix.patch
-    ./no-crypto-restrictions.patch
-  ];
+  patches = [ ./cppflags-include-fix.patch ./fix-java-home.patch ./paxctl.patch ];
+
+  NIX_NO_SELF_RPATH = true;
 
   makeFlags = [
     "SORT=${coreutils}/bin/sort"
     "ALSA_INCLUDE=${alsaLib}/include/alsa/version.h"
     "FREETYPE_HEADERS_PATH=${freetype}/include"
     "FREETYPE_LIB_PATH=${freetype}/lib"
-    "MILESTONE=release"
+    "MILESTONE=u${update}"
     "BUILD_NUMBER=b${build}"
-    "CUPS_HEADERS_PATH=${cups}/include"
     "USRBIN_PATH="
     "COMPILER_PATH="
     "DEVTOOLS_PATH="
     "UNIXCOMMAND_PATH="
     "BOOTDIR=${jdk}"
+    "STATIC_CXX=false"
+    "UNLIMITED_CRYPTO=1"
+    "FULL_DEBUG_SYMBOLS=0"
   ];
 
-  configurePhase = ''
-    make $makeFlags sanity
+  configurePhase = "true";
+
+  preBuild = ''
+    # We also need to PaX-mark in the middle of the build
+    substituteInPlace hotspot/make/linux/makefiles/launcher.make \
+       --replace XXX_PAXFLAGS_XXX ${paxflags}
+    substituteInPlace jdk/make/common/Program.gmk  \
+       --replace XXX_PAXFLAGS_XXX ${paxflags}
   '';
 
   installPhase = ''
-    mkdir -p $out
-    cp -av build/*/j2${if jreOnly then "re" else "sdk"}-image/* $out
-    pushd $out/${if ! jreOnly then "jre/" else ""}lib/security
+    mkdir -p $out/lib/openjdk $out/share $jre/lib/openjdk
+
+    cp -av build/*/j2sdk-image/* $out/lib/openjdk
+
+    # Move some stuff to top-level.
+    mv $out/lib/openjdk/include $out/include
+    mv $out/lib/openjdk/man $out/share/man
+
+    # jni.h expects jni_md.h to be in the header search path.
+    ln -s $out/include/linux/*_md.h $out/include/
+
+    # Remove some broken manpages.
+    rm -rf $out/share/man/ja*
+
+    # Remove crap from the installation.
+    rm -rf $out/lib/openjdk/demo $out/lib/openjdk/sample
+
+    # Move the JRE to a separate output.
+    mv $out/lib/openjdk/jre $jre/lib/openjdk/
+    mkdir $out/lib/openjdk/jre
+    lndir $jre/lib/openjdk/jre $out/lib/openjdk/jre
+
+    rm -rf $out/lib/openjdk/jre/bin
+    ln -s $out/lib/openjdk/bin $out/lib/openjdk/jre/bin
+
+    # Set PaX markings
+    exes=$(file $out/lib/openjdk/bin/* $jre/lib/openjdk/jre/bin/* 2> /dev/null | grep -E 'ELF.*(executable|shared object)' | sed -e 's/: .*$//')
+    echo "to mark: *$exes*"
+    for file in $exes; do
+      echo "marking *$file*"
+      paxmark ${paxflags} "$file"
+    done
+
+    # Remove duplicate binaries.
+    for i in $(cd $out/lib/openjdk/bin && echo *); do
+      if [ "$i" = java ]; then continue; fi
+      if cmp -s $out/lib/openjdk/bin/$i $jre/lib/openjdk/jre/bin/$i; then
+        ln -sfn $jre/lib/openjdk/jre/bin/$i $out/lib/openjdk/bin/$i
+      fi
+    done
+
+    # Generate certificates.
+    pushd $jre/lib/openjdk/jre/lib/security
     rm cacerts
-    perl ${./generate-cacerts.pl} $out/bin/keytool ${cacert}/etc/ca-bundle.crt
+    perl ${./generate-cacerts.pl} $jre/lib/openjdk/jre/bin/keytool ${cacert}/etc/ca-bundle.crt
     popd
+
+    ln -s $out/lib/openjdk/bin $out/bin
+    ln -s $jre/lib/openjdk/jre/bin $jre/bin
+  ''; # */
+
+  # FIXME: this is unnecessary once the multiple-outputs branch is merged.
+  preFixup = ''
+    prefix=$jre stripDirs "$stripDebugList" "''${stripDebugFlags:--S}"
+    patchELF $jre
+    propagatedNativeBuildInputs+=" $jre"
+
+    # Propagate the setJavaClassPath setup hook from the JRE so that
+    # any package that depends on the JRE has $CLASSPATH set up
+    # properly.
+    mkdir -p $jre/nix-support
+    echo -n "${setJavaClassPath}" > $jre/nix-support/propagated-native-build-inputs
+
+    # Set JAVA_HOME automatically.
+    mkdir -p $out/nix-support
+    cat <<EOF > $out/nix-support/setup-hook
+    if [ -z "\$JAVA_HOME" ]; then export JAVA_HOME=$out/lib/openjdk; fi
+    EOF
   '';
-#  '' + (if jreOnly then "" else ''
-#    if [ -z $jre ]; then
-#      exit 0
-#    fi
-#    mkdir -p $jre
-#    cp -av build/*/j2re-image/* $jre
-#  '');
 
   meta = {
     homepage = http://openjdk.java.net/;
-
-    license = "GPLv2";
-
+    license = stdenv.lib.licenses.gpl2;
     description = "The open-source Java Development Kit";
-
-    maintainers = [ stdenv.lib.maintainers.shlevy ];
-
+    maintainers = [ stdenv.lib.maintainers.eelco stdenv.lib.maintainers.shlevy ];
     platforms = stdenv.lib.platforms.linux;
   };