Sunny Chan blogs Can you see the Logic in my Madness?

Entries tagged [openjdk]

Updated OpenJDK-build docker image

by schan

Posted on Tuesday September 12, 2017 at 06:31am in Linux

Since I have started my new job I have quite a bit of opportunity to do a bit of Docker deployment. So I have spend some time to update my docker image for openjdk build.

What's new:

  1. The image is now based on latest CentOS 7 (Oracle builds with Oracle Linux which is basically rebranded RHEL/Centos)

  2. It now has a docker build file, git hub repo and automatic build on Docker hub

  3. The default start up will now be user openjdk, and you could mount your data directory as home.

  4. I have put nano, git and hg in the image for your convience

This image will be able to build latest JDK8 and JDK9 source code.  

Here is an example on how to build an image 

#notice that you need :Z at the end of mount so that it fixes up selinux
#If you use default userid you can just mount your home dir (xxx = your id on host).
sudo docker run --rm -it -v /home/xxx:/home/openjdk:Z sunnythepooh/openjdk-build-docker:latest bash

[openjdk@8a4bc8214db2 ~]$ hg clone
destination directory: jdk9
requesting all changes
adding changesets
adding manifests
adding file changes
added 2628 changesets with 4461 changes to 468 files
updating to branch default
322 files updated, 0 files merged, 0 files removed, 0 files unresolved
[openjdk@8a4bc8214db2 jdk9]$ bash
WARNING: Mercurial version 2.6.3 or later is recommended. /usr/bin/hg is version 2.6.2
# Repositories: corba jaxp jaxws langtools jdk hotspot nashorn
corba: hg clone corba
jaxp: hg clone jaxp
corba: requesting all changes
jaxp: requesting all changes
jaxp: adding changesets
corba: adding changesets
corba: adding manifests
jaxp: adding manifests
corba: adding file changes
jaxp: adding file changes
corba: added 876 changesets with 5451 changes to 2597 files
corba: updating to branch default
corba: 1201 files updated, 0 files merged, 0 files removed, 0 files unresolved
jaxws: hg clone jaxws
jaxws: requesting all changes
jaxws: adding changesets
jaxws: adding manifests
jaxws: adding file changes
jaxws: added 801 changesets with 21839 changes to 10824 files
jaxws: updating to branch default
jaxws: 3760 files updated, 0 files merged, 0 files removed, 0 files unresolved
langtools: hg clone langtools
langtools: requesting all changes
langtools: adding changesets
langtools: adding manifests
jaxp: added 1153 changesets with 14751 changes to 8449 files
jaxp: updating to branch default
jaxp: 3352 files updated, 0 files merged, 0 files removed, 0 files unresolved
jdk: hg clone jdk
jdk: requesting all changes
jdk: adding changesets
langtools: adding file changes
jdk: adding manifests
langtools: added 4174 changesets with 38097 changes to 11847 files
langtools: updating to branch default
langtools: 9464 files updated, 0 files merged, 0 files removed, 0 files unresolved
hotspot: hg clone hotspot
hotspot: requesting all changes
hotspot: adding changesets
hotspot: adding manifests
hotspot: adding file changes
jdk: adding file changes
hotspot: added 12824 changesets with 78616 changes to 15832 files
hotspot: updating to branch default
hotspot: 9078 files updated, 0 files merged, 0 files removed, 0 files unresolved
nashorn: hg clone nashorn
nashorn: requesting all changes
nashorn: adding changesets
nashorn: adding manifests
nashorn: adding file changes
nashorn: added 1928 changesets with 14563 changes to 4181 files
nashorn: updating to branch default
nashorn: 3293 files updated, 0 files merged, 0 files removed, 0 files unresolved
jdk: added 17287 changesets with 152446 changes to 50650 files
jdk: updating to branch default
jdk: 27295 files updated, 0 files merged, 0 files removed, 0 files unresolved
# Repositories: . corba jaxp jaxws langtools jdk hotspot nashorn
.: cd . && hg pull -u
corba: cd corba && hg pull -u
jaxp: cd jaxp && hg pull -u
jaxws: cd jaxws && hg pull -u
langtools: cd langtools && hg pull -u
jdk: cd jdk && hg pull -u
hotspot: cd hotspot && hg pull -u
nashorn: cd nashorn && hg pull -u
corba: pulling from
.: pulling from
jdk: pulling from
hotspot: pulling from
nashorn: pulling from
jaxws: pulling from
langtools: pulling from
jaxp: pulling from
jaxws: searching for changes
jaxws: no changes found
hotspot: searching for changes
hotspot: no changes found
nashorn: searching for changes
nashorn: no changes found
corba: searching for changes
corba: no changes found
.: searching for changes
.: no changes found
langtools: searching for changes
langtools: no changes found
jaxp: searching for changes
jaxp: no changes found
jdk: searching for changes
jdk: no changes found
[openjdk@be86432ef9b0 jdk9]$ bash ./configure
configure: Configuration created at Mon Sep 11 16:04:08 UTC 2017.
configure: configure script generated at timestamp 1496926402.
checking for basename... /usr/bin/basename
checking for bash... /usr/bin/bash
checking for cat... /usr/bin/cat
checking for chmod... /usr/bin/chmod
checking for cmp... /usr/bin/cmp
checking for comm... /usr/bin/comm
checking for cp... /usr/bin/cp
checking for cut... /usr/bin/cut
checking for date... /usr/bin/date
checking for gdiff... no
checking for diff... /usr/bin/diff
checking for dirname... /usr/bin/dirname
checking for echo... /usr/bin/echo
checking for expr... /usr/bin/expr
checking for file... /usr/bin/file
checking for find... /usr/bin/find
checking for head... /usr/bin/head
checking for gunzip... /usr/bin/gunzip
checking for pigz... no
checking for gzip... /usr/bin/gzip
checking for ln... /usr/bin/ln
checking for ls... /usr/bin/ls
checking for mkdir... /usr/bin/mkdir
checking for mktemp... /usr/bin/mktemp
checking for mv... /usr/bin/mv
checking for nawk... no
checking for gawk... /usr/bin/gawk
checking for printf... /usr/bin/printf
checking for rm... /usr/bin/rm
checking for rmdir... /usr/bin/rmdir
checking for sh... /usr/bin/sh
<!--------------------- MANY LINES LATER --------------------->
A new configuration has been successfully created in
using default settings.

