Take a look at the comments and code in update.sh
.
Requires a working version of Java 1.8.
I use create_tarball.sh
to make a copy of the build to share.
OpenJDK 1.7 builds for Mac OS X:
Take a look at the comments and code in update.sh
.
Requires a working version of Java 1.8.
I use create_tarball.sh
to make a copy of the build to share.
OpenJDK 1.7 builds for Mac OS X:
#!/bin/sh | |
# | |
# Building the Java 1.8 Da Vinci Machine (mlvm) on Mac OS X | |
# | |
# filename: update.sh | |
# latest version available here: http://gist.github.com/243072 | |
# | |
# Stephen Bannasch | |
# | |
# When this script runs it assumes: | |
# Apple's Mac OX X Xcode developer tools (and command-line tools) are installed | |
# hg (mercurial) is installed | |
# The forest extension to hg is installed | |
# The hsx/hotspot-comp port forest is checked out into: ./sources/ | |
# The mlvm patchsets are checked out into: ./patches/ | |
# A working version of Java 1.8 is installed. | |
# jtreg 4.1 is installed and the linux/jtreg shell script is on the path | |
# see: http://openjdk.java.net/jtreg/ | |
# | |
# References: | |
# http://wikis.sun.com/display/mlvm | |
# http://wikis.sun.com/display/mlvm/Building | |
# http://hg.openjdk.java.net/mlvm/mlvm/file/tip/README.txt | |
# http://bit.ly/8TKqcS | |
# http://code.google.com/p/openjdk-osx-build/ | |
# http://hg.openjdk.java.net/jdk7/build/raw-file/tip/README-builds.html | |
# http://sourceforge.net/projects/jibx/files/ | |
# http://blogs.sun.com/jjg/entry/building_javac_for_jdk7 | |
# http://blogs.sun.com/kto/entry/anatomy_of_the_jdk_build | |
# | |
# http://hgbook.red-bean.com/read/advanced-uses-of-mercurial-queues.html | |
# | |
# Prerequisites: | |
# Mac OS X Java 1.8 | |
# A working version of Java 1.8 | |
# Binary distributions are available here: http://code.google.com/p/openjdk-osx-build/ | |
# | |
# Once installed you should be able to successfully run this command: | |
# $ `/usr/libexec/java_home --version 1.8`/bin/java -version | |
# | |
# and see something like this: | |
# openjdk version "1.8.0-internal" | |
# OpenJDK Runtime Environment (build 1.8.0-internal-stephen_2012_03_07_18_02-b00) | |
# OpenJDK 64-Bit Server VM (build 23.0-b16, mixed mode) | |
# | |
# Apple's Mac OX X Xcode developer tools (and command-line tools) are installed | |
# Newer versions of Xcode might require this command to select the path to the Xcode | |
# folder for Xcode command-line BSD tools: | |
# | |
# sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer | |
# | |
# Basic setup after installing prerequisites: | |
# mkdir mlvm | |
# cd mlvm | |
# curl http://gist.github.com/raw/243072/update.sh -o update.sh | |
# hg fclone http://hg.openjdk.java.net/hsx/hotspot-comp sources | |
# hg fclone http://hg.openjdk.java.net/mlvm/mlvm patches | |
# | |
# Building: | |
# cd mlvm | |
# ./update.sh | |
# | |
# After building this script will first test if | |
# the new build can report it's version number: | |
# | |
# $ build/macosx-x86_64/j2sdk-image/bin/java -version | |
# openjdk version "1.8.0-internal" | |
# OpenJDK Runtime Environment (build 1.8.0-internal-stephen_2012_07_11_11_41-b00) | |
# OpenJDK 64-Bit Server VM (build 24.0-b16, mixed mode) | |
# | |
# Then it will use jtreg to run the following jtreg-based unit tests: | |
# | |
# jdk/test/java/lang/invoke/ | |
# jdk/test/java/dyn/CoroutineTest.java | |
# | |
# Additionaly Swing is tested by running running SwingSet2.jar. | |
# This makes sure the X11 freetype libraries are being integrated correctly | |
# | |
# More about MVLM Guarded Patches | |
# | |
# Enable a guarded patch: | |
# +foo | |
# -/foo *this form is a double negative. It may be needed (besides plain +foo) | |
# due to the rules hg uses to total up the effects of all the guards | |
# | |
# Disable a guarded patch: | |
# /foo | |
# | |
# See: | |
# hg qguard --help | |
# hg qguard -l | |
# | |
# Here's a list of the possible guards for the different directories of | |
# the build (produced Jul 15 2012): | |
# | |
# sources | |
# [sources ]$ hg qguard -l | |
# macosx-7113349.patch: -/macosx +1533dfab9903 | |
# | |
# jdk | |
# [jdk ]$ hg qguard -l | |
# meth-lazy-7023639.patch: -/meth +78f1f4e4e9c7 | |
# meth-lazy-7023639.init.patch: -/meth +78f1f4e4e9c7 | |
# meth-lazy-7023639.bmh.patch: -/meth +78f1f4e4e9c7 | |
# meth-7177472.patch: -buildable | |
# indy.pack.patch: -/meth +78f1f4e4e9c7 -buildable | |
# meth.patch: -/meth +78f1f4e4e9c7 | |
# dyncast.patch: +dyncast -/dyncast | |
# inti.patch: +inti -/inti -buildable | |
# callcc_old.patch: +callcc_old -/callcc_old | |
# continuation.patch: +continuation -/continuation | |
# tailc.patch: +tailc -/tailc | |
# anonk.patch: -/anonk +78f1f4e4e9c7 | |
# coro.patch: +coro -/coro | |
# tuple-tsig.patch: -/tuple -testable | |
# | |
# hotspot | |
# [hotspot ]$ hg qguard -l | |
# meth-lazy-7023639.patch: -/meth +ed21db7b3fda | |
# meth-lazy-7023639.review.patch: -/meth +ed21db7b3fda | |
# meth.patch: -/meth +ed21db7b3fda | |
# meth.proj.patch: -/meth +projects | |
# anonk.proj.patch: -/anonk +projects | |
# tagu.patch: +tagu -/tagu +ed21db7b3fda -buildable | |
# inti.patch: +inti -/inti +d1605aabd0a1 +jdk7-b30 -buildable | |
# callcc_old.patch: +callcc_old -/callcc_old +d6d1af32c5f9 -testable | |
# continuation.patch: +continuation -/continuation +4afae810a801 | |
# tailc.patch: +tailc-lazy -/tailc -tailc-eager | |
# tailc-eager.patch: +tailc-lazy -/tailc -tailc-lazy | |
# hotswap.patch: +hotswap -/hotswap | |
# hotswaplight.patch: +hotswaplight -/hotswaplight | |
# coro-meth.patch: +coro -/meth -/coro | |
# coro.patch: +coro -/coro | |
# tuple-tsig.patch: +tuple -/tuple -testable | |
# | |
# langtools | |
# [langtools ]$ hg qguard -l | |
# netbeans-project.patch: +netbeans-project | |
# dump-stack-on-error.patch: +dump-stack-on-error | |
# indy-bsm-6964498.patch: -/meth +cfc480e5499d -/experimental -testable | |
# indy-args-6984311.patch: -/indy +cfc480e5499d -/experimental -testable | |
# meth-ldc-6939203.patch: -/meth +cfc480e5499d -/experimental -testable | |
# meth-ver-6949040.patch: -/meth +cfc480e5499d -testable | |
# meth-anno.patch: -/meth +cfc480e5499d -/experimental -testable | |
# dyncast.patch: +dyncast -/dyncast | |
# tailc.patch: +tailc -/tailc | |
# | |
MLVM=$(pwd) | |
JDK_UPDATE_VERSION=00 | |
SYSTEM_JAVA_1_8=`/usr/libexec/java_home --version 1.8` | |
BUILD_JOBS=$(sysctl -n hw.ncpu) | |
SWINGSET2_JAR=/Users/stephen/dev/java/SwingSet2/SwingSet2.jar | |
BUILD="build/macosx-x86_64/j2sdk-bundle/jdk1.8.0.jdk" | |
BUILT_IMAGE="$BUILD/Contents/Home/bin/java" | |
JTREG_INVOKE="jtreg -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -ignore:quiet -concurrency:$BUILD_JOBS -jdk:$BUILD/Contents/Home" | |
# | |
# Specify which MLVM guarded patches should be applied in the shell variable: guards | |
# | |
export davinci=$(pwd) | |
export guards="buildable testable" | |
# | |
# process optional arguments | |
# | |
TEST_ONLY=0 | |
UPDATE_SOURCE_AND_PATCHES=1 | |
SOURCE_AND_PATCHES_ONLY=0 | |
CORO="" | |
while [ "$1" != "" ]; do | |
case $1 in | |
-t | --test ) shift | |
TEST_ONLY=1 | |
;; | |
-b | --build-and-test-only ) shift | |
UPDATE_SOURCE_AND_PATCHES=0 | |
;; | |
-s | --source-and-patches-only ) shift | |
SOURCE_AND_PATCHES_ONLY=1 | |
;; | |
-c | --coro ) shift | |
CORO="coro" | |
export guards="$guards $CORO" | |
;; | |
-h | --help ) | |
echo ' | |
usage: ./update.sh [[-t, --test ] | [-s, --source-and-patches-only] | [-b, --build-and-test-only] [-c, --coro ] | [-h, --help]]' | |
exit | |
;; | |
esac | |
done | |
# If COMMAND_MODE=legacy then the archive command: 'ar' will not create or update | |
# catalog entries when creating an archive resulting in errors like this: | |
# | |
# libfdlibm.i586.a, archive has no table of contents | |
# | |
# This only appears to be a problem when using iTerm as the terminal program. | |
# Using the Terminal.app program that comes with Mac OS X sets COMMAND_MODE=unix2003. | |
# See: http://old.nabble.com/Why-ar-doesn't-call-ranlib-on-Mac--td22319721.html | |
if [ "$COMMAND_MODE" = "legacy" ] | |
then | |
echo ' | |
*** changing COMMAND_MODE from legacy to unix2003 | |
' | |
export COMMAND_MODE=unix2003 | |
fi | |
######################################## | |
# | |
# Functions | |
# | |
######################################## | |
# -------------------------------------- | |
# | |
# function: prerequisites | |
# | |
# test for prerequisites | |
# | |
# -------------------------------------- | |
function prerequisites | |
{ | |
if [ ! -e $SWINGSET2_JAR ] | |
then | |
echo " | |
*** SwingSet2 jar file not found at this path: $SWINGSET2_JAR | |
" | |
exit | |
fi | |
} | |
# -------------------------------------- | |
# | |
# function: updatesource | |
# | |
# update source and patch forests and integrate patches into source tree | |
# | |
# -------------------------------------- | |
function updatesource | |
{ | |
cd $MLVM/sources | |
echo " | |
*** using MLVM Guards: $guards | |
*** popping previously applied patches to sources/ and jdk8 hsx/hotspot-comp sources: hotspot, jdk, and langtools ..." | |
echo ' | |
[sources] ' | |
hg qpop -a | |
echo ' | |
[hotspot] ' | |
cd hotspot; hg qpop -a; cd - | |
echo ' | |
[jdk] ' | |
cd jdk; hg qpop -a; cd - | |
echo ' | |
[langtools] ' | |
cd langtools; hg qpop -a; cd - | |
echo ' | |
*** updating hsx/hotspot-comp sources... | |
' | |
hg fpull -u | |
echo ' | |
*** updating mlvm patchsets ... | |
' | |
cd ../patches | |
hg fpull -u | |
cd .. | |
echo ' | |
*** integrating mlvm patchsets into hsx/hotspot-comp sources ... | |
*** creating symbolic links to the patch directories from the corresponding .hg directories of the full source | |
' | |
bash patches/make/link-patch-dirs.sh sources patches | |
ln -s ../../../patches/hotspot sources/hotspot/.hg/patches | |
ln -s ../../../patches/jdk sources/jdk/.hg/patches | |
ls -il patches/hotspot/series sources/hotspot/.hg/patches/series | |
echo ' | |
*** running: hg qselect --pop $guards | |
' | |
sh patches/make/each-patch-repo.sh "hg qselect --pop $guards" '$(sh $davinci/patches/make/current-release.sh)' | |
echo ' | |
*** running: hg qselect; hg qunapplied | |
' | |
sh patches/make/each-patch-repo.sh "hg qselect; hg qunapplied" | |
echo ' | |
*** running: hg update -r | |
' | |
sh patches/make/each-patch-repo.sh "hg update -r" '$(sh $davinci/patches/make/current-release.sh)' | |
echo ' | |
*** running: hg qpush -a | |
' | |
sh patches/make/each-patch-repo.sh "hg qpush -a" | |
} | |
# -------------------------------------- | |
# | |
# function: build | |
# | |
# build MLVM | |
# | |
# -------------------------------------- | |
function build | |
{ | |
cd $MLVM/sources | |
echo ' | |
*** cleaning previous build products ... | |
' | |
# delete the previous build dir in the background if it exists | |
if [ -e build ] | |
then | |
mv build build.del; rm -rf build.del & | |
fi | |
# Remove file with versioned name of last build and symbolic link to last build. | |
# Used when referring to a build when copying to /usr/local or creating a tarball. | |
if [ -e .last_build ] | |
then | |
echo ' | |
*** removing references to last build | |
' | |
buildname=`cat .last_build` | |
rm -f .last_build | |
rm -f $buildname | |
fi | |
# Save a name with the date to use when referring to this build when | |
# copying to ~/Library/Java/JavaVirtualMachines or creating a tarball later. | |
buildname=1.8.0_$JDK_UPDATE_VERSION-mlvm-`date "+%Y_%m_%d".jdk` | |
echo ' | |
*** building davinci (mlvm) ... | |
' | |
export LC_ALL=C | |
export LANG=C | |
unset CLASSPATH | |
unset JAVA_HOME | |
unset LD_LIBRARY_PATH | |
# include the following to enable a FASTDEBUG build: | |
# DEBUG_NAME=fastdebug | |
# and remove the following: | |
# SKIP_FASTDEBUG_BUILD=true | |
# SKIP_DEBUG_BUILD=true | |
sets=" | |
LD_LIBRARY_PATH= | |
CLASSPATH= | |
JAVA_HOME= | |
LC_ALL=C | |
LANG=C | |
LP64=1 | |
OPENJDK=true | |
ARCH_DATA_MODEL=64 | |
ALT_BOOTDIR=$SYSTEM_JAVA_1_8 | |
ALT_JDK_IMPORT_PATH=$SYSTEM_JAVA_1_8 | |
ANT_HOME=/usr/share/ant | |
NO_DOCS=true | |
NO_DEMOS=true | |
NO_SAMPLES=true | |
BUILD_LANGTOOLS=true | |
BUILD_HOTSPOT=true | |
BUILD_JDK=true | |
BUILD_CORBA=false | |
BUILD_DEPLOY=false | |
BUILD_INSTALL=false | |
BUILD_JAXP=false | |
BUILD_JAXWS=false | |
BUILD_SPONSORS=false | |
HOTSPOT_BUILD_JOBS=$BUILD_JOBS | |
SKIP_FASTDEBUG_BUILD=true | |
SKIP_DEBUG_BUILD=true | |
SA_APPLE_BOOT_JAVA=true | |
ALWAYS_PASS_TEST_GAMMA=true | |
ALLOW_DOWNLOADS=true | |
CC=$( xcrun -find gcc ) | |
CXX=$( xcrun -find g++ ) | |
" | |
echo ' | |
*** executing sets into the environment ... | |
' | |
# Execute the above sets, into the environment. | |
for s in $sets; do eval export $s; done | |
echo ' | |
*** preview sets in command line ... | |
' | |
# Preview sets in command line | |
for s | |
do case $s in | |
*'[ ;]'*) break;; | |
*'='*) eval "$s";; | |
*) break;; | |
esac | |
done | |
echo ' | |
*** running make ... | |
' | |
# Run make, or whatever, in the resulting environment. | |
eval "${@-make}" | |
echo " | |
*** create symbolic link to last build and persist $buildname into .last_build | |
" | |
ln -Ffs $BUILD/ $buildname | |
echo $buildname > .last_build | |
} | |
# -------------------------------------- | |
# | |
# function: testbuild | |
# | |
# test most recent build | |
# 1. java -version | |
# 2. jtreg: jdk/test/java/lang/invoke | |
# ** if CORO build enabled (-c, --coro) also: jdk/test/java/dyn/CoroutineTest.java | |
# 3. SwingSet2.jar | |
# | |
# -------------------------------------- | |
function testbuild | |
{ | |
cd $MLVM/sources | |
if [ -e $BUILT_IMAGE ] | |
then | |
echo " | |
*** smoketest build: | |
$BUILT_IMAGE -version" | |
$BUILT_IMAGE -version | |
echo " | |
*** running jdk/test/java/lang/invoke tests: | |
$JTREG_INVOKE -v:summary jdk/test/java/lang/invoke/" | |
$JTREG_INVOKE -v:summary jdk/test/java/lang/invoke/ | |
if [ -n "$CORO" ] | |
then | |
echo " | |
*** running jdk/test/java/dyn/CoroutineTest.java test: | |
$JTREG_INVOKE -v:summary jdk/test/java/dyn/CoroutineTest.java" | |
$JTREG_INVOKE -v:summary jdk/test/java/dyn/CoroutineTest.java | |
fi | |
echo " | |
*** testing Swing by running SwingSet2.jar: | |
./$BUILT_IMAGE -jar $SWINGSET2_JAR" | |
./$BUILT_IMAGE -jar $SWINGSET2_JAR& | |
else | |
echo "$BUILT_IMAGE does not exist, rebuild MLVM with ./update.sh"; exit | |
fi | |
} | |
# -------------------------------------- | |
# | |
# function: epilog | |
# | |
# describe how to install new jdk bundle | |
# | |
# -------------------------------------- | |
function epilog | |
{ | |
if [ -e .last_build ] | |
then buildname=`cat .last_build` | |
else echo "file '.last_build' does not exist"; exit | |
fi | |
echo " | |
*** if the build worked install with this command: | |
cp -r sources/$buildname ~/Library/Java/JavaVirtualMachines | |
*** after installation the new Java should appear in the list generated when running this command: | |
/usr/libexec/java_home --version 1.8 -V | |
" | |
} | |
######################################## | |
# | |
# Main | |
# | |
######################################## | |
prerequisites | |
if [ "$TEST_ONLY" = "0" ] | |
then | |
if [ "$UPDATE_SOURCE_AND_PATCHES" = "1" ] | |
then | |
updatesource | |
fi | |
if [ "$SOURCE_AND_PATCHES_ONLY" = "0" ] | |
then | |
build | |
fi | |
fi | |
if [ "$SOURCE_AND_PATCHES_ONLY" = "0" ] | |
then | |
testbuild | |
epilog | |
fi |