Patch for OpenJDK6 on BSD

Published on
7,007 Points
1 Endorsement
Last Modified:
Hello fellow BSD lovers,
I've created a patch process for patching openjdk6 for BSD (FreeBSD specifically), although I tried to keep all BSD versions in mind when creating my patch.

Welcome to OpenJDK6 on BSD

First let me start with a little background on why I choose to port openjdk6, and then I'll discuss the process I took to do it.  I work for Experts Exchange recently we decided to move from Linux to FreeBSD.  This decision came after a comprehensive test involving Linux, FreeBSD, and Solaris 10.  FreeBSD blew the others away doubling the performance of Linux and outperforming Solaris 10 by a significant margin as well.  We have come across several issues with the port java/jdk16, including lack of jmap functionality to track down memory errors and instability running the CMS garbage collector with a heap over 2G.  I created the a patch to bring jmap functionality to java/jdk16.  My next task was to begin hardening the VM, however it hardly makes sense to work on java/jdk16, because it's missing lots of bugs fixes from sun.  openjdk7 looked like the next choice to try and I compiled it up and gave it a try, however a third party library/software I was using didn't work and upon talking with terracotta developers they had no plans to support openjdk7 in the future.  I researched what exactly openjdk6 was and decided to give it a try.

How did I perform the Port

I started by duplicating jdk6 to bsd-port6.  Then I take the difference between jdk7 and bsd-port and import them.  I had trouble using patch -Nu jdk7 bsd-port because there were new files that contained long lines that patch complained about.  I whipped up a quick perl script to compare the directories and create the jdk7_bsd_changes_20090126.newfiles and jdk7_bsd_changes_20090126.patches directories.  Any file the was brand new to bsd-port was copied into jdk7_bsd_changes_20090126.newfiles to avoid the patch issue with long lines.  jdk7_bsd_changes_20090126.patches contains a separate patch for each file the was changed between jdk7 and bsd-port.  Not all of these patches applied cleanly so I then went through about 40 .rej files and applied the patches by hand, keeping track of the changes.  When compiling I released the build structure had changed between jdk6 and jdk7 and bsd-port6/hotspot/make/bsd/ had to be moved to bsd-port6/hotspot/build/bsd.  Makefiles also had to be patched to complete the change.  custom-patches contains these patches.

AMMENDMENT: I have modified the process described above as per suggested.  Instead of just copying a new file from bsd-port if they didn't exist in jdk7, I now reverse engineer the original process of porting from jdk7 to bsd-port, by taking the linux equivalents from jdk6 as a base, and apply the differences from the linux jdk7 version and the bsd-port version to it.  This wasn't terribly easy and lots of hand patching was required.  The upside is patch 0.1.0 produced a build envirnment that was mix between jdk7 and jdk6 build, and was hard to debug as a result.  From version 0.2.0 and on this patch will simulate the jdk6 build process.   Also version 0.2.0 should be completely jdk6 compatible.

Applying the patch.
*) run import_patch.pl
   - download jdk6 using mercurial to _jdk6
   - dupicate _jdk6 to bsd-port6
   - apply jdk7-bsd-changes-20090126
   - apply custom-patches
*) now compile, I've included a build_bsd-port6.sh script that I use to start compiling

jdk/src/share/bin/java.c - was hand patched, however I wasn't able to test compiling on Mac OS X, and I worry it won't compile


Featured Post

CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Learn how to get help with Linux/Unix bash shell commands. Use help to read help documents for built in bash shell commands.: Use man to interface with the online reference manuals for shell commands.: Use man to search man pages for unknown command…

Keep in touch with Experts Exchange

Tech news and trends delivered to your inbox every month