OpenJDK 1.7 for OS/X continuous build with Hudson – Episode 3

Last Updated on Samedi, 4 décembre 2010 11:50 Written by Henri Gomez Vendredi, 26 novembre 2010 09:55

Gildas and I create a project on GoogleCode where we’ll maintain build/package scripts and provide packages.

My Dropbox download page was overloaded and we needed another location, here is it :

http://code.google.com/p/openjdk-osx-build/

Contributors are very welcome, especially OS/X gurus

Learn More

OpenJDK 1.7 for OS/X continuous build with Hudson – Episode 2

Last Updated on Samedi, 4 décembre 2010 11:51 Written by Henri Gomez Jeudi, 25 novembre 2010 09:49

First episode of OpenJDK 1.7 for OS/X covered build of 32 and 64 bits VM via Hudson.

We ended with two VMs, 32bits was under build/bsd-i586/j2sdk-image and 64bits in build/bsd-amd64/j2sdk-image
And here appears a new OS/X jedi, Gildas, providing .PKG and .DMG scripting.

This episode will describe how packaging, PKG and DMG was done.

OS/X Package .PKG

First we need to transform j2sdk-image folder into .PKG

We used OS/X packagemaker, provided by XCode :

  /Developer/usr/bin/packagemaker \
    --title "Open JDK 7 (32bits) for OS X Installer" \
    --version 1.0 \
    --filter "\.DS_Store" \
    --root-volume-only \
    --domain system \
    --verbose \
    --no-relocate \
    -l "/Library/Java/JavaVirtualMachines/openjdk-1.7-i586" \
    --target 10.5 \
    --id net.openjdk.java.i586.pkg \
    --root ${SOURCE_DIR} \
    --out ${BUILD_DIR}/openjdk-1.7-i586.pkg \
    -v

From .PKG to .DMG

Next step is to transform the .PKG into a mountable image .DMG.
Here we used hdiutil :

  hdiutil create -srcfolder ${BUILD_DIR}/openjdk-1.7-i586.pkg -volname 'Open JDK 7 (32bits)' -fs HFS+ -fsargs '-c c=64,a=16,e=16' -format UDRW ${BUILD_DIR}/openjdk-1.7-i586-tmp.dmg
  hdiutil convert ${BUILD_DIR}/openjdk-1.7-i586-tmp.dmg -format UDZO -imagekey zlib-level=9 -o ${BUILD_DIR}/OpenJDK-1.7-i586.dmg

Scripts for 32 and 64bits VM

The following scripts could be added at the end of the Hudson script zone, or called in a second pass.

32bits

#!/bin/bash

SOURCE_DIR=`pwd`/build/bsd-i586/j2sdk-image
BUILD_DIR=`pwd`/java-osx
DMG_MOUNT_DIR=$BUILD_DIR/mount

mkdir -p ${BUILD_DIR}

if [ -x build/bsd-i586/j2sdk-image/bin/java ]; then

  rm -f ${BUILD_DIR}/OpenJDK-1.7-i586.dmg ${BUILD_DIR}/openjdk-1.7-i586.pkg

  /Developer/usr/bin/packagemaker \
    --title "Open JDK 7 (32bits) for OS X Installer" \
    --version 1.0 \
    --filter "\.DS_Store" \
    --root-volume-only \
    --domain system \
    --verbose \
    --no-relocate \
    -l "/Library/Java/JavaVirtualMachines/openjdk-1.7-i586" \
    --target 10.5 \
    --id net.openjdk.java.i586.pkg \
    --root ${SOURCE_DIR} \
    --out ${BUILD_DIR}/openjdk-1.7-i586.pkg \
    -v

  hdiutil create -srcfolder ${BUILD_DIR}/openjdk-1.7-i586.pkg -volname 'Open JDK 7 (32bits)' -fs HFS+ -fsargs '-c c=64,a=16,e=16' -format UDRW ${BUILD_DIR}/openjdk-1.7-i586-tmp.dmg
  hdiutil convert ${BUILD_DIR}/openjdk-1.7-i586-tmp.dmg -format UDZO -imagekey zlib-level=9 -o ${BUILD_DIR}/OpenJDK-1.7-i586.dmg

  rm -f ${BUILD_DIR}/openjdk-1.7-i586-tmp.dmg