Configuration summary:
* Debug level: release
* HS debug level: product
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 9-internal+0-adhoc..jdk9 (9-internal)

Tools summary:
* Boot JDK: openjdk version "1.8.0_141" OpenJDK Runtime Environment (build 1.8.0_141-b16) OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode) (at /usr/lib/jvm/java-1.8.0-openjdk-
* Toolchain: gcc (GNU Compiler Collection)
* C Compiler: Version 4.8.5 (at /usr/bin/gcc)
* C++ Compiler: Version 4.8.5 (at /usr/bin/g++)

Build performance summary:
* Cores to use: 8
* Memory limit: 11783 MB
[openjdk@be86432ef9b0 jdk9]$ make images
Building target 'images' in configuration 'linux-x86_64-normal-server-release'
Compiling 8 files for BUILD_TOOLS_LANGTOOLS
Creating hotspot/variant-server/tools/adlc/adlc from 13 file(s)
Creating support/modules_libs/java.base/ from 1 file(s)
Compiling 2 files for BUILD_JVMTI_TOOLS
<!------------------------------------- MANY LINES LATER ----------------------------------------->
----- Build times -------
Start 2017-09-10 16:55:14
End 2017-09-10 17:04:50

00:09:36 TOTAL
Finished building target 'images' in configuration 'linux-x86_64-normal-server-release'

#You should be able to find the build under build/

[openjdk@192f7c9052ff jdk9]$ build/linux-x86_64-normal-server-release/images/jdk/bin/java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-adhoc..jdk9)
OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc..jdk9, mixed mode)


Trouble compiling OpenJDK 7 in Fedora 18?

by schan

Posted on Wednesday July 18, 2012 at 03:38pm in Anything

You will need to modify jdk/make/common/shared/Compiler-gcc.gmk and remove -mimpure-text from the GCC command line. See the icedtea changeset here:;node=ddca483b3ed9

More OpenJDK compile notes for Fedora 16

by schan

Posted on Saturday November 12, 2011 at 05:01am in Anything

Just to save people from scratching their heads - if you try and compile OpenJDK from vanilla source bundle (not IcedTea) on Fedora 16, you migth see fails to link with a message:

libstdc++ not found

If you look at OpeJDK build readme:

