274 lines
6.6 KiB
Bash
274 lines
6.6 KiB
Bash
#!/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
|
|
|