Continuing with my research into Programming Languages (and Compilers in particular), I started looking through the (considerably abstruse) documentation on the OpenJDK site. My patience paid off in the end and I ended up getting a lot of useful information on what I was looking for in particular – the
javac source code and documentation. One of my earmarked projects for this year is to modify
javac to allow some for extra syntax, and since this involves adding additional semantics, I was keen to download and build OpenJDK for myself.
The steps are surprisingly very well documented and easy to follow. To give a personal perspective on the build process (including a gotcha regarding JDK9), here is the list of steps to download OpenJDK 9 and build the whole system from scratch (for experimentation/contributing to OpenJDK, what have you). Note that the latter steps are specifically for macOS. However, most of the steps are more or less the same across platforms):
- First, install
Mercurialif you already don’t have it. This was a bit irksome for me at first (being primarily a
Gituser). If you have
Homebrewinstalled, then it is as trivial as:
$ brew install hg
Then, ensure that you have the following settings in your
~/.hgrcfile. In case you don’t have a
.hgrcfile, create one like so:
$ touch ~/.hgrc
Add the following lines to the
[settings] fetch = mq =
- Now, clone the OpenJDK 9 repository (for some reason,
hg tclonedid not work for me (as specified in the documentation), but the following did steps worked just fine:
$ hg clone http://hg.openjdk.java.net/jdk9/dev 9dev $ cd 9dev $ sh ./get_source.sh
The last step will retrieve all the necessary code and build environment into your local repository, so this does take some time.
- Now, one caveat here – to build OpenJDK, you need an existing JDK installation (the documentation mentions that any standard variant will do). This is called the “boot JDK”. However, I found that the build does not go through with JDK 9 (from the error messages, it looks like Reflection due to the new modules system is the main culprit). In that case, you can use an older version (say, JDK 8) to perform the build instead.
In the case of macOS, you can use the following command to find the available JDKs on your machine:
Macushla:RacketMacros z0ltan$ /usr/libexec/java_home -V Matching Java Virtual Machines (2): 9, x86_64: "Java SE 9-ea" /Library/Java/JavaVirtualMachines/jdk- 9.jdk/Contents/Home 1.8.0_112, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
The last line shows the current default JDK. Before proceeding with the build, you can either change the default version, or you can simply pass in a different “boot JDK” to the configuration step (preferable).
Now, let’s generate the configuration file:
bash configure --with-boot-jdk /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/ --disable-warnings-as-errors
Note that I pass in two flags to
--with-boot-jdkspecifying the JDK that I want to use to build OpenJDK, and
--disable-warnings-as-errors(this is required on macOS).
If this command runs successfully, the build is almost certainly going to succeed.
- Finally, trigger the build (this should take a bit of time again):
$ make images
This will dump the generated OpenJDK images into the
- You can test that the generated image is valid:
Macushla:9dev z0ltan$ ./build/macosx-x86_64-normal-server-release/jdk/bin/java -version openjdk version "9-internal" OpenJDK Runtime Environment (build 9-internal+0-adhoc.z0ltan.9dev) OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.z0ltan.9dev, mixed mode)
And there you go. All done in under half an hour!
Note that there is a plethora of build options and flags (including cross-compilation capabilities), and you should definitely check out the two HTML pages in the following location of your repository –
Now the real work begins! 😀