else

  echo "no valid exec under build/bsd-i586/j2sdk-image/bin/java, packaging skipped"

fi

64bits

#!/bin/bash

SOURCE_DIR=`pwd`/build/bsd-amd64/j2sdk-image
BUILD_DIR=`pwd`/java-osx
DMG_MOUNT_DIR=$BUILD_DIR/mount

mkdir -p ${BUILD_DIR}

if [ -x build/bsd-amd64/j2sdk-image/bin/java ]; then

  rm -f ${BUILD_DIR}/OpenJDK-1.7-x86_64.dmg ${BUILD_DIR}/openjdk-1.7-x86_64.pkg

  /Developer/usr/bin/packagemaker \
    --title "Open JDK 7 (64bits) for OS X Installer" \
    --version 1.0 \
    --filter "\.DS_Store" \
    --root-volume-only \
    --domain system \
    --verbose \
    --no-relocate \
    -l "/Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64" \
    --target 10.5 \
    --id net.openjdk.java.x86_64.pkg \
    --root ${SOURCE_DIR} \
    --out ${BUILD_DIR}/openjdk-1.7-x86_64.pkg \
    -v

  hdiutil create -srcfolder ${BUILD_DIR}/openjdk-1.7-x86_64.pkg -volname 'Open JDK 7 (64bits)' -fs HFS+ -fsargs '-c c=64,a=16,e=16' -format UDRW ${BUILD_DIR}/openjdk-1.7-x86_64-tmp.dmg
  hdiutil convert ${BUILD_DIR}/openjdk-1.7-x86_64-tmp.dmg -format UDZO -imagekey zlib-level=9 -o ${BUILD_DIR}/OpenJDK-1.7-x86_64.dmg

  rm -f ${BUILD_DIR}/openjdk-1.7-x86_64-tmp.dmg

else

  echo "no valid exec under build/bsd-amd64/j2sdk-image/bin/java, packaging skipped"

fi

Next Step

Gildas and I, will continue to improve these basic .PKG/.DMG scripts and OS/X gurus advices are more than welcome.

Next steps is to find storage on the net so we could provide DMG regularly. Even better, an OS/X box (under SnowLeopard) available on the net, will help us provide continuous DMG.

Plus on est de fous, ….

Learn More

OpenJDK 1.7 for OS/X continuous build with Hudson

Last Updated on Mardi, 23 novembre 2010 11:53 Written by Henri Gomez Dimanche, 21 novembre 2010 02:06

I setup Hudson to create continuous build of OpenJDK 1.7 for OS/X.

Pre-requisite

Hudson jobs

I created free-style software project jobs, one for building 32 bits JVM, openjdk-1.7-i586, the other to build 64 bits JVM, openjdk-1.7-x86_64.

32 bits build job

64 bits build job

Both jobs user Mercurial Source Code Management, with Forest Extension, in sync with repository URL http://hg.openjdk.java.net/bsd-port/bsd-port.

