Move jdk -> oraclejdk

This commit is contained in:
Eelco Dolstra
2014-07-16 18:35:35 +02:00
parent c39bee0c0f
commit 94db68d283
7 changed files with 3 additions and 3 deletions

View File

@@ -0,0 +1,60 @@
source $stdenv/setup
echo "Unpacking distribution"
unzip ${src} || true
# set the dynamic linker of unpack200, necessary for construct script
echo "patching unpack200"
patchelf --interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" --set-rpath "" */bin/unpack200
echo "constructing JDK and JRE installations"
if test -z "$installjdk"; then
sh ${construct} . tmp-linux-jdk tmp-linux-jre
mkdir -p $out
cp -R tmp-linux-jre/* $out
else
sh ${construct} . $out tmp-linux-jre
fi
echo "removing files at top level of installation"
for file in $out/*
do
if test -f $file ; then
rm $file
fi
done
rm -rf $out/docs
# construct the rpath
rpath=
for i in $libraries; do
rpath=$rpath${rpath:+:}$i/lib
done
if test -z "$installjdk"; then
jrePath=$out
else
jrePath=$out/jre
fi
if test -n "$jce"; then
unzip $jce
cp -v jce/*.jar $jrePath/lib/security
fi
rpath=$rpath${rpath:+:}$jrePath/lib/$architecture/jli
# set all the dynamic linkers
find $out -type f -perm +100 \
-exec patchelf --interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \
--set-rpath "$rpath" {} \;
find $out -name "*.so" -exec patchelf --set-rpath "$rpath" {} \;
if test -z "$pluginSupport"; then
rm -f $out/bin/javaws
fi
mkdir $jrePath/lib/$architecture/plugins
ln -s $jrePath/lib/$architecture/libnpjp2.so $jrePath/lib/$architecture/plugins

View File

@@ -0,0 +1,185 @@
{ productVersion
, patchVersion
, downloadUrl
, sha256_i686
, sha256_x86_64
, jceName
, jceDownloadUrl
, sha256JCE
}:
{ swingSupport ? true
, stdenv
, requireFile
, unzip
, file
, xlibs ? null
, installjdk ? true
, pluginSupport ? true
, installjce ? false
, glib
, libxml2
, libav_0_8
, ffmpeg
, libxslt
, mesa_noglu
, freetype
, fontconfig
, gnome
, cairo
, alsaLib
, atk
, gdk_pixbuf
, setJavaClassPath
}:
assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux";
assert swingSupport -> xlibs != null;
let
/**
* The JRE libraries are in directories that depend on the CPU.
*/
architecture =
if stdenv.system == "i686-linux" then
"i386"
else if stdenv.system == "x86_64-linux" then
"amd64"
else
abort "jdk requires i686-linux or x86_64 linux";
jce =
if installjce then
requireFile {
name = jceName;
url = jceDownloadUrl;
sha256 = sha256JCE;
}
else
"";
in
let result = stdenv.mkDerivation rec {
name =
if installjdk then "oraclejdk-${productVersion}u${patchVersion}" else "oraclejre-${productVersion}u${patchVersion}";
src =
if stdenv.system == "i686-linux" then
requireFile {
name = "jdk-${productVersion}u${patchVersion}-linux-i586.tar.gz";
url = downloadUrl;
sha256 = sha256_i686;
}
else if stdenv.system == "x86_64-linux" then
requireFile {
name = "jdk-${productVersion}u${patchVersion}-linux-x64.tar.gz";
url = downloadUrl;
sha256 = sha256_x86_64;
}
else
abort "jdk requires i686-linux or x86_64 linux";
nativeBuildInputs = [ file ]
++ stdenv.lib.optional installjce unzip;
# See: https://github.com/NixOS/patchelf/issues/10
dontStrip = 1;
installPhase = ''
cd ..
# Set PaX markings
exes=$(file $sourceRoot/bin/* $sourceRoot/jre/bin/* 2> /dev/null | grep -E 'ELF.*(executable|shared object)' | sed -e 's/: .*$//')
for file in $exes; do
paxmark m "$file"
# On x86 for heap sizes over 700MB disable SEGMEXEC and PAGEEXEC as well.
${stdenv.lib.optionalString stdenv.isi686 ''paxmark msp "$file"''}
done
if test -z "$installjdk"; then
mv $sourceRoot/jre $out
else
mv $sourceRoot $out
fi
for file in $out/*
do
if test -f $file ; then
rm $file
fi
done
if test -n "$installjdk"; then
for file in $out/jre/*
do
if test -f $file ; then
rm $file
fi
done
fi
# construct the rpath
rpath=
for i in $libraries; do
rpath=$rpath''${rpath:+:}$i/lib:$i/lib64
done
if test -z "$installjdk"; then
jrePath=$out
else
jrePath=$out/jre
fi
if test -n "${jce}"; then
unzip ${jce}
cp -v UnlimitedJCEPolicy/*.jar $jrePath/lib/security
fi
rpath=$rpath''${rpath:+:}$jrePath/lib/${architecture}/jli
rpath=$rpath''${rpath:+:}$jrePath/lib/${architecture}/server
rpath=$rpath''${rpath:+:}$jrePath/lib/${architecture}/xawt
rpath=$rpath''${rpath:+:}$jrePath/lib/${architecture}
# set all the dynamic linkers
find $out -type f -perm +100 \
-exec patchelf --interpreter "$(cat $NIX_GCC/nix-support/dynamic-linker)" \
--set-rpath "$rpath" {} \;
find $out -name "*.so" -exec patchelf --set-rpath "$rpath" {} \;
if test -z "$pluginSupport"; then
rm -f $out/bin/javaws
if test -n "$installjdk"; then
rm -f $out/jre/bin/javaws
fi
fi
mkdir $jrePath/lib/${architecture}/plugins
ln -s $jrePath/lib/${architecture}/libnpjp2.so $jrePath/lib/${architecture}/plugins
mkdir -p $out/nix-support
echo -n "${setJavaClassPath}" > $out/nix-support/propagated-native-build-inputs
# Set JAVA_HOME automatically.
cat <<EOF >> $out/nix-support/setup-hook
if [ -z "\$JAVA_HOME" ]; then export JAVA_HOME=$out; fi
EOF
'';
inherit installjdk pluginSupport;
/**
* libXt is only needed on amd64
*/
libraries =
[stdenv.gcc.libc glib libxml2 libav_0_8 ffmpeg libxslt mesa_noglu xlibs.libXxf86vm alsaLib fontconfig freetype gnome.pango gnome.gtk cairo gdk_pixbuf atk] ++
(if swingSupport then [xlibs.libX11 xlibs.libXext xlibs.libXtst xlibs.libXi xlibs.libXp xlibs.libXt xlibs.libXrender stdenv.gcc.gcc] else []);
passthru.mozillaPlugin = if installjdk then "/jre/lib/${architecture}/plugins" else "/lib/${architecture}/plugins";
passthru.jre = result; # FIXME: use multiple outputs or return actual JRE package
meta.license = "unfree";
}; in result

View File

@@ -0,0 +1,273 @@
#!/bin/bash
# construct.sh
# example construction of JRE and JDK directories from the DLJ bundles
#
# Copyright © 2006 Sun Microsystems, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Sun, Sun Microsystems, the Sun logo and Java, Java HotSpot,
# and JVM trademarks or registered trademarks of Sun Microsystems,
# Inc. in the U.S. and other countries.
program=`basename $0`
usage () {
echo "usage: ${program} path/to/unbundle-jdk path/to/linux-jdk path/to/linux-jre"
}
getargs() {
undir=$1
jdkdir=$2
jredir=$3
if [ ! -d $undir ]; then
echo "${program}: unbundle directory not found: $undir"
exit 2
fi
# make sure javahome is the JDK
javahome=`echo $undir/*/db/demo`
if [ ! -d $javahome ]; then
echo "${program}: unbundle directory incorrect: $undir"
echo " expecting $undir/jdk1.5.0_xx"
exit 2
else
javahome=$(dirname $(dirname $javahome))
fi
# verify JDK dir
jdkdirp=`dirname $jdkdir`
jdkbase=`basename $jdkdir`
if [ ! -d $jdkdirp ]; then
echo "${program}: parent directory for JDK does not exist: $jdkdirp"
exit 2
fi
savedir=`pwd`
cd $jdkdirp
jdkdirp=`pwd`
cd $savedir
jdkdir=$jdkdirp/$jdkbase
# verify JRE dir
jredirp=`dirname $jredir`
jrebase=`basename $jredir`
if [ ! -d $jredirp ]; then
echo "${program}: parent directory for JRE does not exist: $jredirp"
exit 2
fi
savedir=`pwd`
cd $jredirp
jredirp=`pwd`
cd $savedir
jredir=$jredirp/$jrebase
}
checkfiles() {
if [ -r $jdkdir ]; then
echo "${program}: directory for JDK already exists: $jdkdir"
exit 2
fi
if [ -r $jredir ]; then
echo "${program}: directory for JRE already exists: $jredir"
exit 2
fi
}
copytree() {
echo "copying over the JDK tree..."
cp -a $javahome $jdkdir
}
linkrel() {
target=$1
link=$2
# make a softlink from the $link to the $target
# make this a relative link
targetb=(`echo $target | tr '/' ' '`)
linkb=(`echo $link | tr '/' ' '`)
(( n = ${#targetb[*]} ))
(( m = ${#linkb[*]} ))
c=$n # common length
if [ $m -lt $c ]; then
(( c = m ))
fi
for (( i = 0 ; i < c ; i++ )); do
if [ ${targetb[$i]} != ${linkb[$i]} ]; then
# echo components differ, stopping
break
fi
done
rel=""
for (( j = i + 1; j < m ; j++ )); do
if [ -z $rel ]; then
rel=".."
else
rel="$rel/.."
fi
done
for (( j = i; j < n ; j++ )); do
if [ -z $rel ]; then
rel=${targetb[$j]}
else
rel="$rel/${targetb[$j]}"
fi
done
ln -s $rel $link
}
createjre() {
echo "creating JRE directory..."
# absolute link
# ln -s $jdkdir/jre $jredir
# relative link
linkrel $jdkdir/jre $jredir
}
unpackjars() {
echo "unpacking jars..."
unpack200=$jdkdir/bin/unpack200
if [ ! -x $unpack200 ]; then
echo "${program}: file missing $unpack200"
exit 1
fi
cd $jdkdir
PACKED_JARS=`find . -name '*.pack'`
for i in $PACKED_JARS; do
# echo $i
jdir=`dirname $i`
jbase=`basename $i .pack`
if ! $unpack200 $jdkdir/$jdir/$jbase.pack $jdkdir/$jdir/$jbase.jar; then
echo "${program}: error unpacking $jdkdir/$jdir/$jbase.jar"
fi
if [ ! -r $jdkdir/$jdir/$jbase.jar ]; then
echo "${program}: missing $jdkdir/$jdir/$jbase.jar"
else
echo " $jdir/$jbase.jar"
# remove pack file
rm $jdkdir/$jdir/$jbase.pack
fi
done
}
preparecds() {
# if this is a client installation...
compiler="`$jdkdir/bin/java -client -version 2>&1 | tail -n +3 | cut -d' ' -f1-4`"
if [ "X$compiler" = "XJava HotSpot(TM) Client VM" ]; then
# create the CDS archive
echo "creating the class data sharing archive..."
if ! $jdkdir/bin/java -client -Xshare:dump > /dev/null 2>&1; then
echo "returned error code $?"
fi
fi
}
jreman () {
echo "setting up the JRE man pages..."
# note this list is slightly different for OpenSolaris bundles
jreman=/tmp/jre.man.txt
cat <<EOF > $jreman
man/ja_JP.eucJP/man1/java.1
man/ja_JP.eucJP/man1/javaws.1
man/ja_JP.eucJP/man1/keytool.1
man/ja_JP.eucJP/man1/orbd.1
man/ja_JP.eucJP/man1/pack200.1
man/ja_JP.eucJP/man1/policytool.1
man/ja_JP.eucJP/man1/rmid.1
man/ja_JP.eucJP/man1/rmiregistry.1
man/ja_JP.eucJP/man1/servertool.1
man/ja_JP.eucJP/man1/tnameserv.1
man/ja_JP.eucJP/man1/unpack200.1
man/man1/java.1
man/man1/javaws.1
man/man1/keytool.1
man/man1/orbd.1
man/man1/pack200.1
man/man1/policytool.1
man/man1/rmid.1
man/man1/rmiregistry.1
man/man1/servertool.1
man/man1/tnameserv.1
man/man1/unpack200.1
EOF
# create jre/man directory
# mkdir $jdkdir/jre/man
# move the real JRE man pages to jre/man
# link the JDK JRE man pages to jre/man
# real JDK man pages stay where they are
for m in `cat $jreman`; do
manpath=`dirname $jdkdir/jre/$m`
mkdir -p $manpath
mv $jdkdir/$m $jdkdir/jre/$m
linkrel $jdkdir/jre/$m $jdkdir/$m
done
# link in Japanese man pages
ln -s ja_JP.eucJP $jdkdir/jre/man/ja
rm $jreman
}
elimdups() {
echo "eliminating duplication between the JDK and JDK/jre..."
jdkcomm=/tmp/jdk.bin.comm.txt
cat <<EOF > $jdkcomm
bin/ControlPanel
bin/java
bin/javaws
bin/keytool
bin/orbd
bin/pack200
bin/policytool
bin/rmid
bin/rmiregistry
bin/servertool
bin/tnameserv
bin/unpack200
EOF
# note there is little point in linking these common files
# COPYRIGHT
# LICENSE
# THIRDPARTYLICENSEREADME.txt
# And this file is unique to the JDK
# README.html
# And these files are unique to the JDK/jre/
# CHANGES
# README
# Welcome.html
for p in `cat $jdkcomm`; do
rm $jdkdir/$p
# this is a relative link
ln -s ../jre/$p $jdkdir/$p
done
rm $jdkcomm
}
if [ $# -eq 3 ] ; then
getargs $1 $2 $3
checkfiles
copytree
createjre
unpackjars
preparecds
jreman
elimdups
else
usage
exit 1
fi
exit 0

View File

@@ -0,0 +1,84 @@
{ swingSupport ? true
, stdenv
, requireFile
, unzip
, makeWrapper
, xlibs ? null
, installjdk ? true
, pluginSupport ? true
, installjce ? false
}:
assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux";
assert swingSupport -> xlibs != null;
let
/**
* The JRE libraries are in directories that depend on the CPU.
*/
architecture =
if stdenv.system == "i686-linux" then
"i386"
else if stdenv.system == "x86_64-linux" then
"amd64"
else
abort "jdk requires i686-linux or x86_64 linux";
jce =
if installjce then
requireFile {
name = "jce_policy-6.zip";
url = http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html;
sha256 = "0qljzfxbikm8br5k7rkamibp1vkyjrf6blbxpx6hn4k46f62bhnh";
}
else
null;
in
stdenv.mkDerivation {
name =
if installjdk then "jdk-1.6.0_45b06" else "jre-1.6.0_45b06";
src =
if stdenv.system == "i686-linux" then
requireFile {
name = "jdk-6u45-linux-i586.bin";
url = http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html;
sha256 = "0mx3d2qlal5zyz1a7ld1yk2rs8pf9sjxs2jzasais3nq30jmlfym";
}
else if stdenv.system == "x86_64-linux" then
requireFile {
name = "jdk-6u45-linux-x64.bin";
url = http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html;
sha256 = "1s0j1pdr6y8c816d9i86rx4zp12nbhmas1rxksp0r53cn7m3ljbb";
}
else
abort "jdk requires i686-linux or x86_64 linux";
builder = ./dlj-bundle-builder.sh;
/**
* If jdk5 is added, make sure to use the original construct script.
* This copy removes references to kinit, klist, ktab, which seem to be
* gone in jdk6.
*/
construct = ./jdk6-construct.sh;
inherit installjdk;
buildInputs = [unzip makeWrapper];
/**
* libXt is only needed on amd64
*/
libraries =
[stdenv.gcc.libc] ++
(if swingSupport then [xlibs.libX11 xlibs.libXext xlibs.libXtst xlibs.libXi xlibs.libXp xlibs.libXt] else []);
inherit swingSupport pluginSupport architecture jce;
inherit (xlibs) libX11;
mozillaPlugin = if installjdk then "/jre/lib/${architecture}/plugins" else "/lib/${architecture}/plugins";
meta.license = "unfree";
}

View File

@@ -0,0 +1,10 @@
import ./jdk-linux-base.nix {
productVersion = "7";
patchVersion = "65";
downloadUrl = http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html;
sha256_i686 = "e3032c561deb237c033b485a358cc429ec83b621303bc6b31768855778a9eaa0";
sha256_x86_64 = "33fac9630ca8c2d374247abc5c010ac8d2875a3384968aa3e74448361808e4b7";
jceName = "UnlimitedJCEPolicyJDK7.zip";
jceDownloadUrl = http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html;
sha256JCE = "7a8d790e7bd9c2f82a83baddfae765797a4a56ea603c9150c87b7cdb7800194d";
}

View File

@@ -0,0 +1,10 @@
import ./jdk-linux-base.nix {
productVersion = "8";
patchVersion = "5";
downloadUrl = http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html;
sha256_i686 = "779f83efb8dc9ce7c1143ba9bbd38fa2d8a1c49dcb61f7d36972d37d109c5fc9";
sha256_x86_64 = "44901389e9fb118971534ad0f58558ba8c43f315b369117135bd6617ae631edc";
jceName = "jce_policy-8.zip";
jceDownloadUrl = http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html;
sha256JCE = "f3020a3922efd6626c2fff45695d527f34a8020e938a49292561f18ad1320b59";
}