This is caused by a missing libstdc++.a library. This is installed as part of a specific package (e.g. By default some 64-bit Linux versions (e.g. Fedora) only install the 64-bit version of the libstdc++ package. Various parts of the JDK build require a static link of the C++ runtime libraries to allow for maximum portability of the built images.

 DOH! So what you will need on Fedora 16 is libstdc++-static package

OpenJDK compile problem on Ubuntu 11.10, and the fix

by schan

Posted on Friday October 28, 2011 at 10:45am in Java

If you have following the OpenJDK build Readme and try to compile OpenJDK on Ubuntu 11.10, you may see this error: 

/home/schan/openjdk7/build/linux-amd64/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_PCM.o: In function `DAUDIO_GetFormats':
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x1fd): undefined reference to `snd_pcm_format_mask_malloc'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x20a): undefined reference to `snd_pcm_close'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x225): undefined reference to `snd_pcm_hw_params_malloc'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x236): undefined reference to `snd_pcm_hw_params_get_format_mask'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x246): undefined reference to `snd_pcm_format_mask_free'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x259): undefined reference to `snd_pcm_hw_params_any'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x26a): undefined reference to `snd_pcm_hw_params_get_format_mask'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x277): undefined reference to `snd_pcm_hw_params_get_channels_min'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x288): undefined reference to `snd_pcm_hw_params_get_channels_max'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x2cf): undefined reference to `snd_pcm_format_mask_test'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x45d): undefined reference to `snd_pcm_hw_params_free'
/home/schan/openjdk7/build/linux-amd64/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_PCM.o: In function `setStartThresholdNoCommit':
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x48c): undefined reference to `snd_pcm_sw_params_set_start_threshold'
/home/schan/openjdk7/build/linux-amd64/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_PCM.o: In function `setStartThreshold':
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x4bf): undefined reference to `snd_pcm_sw_params'
/home/schan/openjdk7/build/linux-amd64/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_PCM.o: In function `setHWParams':
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x518): undefined reference to `snd_pcm_hw_params_any'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x531): undefined reference to `snd_pcm_hw_params_set_access'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x544): undefined reference to `snd_pcm_hw_params_set_format'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x557): undefined reference to `snd_pcm_hw_params_set_channels'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x58a): undefined reference to `snd_pcm_hw_params_set_rate_near'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x5dc): undefined reference to `snd_pcm_hw_params_set_buffer_size_near'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x60b): undefined reference to `snd_pcm_hw_params_set_period_time_near'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x61b): undefined reference to `snd_pcm_hw_params'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x647): undefined reference to `snd_pcm_hw_params_set_periods_near'
/home/schan/openjdk7/build/linux-amd64/tmp/sun/javax.sound/jsoundalsa/obj64/PLATFORM_API_LinuxOS_ALSA_PCM.o: In function `setSWParams':
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x67e): undefined reference to `snd_pcm_sw_params_current'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x6b4): undefined reference to `snd_pcm_sw_params_set_avail_min'
PLATFORM_API_LinuxOS_ALSA_PCM.c:(.text+0x6c4): undefined reference to `snd_pcm_sw_params'

Don't panic - it looks like the Java's linking sequence for ALSA sound library is wrong. Just use this patch:

--- old/make/javax/sound/jsoundalsa/Makefile    2011-10-28 02:28:00.000000000 -0400
+++ new/make/javax/sound/jsoundalsa/Makefile    2011-10-28 02:28:00.000000000 -0400
@@ -65,7 +65,7 @@
        $(MIDIFILES_export) \
-LDFLAGS += -lasound
+EXTRA_LIBS += -lasound

You should be good to go!

My COSCUP talk on OpenJDK 7

by schan

Posted on Thursday September 15, 2011 at 08:54pm in Java

How to compile OpenJDK on Windows

by schan

Posted on Sunday July 24, 2011 at 08:42pm in Java

These are the steps that I have made OpenJDK to compile on Windows platform:

  1. Install Visual C++ 2010 Express (or if you are rich, get Visual Studio 2010 Professional) 

  2. Install Windows 7 Platform SDK

  3. Install Cygwin, install the packages suggested on OpenJDK Readme. Also install gcc for step 5

  4. Install DirectX 9.0 SDK

  5. The gnu make package in the current cygwin does not support Windows directory convention and you should compile your own version of the make 3.82 which has the correct support.

  6. Download latest Freetype

    • Compile it using Visual C++ - you can find the Visual C++ project file under <freetype src>/builds/win32/vc2010. 

    • Make sure you have change the type of DLL it generates by going to Project->Properties, then Configuration Manager... button, set it to Release and Win32

    • Make sure you have set it so that it builds a DLL - you can find that under Project->Properties, Configuration Properties, General and there should be a Configuration Type drop down box

    • You can then build freetype. The DLL generated will have a version number attached to it (e.g. freetype245.dll) and you will need to make sure you rename it to freetype.dll.

  7. Get latest Apache ANT

  8. Make sure you have a Java 6 JDK installed

  9. Download the openjdk source code, either using hg or source bundle (I will assume you put it in c:\openjdk)

  10. Open a command prompt for Windows SDK by going to Start -> Windows SDK 7.1 -> Windows SDK 7.1 command prompt

  11. For 32bit ONLY, you should run the Visual Studio compiler settings batch file: c:\program files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat

  12. Make sure you have override the standard cygwin bin path so that make.exe you have compiled in step 5 take precedent of the default cygwin.

  13. Also check that the link.exe you run in the path is the actual Microsoft linker and not the cygwin's link command - you will need to fiddle with the path.

  14. Setup a number of environment variables:

    1. ALT_BOOTDIR should point to the Java 6 JDK (Step 8)

    2. ALT_DXSDK_PATH is the DirectX SDK PATH (Step 4)


    4. ANT_HOME

    5. HOTSPOT_BUILD_JOBS if you want to parallelize your build - you can't use -j options in the make command

    6. ALLOW_DOWNLOADS=true so that it can download JAXP and JAXS jar

    7. Make sure the path is setup correctly (Step 12/13)

  15. You are ready to give it a go. First, run "make sanity" and see whether there is anything you setup incorrectly. If something is wrong, fix it.

  16. If you have passed make sanity, you can run make to build the JDK! Go and make a cuppa, it will take a while. On my i7-2600 and hard drive it took 2 hours.

Important: In order to build a 32bit JDK you must use a 32bit System - ie. you cannot cross compile (ie. 64bit Windows and compile a 32bit JDK)

Let me know whether it works for you. if it doesn't tell me what's wrong and I will fix the instructions!