Each one will use self sufficient script, each script will :

  • download soylatte JVMs (i386/amd64) under $HUDSON_HOME/DROP_DIR (so it could be reused for future builds).
  • jaxp, jaf and jaxws2 since these are not available from the url defined in ant build scripts. Also download under $HUDSON_HOME/DROP_DIR.
  • patch project so it will build under 32 and 64bits OS/X, and will be able to build 32bits JVM on 64bits OS/X (patches commited to OpenJDK Bugzilla #100155)

Execute shell for openjdk-1.7-i586

Take care and please get the text version of the script wordpress code plugin replacing < by lt

#!/bin/sh
#

if [ ! -z "$HUDSON_HOME" ]; then
DROP_DIR=$HUDSON_HOME/DROP_DIR
else
DROP_DIR=`pwd/DROP_DIR`
fi

DROP_DIR=$HUDSON_HOME/DROP_DIR

if [ ! -d $DROP_DIR ]; then
echo "creating DROP_DIR"
mkdir -p DROP_DIR
fi

SOYLATTE=$DROP_DIR/soylatte16-i386-1.0.3

if [ ! -d $SOYLATTE ]; then

if [ ! -f $DROP_DIR/soylatte16-i386-1.0.3.tar.bz2 ]; then
echo "downloading soylatte16-i386-1.0.3 into DROP_DIR"
curl --user jrl:"I am a Licensee in good standing" http://hg.bikemonkey.org/archive/javasrc_1_6_jrl_darwin/soylatte16-i386-1.0.3.tar.bz2 -o $DROP_DIR/soylatte16-i386-1.0.3.tar.bz2
fi

pushd $DROP_DIR
tar xjf $DROP_DIR/soylatte16-i386-1.0.3.tar.bz2
popd
fi

if [ ! -f $DROP_DIR/jaxp-1_4_4.zip ]; then
echo "downloading jaxp-1_4_4.zip into DROP_DIR"
curl http://icedtea.classpath.org/download/drops/jaxp-1_4_4.zip -o $DROP_DIR/jaxp-1_4_4.zip
fi

if [ ! -f $DROP_DIR/jdk7-jaf-2010_08_19.zip ]; then
echo "downloading jdk7-jaf-2010_08_19.zip into DROP_DIR"
curl http://icedtea.classpath.org/download/drops/jdk7-jaf-2010_08_19.zip -o $DROP_DIR/jdk7-jaf-2010_08_19.zip
fi

if [ ! -f $DROP_DIR/jdk7-jaxws2_2-2010_08_19.zip ]; then
echo "downloading jdk7-jaxws2_2-2010_08_19.zip into DROP_DIR"
curl http://icedtea.classpath.org/download/drops/jdk7-jaxws2_2-2010_08_19.zip -o $DROP_DIR/jdk7-jaxws2_2-2010_08_19.zip
fi

if [ ! -d ALT_COMPILER_PATH ]; then
echo "setup compiler dirs"
mkdir ALT_COMPILER_PATH
pushd ALT_COMPILER_PATH
ln -s /usr/bin .SOURCE
ln -s .SOURCE/g++-4.0 g++
ln -s .SOURCE/gcc-4.0 gcc
popd
fi

echo "cleaning previous build"

rm -rf build

unset CLASSPATH
unset JAVA_HOME
unset LD_LIBRARY_PATH

# patching defs.make for build on 64bits machine if required
grep -q x86_64 hotspot/make/bsd/makefiles/defs.make
if [ $? -eq 1 ] ; then
echo "patching defs.make for build on 64bits machine"
patch -p0 <<EOF
--- hotspot/make/bsd/makefiles/defs.make.orig   2010-11-20 16:09:49.000000000 +0100
+++ hotspot/make/bsd/makefiles/defs.make 2010-11-20 16:10:29.000000000 +0100
@@ -90,6 +90,24 @@
endif
endif

+# x86_64 OS/X
+ifeq (\$(ARCH), x86_64)
+  ifeq (\$(ARCH_DATA_MODEL), 64)
+    ARCH_DATA_MODEL = 64
+    MAKE_ARGS       += LP64=1
+    PLATFORM        = bsd-amd64
+    VM_PLATFORM     = bsd_amd64
+    HS_ARCH         = x86
+  else
+    ARCH_DATA_MODEL = 32
+    PLATFORM        = bsd-i586
+    VM_PLATFORM     = bsd_i486
+    HS_ARCH         = x86
+    # We have to reset ARCH to i386 since SRCARCH relies on it
+    ARCH            = i386
+  endif
+endif
+
# i386
ifeq (\$(ARCH), i386)
ifeq (\$(ARCH_DATA_MODEL), 64)
EOF
fi

# patching Platform.gmk for 32bits VM build on 64bits machine
grep -q "force i586 if 32bits VM asked" jdk/make/common/shared/Platform.gmk
if [ $? -eq 1 ] ; then
echo "patching Platform.gmk for 32bits VM on 64bits machine"
patch -p0 <<EOF1
--- jdk/make/common/shared/Platform.gmk.orig	2010-11-20 19:33:19.000000000 +0100
+++ jdk/make/common/shared/Platform.gmk	2010-11-21 00:39:18.000000000 +0100
@@ -272,6 +272,12 @@

# Darwin builds may be 32-bit or 64-bit data model.
ifeq (\$(SYSTEM_UNAME), Darwin)
+    ifeq (\$(ARCH), amd64)
+      # force i586 if 32bits VM asked
+      ifeq (\$(ARCH_DATA_MODEL), 32)
+        ARCH=i586
+      endif
+    endif
ifeq (\$(ARCH), i586)
ifeq (\$(ARCH_DATA_MODEL), 64)
ARCH=amd64
EOF1
fi

env -i PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin \
LANG=C \
CC=gcc-4.0 \
CXX=g++-4.0 \
make \
ALT_DROPS_DIR=$DROP_DIR \
ALT_BOOTDIR=$SOYLATTE \
ALT_JDK_IMPORT_PATH=$SOYLATTE \
ALT_FREETYPE_HEADERS_PATH=/usr/X11R6/include \
ALT_FREETYPE_LIB_PATH=/usr/X11R6/lib \
ALT_CUPS_HEADERS_PATH=/usr/include \
ALLOW_DOWNLOADS=true \
ANT_HOME=/usr/share/ant \
NO_DOCS=true \
HOTSPOT_BUILD_JOBS=2 \
ARCH_DATA_MODEL=32 \
ALT_COMPILER_PATH=$(pwd -P)/ALT_COMPILER_PATH/ \
LD_LIBRARY_PATH=

echo "testing build: ./build/bsd-i586/j2sdk-image/bin/java -version"

./build/bsd-i586/j2sdk-image/bin/java -version

Execute shell for openjdk-1.7-x86_64

Take care and please get the text version of the script wordpress code plugin replacing < by lt

#!/bin/sh
#

if [ ! -z "$HUDSON_HOME" ]; then
DROP_DIR=$HUDSON_HOME/DROP_DIR
else
DROP_DIR=`pwd/DROP_DIR`
fi

DROP_DIR=$HUDSON_HOME/DROP_DIR

if [ ! -d $DROP_DIR ]; then
echo "creating DROP_DIR"
mkdir -p DROP_DIR
fi

SOYLATTE=$DROP_DIR/soylatte16-amd64-1.0.3

if [ ! -d $SOYLATTE ]; then

if [ ! -f $DROP_DIR/soylatte16-amd64-1.0.3.tar.bz2 ]; then
echo "downloading soylatte16-amd64-1.0.3 into DROP_DIR"
curl --user jrl:"I am a Licensee in good standing" http://hg.bikemonkey.org/archive/javasrc_1_6_jrl_darwin/soylatte16-amd64-1.0.3.tar.bz2 -o $DROP_DIR/soylatte16-amd64-1.0.3.tar.bz2
fi

pushd $DROP_DIR
tar xjf $DROP_DIR/soylatte16-amd64-1.0.3.tar.bz2
popd
fi

if [ ! -f $DROP_DIR/jaxp-1_4_4.zip ]; then
echo "downloading jaxp-1_4_4.zip into DROP_DIR"
curl http://icedtea.classpath.org/download/drops/jaxp-1_4_4.zip -o $DROP_DIR/jaxp-1_4_4.zip
fi

if [ ! -f $DROP_DIR/jdk7-jaf-2010_08_19.zip ]; then
echo "downloading jdk7-jaf-2010_08_19.zip into DROP_DIR"
curl http://icedtea.classpath.org/download/drops/jdk7-jaf-2010_08_19.zip -o $DROP_DIR/jdk7-jaf-2010_08_19.zip
fi

if [ ! -f $DROP_DIR/jdk7-jaxws2_2-2010_08_19.zip ]; then
echo "downloading jdk7-jaxws2_2-2010_08_19.zip into DROP_DIR"
curl http://icedtea.classpath.org/download/drops/jdk7-jaxws2_2-2010_08_19.zip -o $DROP_DIR/jdk7-jaxws2_2-2010_08_19.zip
fi

if [ ! -d ALT_COMPILER_PATH ]; then
echo "setup compiler dirs"
mkdir ALT_COMPILER_PATH
pushd ALT_COMPILER_PATH
ln -s /usr/bin .SOURCE
ln -s .SOURCE/g++-4.0 g++
ln -s .SOURCE/gcc-4.0 gcc
popd
fi

echo "cleaning previous build"

rm -rf build

unset CLASSPATH
unset JAVA_HOME
unset LD_LIBRARY_PATH

# patching defs.make for build on 64bits machine if required
grep -q x86_64 hotspot/make/bsd/makefiles/defs.make
if [ $? -eq 1 ] ; then
echo "patching defs.make for build on 64bits machine"
patch -p0 <<EOF
--- hotspot/make/bsd/makefiles/defs.make.orig   2010-11-20 16:09:49.000000000 +0100
+++ hotspot/make/bsd/makefiles/defs.make 2010-11-20 16:10:29.000000000 +0100
@@ -90,6 +90,24 @@
endif
endif

+# x86_64 OS/X
+ifeq (\$(ARCH), x86_64)
+  ifeq (\$(ARCH_DATA_MODEL), 64)
+    ARCH_DATA_MODEL = 64
+    MAKE_ARGS       += LP64=1
+    PLATFORM        = bsd-amd64
+    VM_PLATFORM     = bsd_amd64
+    HS_ARCH         = x86
+  else
+    ARCH_DATA_MODEL = 32
+    PLATFORM        = bsd-i586
+    VM_PLATFORM     = bsd_i486
+    HS_ARCH         = x86
+    # We have to reset ARCH to i386 since SRCARCH relies on it
+    ARCH            = i386
+  endif
+endif
+
# i386
ifeq (\$(ARCH), i386)
ifeq (\$(ARCH_DATA_MODEL), 64)
EOF
fi

# patching Platform.gmk for 32bits VM build on 64bits machine
grep -q "force i586 if 32bits VM asked" jdk/make/common/shared/Platform.gmk
if [ $? -eq 1 ] ; then
echo "patching Platform.gmk for 32bits VM on 64bits machine"
patch -p0 <<EOF1
--- jdk/make/common/shared/Platform.gmk.orig	2010-11-20 19:33:19.000000000 +0100
+++ jdk/make/common/shared/Platform.gmk	2010-11-21 00:39:18.000000000 +0100
@@ -272,6 +272,12 @@

# Darwin builds may be 32-bit or 64-bit data model.
ifeq (\$(SYSTEM_UNAME), Darwin)
+    ifeq (\$(ARCH), amd64)
+      # force i586 if 32bits VM asked
+      ifeq (\$(ARCH_DATA_MODEL), 32)
+        ARCH=i586
+      endif
+    endif
ifeq (\$(ARCH), i586)
ifeq (\$(ARCH_DATA_MODEL), 64)
ARCH=amd64
EOF1
fi

env -i PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin \
LANG=C \
CC=gcc-4.0 \
CXX=g++-4.0 \
make \
ALT_DROPS_DIR=$DROP_DIR \
ALT_BOOTDIR=$SOYLATTE \
ALT_JDK_IMPORT_PATH=$SOYLATTE \
ALT_FREETYPE_HEADERS_PATH=/usr/X11R6/include \
ALT_FREETYPE_LIB_PATH=/usr/X11R6/lib \
ALT_CUPS_HEADERS_PATH=/usr/include \
ALLOW_DOWNLOADS=true \
ANT_HOME=/usr/share/ant \
NO_DOCS=true \
HOTSPOT_BUILD_JOBS=2 \
ARCH_DATA_MODEL=64 \
ALT_COMPILER_PATH=$(pwd -P)/ALT_COMPILER_PATH/ \
LD_LIBRARY_PATH=

echo "testing build: ./build/bsd-amd64/j2sdk-image/bin/java -version"

./build/bsd-amd64/j2sdk-image/bin/java -version

You could now click on Build Icons, and after some minutes you should see (hopefully).

Successfully 32bits build

Successfully 64bits build

Learn More
Designed by RocketTheme
WordPress is Free Software released under the GNU/GPL License.