|
|
|||
Kelly O'Hair's BlogCommunity: JDK ArchivesTwo Blogs Too ManyPosted by kellyohair on January 07, 2008 at 05:41 PM | Permalink | Comments (0)Just FYI... Maintaining two blog sites is a bit problematic, I'll be doing most future Java blogs on blogs.sun.com: http://blogs.sun.com/kto/category/Java OpenJDK Mercurial Transition Final UpdatePosted by kellyohair on December 05, 2007 at 08:15 AM | Permalink | Comments (0)Final UpdateHip Hip Hooray!JDK7 Build 24 has been promoted (no raise, just a promotion :^). Remember, Build 24 should not differ from Build 23, in fact if they don't behave exactly the same, please report it as a bug. The only difference is that Build 23 was built from sources that lived in TeamWare workspaces, and Build 24 was built from those same sources living in Mercurial repositories. The open source repositories used to create Build 24 are available at: http://hg.openjdk.java.net/jdk7/jdk7/. These are often called the jdk7 master repositories.
If you have Mercurial installed on your system, and you have it setup with the forest extension on, building the openjdk should be as easy as:
"Ha!" he says, like it can be so easy. :^)
Speaking of fun rides, on Highway 101 in the Oregon Dunes area,
you can ride in a sand rail (with a professional driver),
definitely an "E Ticket" ride.
Google "sanddunes frontier" for more information, no cloning necessary. ;^) OpenJDK Mercurial Transition Update 7Posted by kellyohair on November 15, 2007 at 02:01 PM | Permalink | Comments (0)Update 7Ok ok, call us snails if you want... but things are progressing, really. We are currently going through a "dry run" event of having team integrators and developers learn Mercurial, clone the experimental repositories, push fake changes, and verify that the repositories work and the servers are stable. If you are on the build-dev@openjdk.java.net alias you may have seen the emails when the push events happened. So far so good, we haven't gone running back to TeamWare, yet, (that's a joke :^). Once Build 24 promotes and the repositories are declared official we can all get back to real work on the jdk. So when will Build 24 promote? The Thanksgiving week created a bit of a problem, we came up with an unofficial perhaps slightly aggressive target of last week in November. So it's possible this slips into the first week of December, but we'll try and keep it in November. Remember we have literally hundreds of Sun JDK developers involved with this transition, this is not a minor event. The experimental repositories are still available at: http://hg.openjdk.java.net. And I encourage anyone considering working with these repositories to try them out. I know I said it before, but we are in the final lap, just keep stopping along the way to clean up the track... the "official" repositories should be available around the end of November. OpenJDK Mercurial Transition Update 6Posted by kellyohair on November 01, 2007 at 06:19 PM | Permalink | Comments (1)Update 6Build 23 has been promoted, so far there is at least one build bug found (see 6624808 or this openjdk build-dev email). But these sources will be used pretty much 'as is' to start the Mercurial repositories and Build 24, of which experimental repositories are available at: http://hg.openjdk.java.net right now. The control directory disappears and it's Makefile is made part of the enclosing repository. If you have the Mercurial forest extension in your Mercurial installation, you can simply:
And have your own forest clone of the OpenJDK to play with. Also see OpenJDK forest, OpenJDK Integration Wheel, and Working in a Mercurial World for more information. We are in the final lap... "official" repositories are very close. OpenJDK Mercurial Transition Update 5Posted by kellyohair on October 21, 2007 at 01:10 PM | Permalink | Comments (3)Update 5Well we had a few snafus with Build 22. A hotspot bug 6616627 managed to sneak in, and the jaxws workspace lost some GPL markings and we will need to back out the jaxws integration in Build 23 (this should be temporary, expect jaxws to be re-integrated in a few builds). The split of the langtools, corba, jaxp, and jaxws workspaces has continued to cause some minor issues with regards to doing partial builds from the j2se workspace. Most of these have been resolved in build 23 coming up. We did have a few changes to the plan. Build 23 is being used (in TeamWare) to hold changes like whitespace normalization, SCCS keyword removal, and also the j2se name change ("j2se" is being changed to "jdk"). No team integrations will be allowed in Build 23 with the exception of emergency fixes (like the above hotspot bug fix).
Build 24 will be in Mercurial and the files managed by TeamWare
in Build 23 will be the same files that enter the initial
Build 24 Mercurial repositories.
There are a few restructuring things that will happen though as
the Mercurial images are created. There will not be a "control"
repository, instead there will be a Makefile at the top of
the forest which is the same Makefile that used to be at
control/make.
So when you used to:
Now you would:
See OpenJDK forest for more information on the layout. Build 23 is being worked on now and should be available within a week, doing the Mercurial conversion for Build 24 should be fairly straight forward, but getting everything all setup for the integrators and developers is not a trivial task, so once we have repositories it may take a few weeks to get it all setup. Hopefully, read-only MASTER repositories can be made available as soon as possible, and maybe sooner so that we can get help trying things out and looking for issues. Stay tuned... VisualVM ToolPosted by kellyohair on October 17, 2007 at 11:22 AM | Permalink | Comments (0)If you like jconsole, go to the VisualVM pages at https://visualvm.dev.java.net/ and try out the new VisualVM tool. Very cool. OpenJDK Mercurial Transition Update 4Posted by kellyohair on October 02, 2007 at 11:57 AM | Permalink | Comments (4)Update 4
We tried very hard to split out corba, jaxp, and jaxws in Build 21 but didn't make it, however they just now got integrated into Build 22. This splits out an additional 6,000 files or so from the primary j2se workspace. This would not have been accomplished at all without the dedicated hard work of Seema, thank you Seema. So with Build 22 we will now have: The langtools component is built with the BOOTDIR jdk and creates the jdk contribution files (dist/lib/classes.jar and dist/lib/src.zip) for the resulting jdk image being built, plus bootstrap tools that can be run with the BOOTDIR jdk for building the complete jdk with the latest class versions etc. The corba, jaxp, and jaxws components are given a BOOTDIR jdk to build with (and optionally the langtools bootstrap files when doing a full control build). All the components create contribution files (dist/lib/classes.jar and dist/lib/src.zip). Corba also contributes some special jdk image files (dist/bin.zip). Build 22 continues to be our target for the last JDK7 promotion built via the TeamWare workspaces, the Build after this one would be done via Mercurial repositories. There is some risk to this target, and it's possible it might slip, but it continues to be out target, and the momentum is building up. There will still be a few SCCS keywords in the Mercurial sources at first, but these should be harmless. We'll continue to clean up the source as we go. OpenJDK Mercurial Transition Update 3Posted by kellyohair on September 25, 2007 at 03:48 PM | Permalink | Comments (2)Update 3Build 20 now contains a separate "langtools" (javac, javah, javap, apt, and javadoc) directory in the Build 20 source bundles. Build 21 (could be 22) will have separate corba, jaxp, and jaxws directories. Build 20 had some duplicate javac tests between j2se and langtools, this should get corrected in Build 21, which should be out soon. Build 22 continues to be our target for the last JDK7 promotion built via the TeamWare workspaces, the Build after this one would be done via Mercurial repositories. Then my co-workers might want to burn me at the stake, so I may go into hiding for a while. ;^) We have started to look at the various conventions we want to put in place for things like changeset comments, etc. The general feeling is that the changeset comment should always contain a bugid and synopsis, and not much else, pushing the bulk of the data about a bug and it's fix into the bug database. The Mercurial changeset itself serves as the exact changes for a bug, so there is no need to save diffs or webrevs, just the changeset global ID. It has been agreed that the release engineering team will be creating global tags for the various promotions, something like "jdk7-ea-b23", so re-creating the sources as of a promotion should be easy. (The fact that Mercurial makes it so easy to re-create accurate source trees for any changeset or tag name may change the way we deal with saving source bundles, or even creating source bundles. Time will tell. There may still be a few SCCS keywords in the sources at first, but these should be harmless. We'll continue to clean up the source as we go. The current plan is to apply a source normalization script to the Java and Native C/C++ sources as they transition from TeamWare to Mercurial. The normalization procedure will attempt to clean up the whitespace uses in the sources, expanding TABS, converting ^M characters, removing trailing blanks on lines, and making sure the file ends with a newline character. Hopefully we can put some hooks in place to prevent this kind of whitespace clutter from coming back.
OpenJDK Mercurial Transition Update 2Posted by kellyohair on September 12, 2007 at 12:15 PM | Permalink | Comments (0)Update 2The work to create OpenJDK/JDK7 Mercurial repositories is still progressing, we had a hickup getting the langtools split off from the j2se and it did not make Build 19 as you probably well know. We integrated the split into Build 20 and have spent the last 2 weeks adjusting to the change. So Build 20 will contain a separate "langtools" (javac, javah, javap, apt, and javadoc) directory in the Build 20 source bundles, which will become a standalone Mercurial repository soon. Build 20 also includes a great deal of Makefile changes and minor changes to many files to remove SCCS keywords in the sources and test files. We haven't fixed everything, but we are making quite a bit of progress. In Build 21 (or Build 22 as a backup) we hope to split off corba, jaxp, and jaxws as separate openjdk repositories. (At some later date, we may be able to better interface with the corba, jaxp, and jaxws teams in terms of how they integrate and how we accept changes from these areas into the jdk product, so this is just step one). Other changes in Build 21 and 22 will be around SCCS keyword changes, and of course all the various teams are also integrating changes all around us, which is to some degree why this is taking a bit longer. Build changes often impact everyone, and we are dealing with a moving target. We continue to target Build 22 (Build 23 as a backup) be the last promotion built via the TeamWare workspaces, the Build after this last TeamWare one would be done via Mercurial repositories. Then at some point after that, we can start working on providing those same OpenJDK repositories on the openjdk website. In other areas, we are starting to look at the various conventions we want to put in place for things like changeset comments, etc. and how we will use Mercurial hooks to protect us from mistakes and verify the conventions are followed. Build 20 Issues with regards to the langtools split
OpenJDK Mercurial Transition Update 1Posted by kellyohair on August 21, 2007 at 06:00 PM | Permalink | Comments (6)The work to create OpenJDK/JDK7 Mercurial repositories is progressing, but before I tell you anything significant, I'll bore you with some basic details about JDK building. ;^) JDK Build Promotions
First, let me explain a little about the JDK build promotions. The build promotion cycle for active releases is usually 1 or 2 weeks long, and currently for JDK7 it's 2 weeks. That means that roughly every 2 weeks, a promoted JDK7 build is made available at the jdk7.dev.java.net binary bundle area (plus the JRL source bundle area), and also at the OpenJDK.java.net source bundle area. I assume people see the emails sent out on promotions to the announce@openjdk.java.net alias (subscribe at the openjdk mailing lists site). Between promotions, individuals integrate their JDK7 changes into the various team integration areas, and the teams will then integrate their changes into the MASTER JDK7 source workspaces. The MASTER source workspaces are like the Pacific Ocean, with all the various teams sending their changes to the MASTER repositories like water flowing through the various rivers, lakes, etc. into the Pacific. At any point the changes might get held up or inspected by a "gate keeper" or "integrator", like the dam operators on rivers (that's "dam operators", not "damn operators"). Ok ok, strange analogy, but it kind of fits. In any case, sometimes a change looks like it might make it into the MASTER workspaces and into a build promotion, but it doesn't, some gate keeper might scoop it out of the river, or some bear might drink it or something (some bears might also make contribution to the river, but let's not go there, most of the pesky bears have been relocated north of here). Ultimately if a change doesn't make a promotion and isn't permanently diverted, it will make the next promotion, or the one after that, just depends on how far it has to go. (And yes, testing is part of this process, the water is indeed safe to drink). The schedule for when build promotions will happen is fairly predictable, but anything can happen, and sometimes they get delayed. The current schedule is... HA, you thought I was going to give you hard dates! ... well ok, why not, but these are estimated dates, and sometimes you need to add a day to the final promotion day before the actual bundles are available on the jdk7.dev.java.net and openjdk.java.net sites: If a build slips, all the following build promotion dates have to be permanently adjusted. These build promotion dates are probably no big surprise, anyone could look at the past delivery of JDK7 build promotions and guessed this much. But I wanted to attach at least some preliminary dates to some build numbers so you understand the planning a bit. Note that once we get into delivering Mercurial repositories, the whole "time frame" as to when you see source changes is drastically different. The traditional source bundles become less interesting, except for maybe archiving. And even after Mercurial, the JDK Build Promotions will continue, and the binary bundles and all deliveries to jdk7.dev.java.net won't change much. The "langtools" SeparationSecond, hopefully in Build 19 (backup plan is Build 20) we will be doing some major restructuring of the j2se workspace. This first restructuring is called the "langtools" separation. The "langtools" are the tools javac, javah, javap, javadoc, and apt. This change is significant because it removes the fairly complicated javac "recompile" cycle from the j2se build, and greatly simplifies the j2se build (many Makefiles get deleted). It introduces another tree of sources (about 3,000 files) with the name "langtools". No, it doesn't mean the entire j2se build can convert to ant. Other ChangesThird, in Builds 20 through 22 or 22, there may be additional restructurings and things like SCCS keyword removals. The TransitionLastly, we sincerely hope that Build 22 or 23 will be the last promotion built with TeamWare sources, meaning that at some point after those promotions we can start working on making the OpenJDK repositories available, probably fairly quickly in terms of a read-only state. Mercurial Transition Details
Just to make sure people are aware of some of the technical details of how the transformation will happen: ConclusionHope this was helpful. This project has been extremely hard to predict, and I'm still not sure that some evil issue won't de-rail the plans, but hopefully this keeps you all informed. It will be over soon, I hope, as you can tell from my writing I'm getting a little dingy (no I'm not getting a small boat). ;^) OpenJDK Builds (Solaris & Linux)Posted by kellyohair on May 08, 2007 at 03:13 PM | Permalink | Comments (2)OpenJDK Builds (Solaris & Linux)Anyone building the new OpenJDK bundles from openjdk.java.net should find that this is an easier build procedure than the JRL building from jdk7.dev.java.net. First off, it's just the basic JDK sources, no plugin or installer bundling logic has been included yet. Also the special version of Motif is not included for Linux builds, but only some of the include files are needed and they can easily be downloaded from various locations or even installed via official Linux distributions. Second, there are a few small pieces that we still have legal issues with. So you'll see mention of "Binary Plugs" in the build process. This means that we have provided you the binary versions for these pieces, and they will be copied into your OpenJDK build during the build process. Note that you need the correct "Binary Plug" bundles from www.openjdk.org's Download area. Third, the Rhino javascript classes are not in the OpenJDK, but are available from http://www.mozilla.org/rhino/ (there were some license issues here). Fourth, ... I'm sure I forgot something... I'll re-edit this post when I remember. :^( -kto P.S. Windows builds will not work at this time.
P.P.S. On Solaris you need the Sun Studio 11 compilers, but if you
build on Solaris Express, the Sun Studio 11 compilers are already
installed.
JDK Builds on WindowsPosted by kellyohair on January 25, 2007 at 12:33 PM | Permalink | Comments (1)I need to add this to the JDK build documentation, but it may be helpful to have it posted here for some people. Building the JDK on Windows can be difficult at times, so if it hasn't been mentioned before, here are a few clues:
Hope these tidbits are helpful to somone. JVM TI Agents ArticlePosted by kellyohair on January 17, 2007 at 10:29 AM | Permalink | Comments (3)Just a plug (and additional reference) on my December 2006 article on JVM TI at http://java.sun.com/developer/technicalArticles/J2SE/jvm_ti. I really had not expected this article to be very popular, but I was assuming that only people writing JVM TI agents would be interested. It appears there is quite a bit of general curiosity on VM agents. Of course the Java Lobby and Sun System News links helped too. :^) Big thanks to Janice for all her help with this article! It would never have read as well without her help. Just for reference, there is also a JVMPI to JVM TI conversion article at: http://java.sun.com/developer/technicalArticles/Programming/jvmpitransition/. My Ant Adventure (Updated 1/23/2007)Posted by kellyohair on January 03, 2007 at 01:46 PM | Permalink | Comments (4)Update for 1/23/2007, just a very short note on windows. The findbugs target needs to add vmlauncher="false", so the line:
changes to
It's not exactly clear why this is necessary, but this allows the findbugs target to work on windows, and also works everywhere else. The findbugs -version exec was also removed because this will trigger the GUI to start up if it runs findbugs.bat, and findbugs.bat doesn't seem to have a -version option. In addition, the ant 1.7.0 install bits seem to have a windows bin/ant.cmd file that does not have execute permissions, by adding execute permissions to this file, ant can be run from a Makefile. Again, it's not exactly clear why this is needed, but it makes sense for it to have execute permissions, so this seems harmless. Updated 1/22/2007, tried to mark changes in bold underline. Also added the actual build.xml to download. Now I have never liked ants (see my ants blog), but this story is about my adventure with the Apache Ant build system. I can safely say that I still hate ants, all ants, but even ants have a place in the world, ant build scripts included. So I was crawling along with my little NetBeans Java project just happy as a clam using NetBeans 5.5 with the findbugs plugin, and the JUnit tests that NetBeans help me to create and run so easily. I never had to write an Ant script before, I just pointed NetBeans at my sources, set a few properties and let NetBeans handle it. Overall it was pretty easy, and simple. But when it came time for a batch product build, I had used a Makefile and a separate build process. So the romantic picnic at the park was over, it was time for the ants to take over. :^) The Makefile worked, but wasn't ideal, and it was always a temporary thing, but it did create the bin scripts and run some bin script tests that I hadn't managed to get the NetBeans building to do. First off, it's never good to have two different ways to build a product, you never know for sure if the two build mechanisms really built the same thing. So in general, when it comes to a build process, everyone should follow the Highlander rule of "There can be only one". Granted, a "development build" will always be slightly different, probably a subset, but it should be using the same basic mechanisms as a more formal and complete product build. Second, I was missing some of the things I wanted built into the batch build process, namely running findbugs and running all my JUnit tests. So I wasn't happy with my existing batch build process. Ideally I want a batch build process to:
Lucky for me I've got a very clean set of source files, and I want to keep them that way, otherwise I'd have to back off on some of my "treat all errors as fatal" requirements. ;^) The first two items above represent the typical development build or "full build" while inside NetBeans, but it was important to me that all the steps should be manually runnable inside NetBeans too. So I started my adventure to make this happen. My first thought was about having the Makefile run findbugs and JUnit directly, but that seemed wrong and didn't solve my first problem above. So the answer was fairly obvious, if I needed a Makefile, it would be trivial to have it run the ant script, right? So I just needed to create an ant script. Of course it's never that easy. I did manage to get this to work, and I did learn enough about ant to create this standalone ant script, one that did everything I wanted, but it was NOT simple and easy, and the end result was not very satisfactory. It turns out that when you create a NetBeans project with an existing ant script, some of the NetBeans features (like debugging a JUnit test) will not work. :^( So some NetBeans features (or what I perceive to be features) are tied to the specific ant build scripts that NetBeans creates. Then there were the ant problems, which involved having a version of ant that would work with the latest findbugs ant task and the junit ant task. I finally settled on using ant 1.7 but since I allow for my project to build anywhere, I needed ant 1.7 everywhere, and that meant I had to manage my own version of ant (I could not trust all systems to have an ant that would work for me). I think the ant inside NetBeans 5.5 was 1.6 something, and it didn't work with the findbugs ant task for some reason, but that was ok because while inside NetBeans you really want to use the findbugs plugin for the best interaction with your sources. So I finally gave up on the findbugs ant task and just used:
An UPDATE on this. Turns out that Windows is giving me no end of grief regarding pathnames, so this was changed to assume findbugs was in the PATH setting, overall this seems to make life easier. In general avoiding having ant deal with full paths is ideal, that also means avoiding the ant property ${basedir} which WILL be a full path. The Makefile changed too, see below. I want this ant script to work on MacOSX, Solaris, Linux, and Windows, others may not have this requirement. I also wanted it to work no matter where the source was moved to, so again, avoid fullpaths. I also added the findbugs -exitcode option so that errors trigger a non-zero process exit code and also the -maxHeap 512 option to give findbugs lots of heap space (it seems to need it, and runs a bit faster this way). So now I use something more like:
As it turns out, because using the findbugs ant task causes the ant VM to run out of memory, so you had to restart ant with more memory, what a pain. Using my above batch target the findbugs process uses it's own VM. This really doesn't change the performance much since findbugs takes a few minutes to run anyway, and just using the bin findbugs script must set the max memory up higher or something. So now I had to deal with this loss of NetBeans Junit debug capability. I did like how NetBeans automatically created the menu for the targets in my build.xml file, but I could not live without the ability to quickly debug any JUnit test. So I needed to either configure my build.xml file better, or try another approach. So I went back to letting NetBeans create it's own ant scripts and when I found where NetBeans placed these files (build.xml plus the nbproject directory), I just copied over all the nbproject directory and the build.xml file to my project's Mercurial repository and reopened the repository as a pre-configured NetBeans project. That way I didn't have to worry about matching the NetBeans ant conventions to get the JUnit debug feature to work. An update on this, first, do NOT include the nbproject/private directory in your repository. And second, if you tell NetBeans to use anything other than the default Java platform, things don't work very well. This was easy for me to avoid, but the way the Java platforms are defined in the ant scripts didn't make the files transportable. Maybe this was a Mac specific thing? Then I edited the NetBeans generated build.xml file (which is now my primary product build.xml file) and added to it.
So all the above is new and updated. I could not get the echo to add a newline to the file, even following all the documentation on echo, so I just used the exec target and the echo command of the system. I also had problems with javadoc populating the doc-files, so I had to add my own doc-files copy. I'm not sure what I did to break this. The javadoc command seemed to be sensitive to relative vs. full paths, or the current directory setting.
My recommendation again is to avoid the use of full paths
everywhere you can, it just makes life easier.
Also, any need to do simple shell commands like:
The findbugs task was not connected into the NetBeans build/test system, and is just used by the Makefile or directly from the ant script. Well, it turns out that this works very nicely. The following Makefile was updated to avoid the use of full paths and simplify how the ant targets are used. The Makefile was trivial, and looks like:
Update, now the path to ant and findbugs just need to be put in your PATH. I'm sure there are better ways to do some of this, but I did get the above working, and I am just an ant beginner. I still don't see any easy way to loop over a set of names with ant, and the 'condition' task is really confusing. (No wonder there are 600+ page books on how to write ant scripts.) I suppose people say the same thing about Makefiles. ;^) Hope someone gets something out of this, and yes I've learned to live with ants. ;^) JDK6 Build Cheat SheetPosted by kellyohair on December 15, 2006 at 11:04 AM | Permalink | Comments (2)JDK6 Build Cheat Sheet
Just thought I'd list a few ways that the JDK can be built.
These apply to JDK6 and JDK7, JDK5 building is a little different
but has some of the same settings.
The
See
the JDK build instructions for more information.
Control BuildsFrom the control/make/Makefile:
Here is a short list of the make variables that can be set on the
Also try running J2SE Builds
If you only want to work with the j2se and not the VM, you might
consider just going into the
I'd recommend setting Hotspot Builds
If you only want to work with the hotspot and not the VM, you might
consider just going into the
I'd recommend setting
Traditionally the hotspot build procedure have differed greatly
from the rest of the JDK. This is mostly
due to the fact that for the most part, it's more like building
a large C++ library rather than anything else.
Building each of the platforms was slightly different,
for example on Windows the tool SummarySo as you can see, some similarities, some differences between these build rules. Hope this was helpful, if you have more questions please post comments. My Dog is now Open SourcePosted by kellyohair on November 13, 2006 at 09:24 AM | Permalink | Comments (6)
After a long debate it's finally happened, I've open sourced my dog.
It just seemed like the right time, and all these concerns about
people sticking forks in my dog, or taking it and actually
teaching it new tricks, what was I thinking?
So here she is:
Oh by the way, here are a list of issues I need fixed:
Build Machines and Test MachinesPosted by kellyohair on October 08, 2006 at 10:46 AM | Permalink | Comments (0)Just thought I'd touch on a subject that some people forget about when having to build products that will run on many different machines. Building and testing on a single machine is easy, building bits that need to run on dozens of different machines is the hard part. Test machines and Build machines are different. Ideally you WANT to test on any and all machines you can get your hands on, but when you build, you need build machines that match specifications and have pre-installed products, anything else and you run the risk of creating faulty build bits. These build machines can also be so old that some products might not be available, or might have problems running on it. Or some product dependency that a product depends on won't be available. So anything used in the build process has to be carefully considered and carefully tracked. Once the platforms a release will officially support is decided, then we can decide what the official build machines and configurations will be. But we also have to consider the timing of making these changes during the release, so expect these changes to be gradual over time and not all at once. I'm not a Release Engineer, but I do appreciate the job they have to do. Once a product is released, the Release Engineering team has to preserve those build machines as long as the product might need to be updated, patched, or re-built for any reason. This can be a very long period of time, anywhere from 5-7 years. Any change to a build system can create a difference in the built product, and sometimes those differences are not readily apparent, sometimes not until a bug is found in the field. If only we could all deliver pure Java products, our lives would be so much easier. So when it comes to build systems and changes to build systems, expect it to be slow and careful. Teamware, Mercurial, and SCCS revs that go bump in the nightPosted by kellyohair on September 27, 2006 at 09:09 AM | Permalink | Comments (2)As seen in Mark's recent blog on the JDK and Source Code Management (SCM) solutions at http://blogs.sun.com/mr/entry/openjdk_scm, you can see that we are finally looking at converting to a new SCM. Inside Sun the historic and most common SCM used has been Teamware. The Sun Workshop product had delivered Teamware with it's compilers and tools for many releases, but the newer Sun Studio product dropped Teamware from it's feature list many years ago. Of course this didn't stop the developers from continuing to use it. The best high-level description of Teamware I could find is at http://docs.sun.com/source/806-3573/intro.html. Besides all the basic SCM features you'd want, Teamware provided two extremely valuable features in my view. The primary feature was the ability to have any number of workspaces (repositories) with a parent/child relationship, there is no single repository. The second feature was it's extremely powerful merging tool called filemerge. Luckily filemerge can work with any SCM, and over the years many source merging tools have come into the picture, so as much as I loved filemerge, it's not that critical a SCM feature anymore. But that first feature of having essentially a tree of repositories allowed us to do a sort of 'divide & conquer' or distributed approach to development. Any group of developers could spin off a team workspace and a child workspace per team member, completely independent from the master workspace. This distributed development model allowed teams to work in complete isolation, yet have all the SCM tools available to them at any number of levels. Well, bottom line is, we just can't give this up very easily. At the core of Teamware was SCCS which managed source file changes on a one by one basis. A Teamware workspace is essentially a set of SCCS controlled source files, with a bit of frosting. If you really want the nitty gritty details, take a look at http://docs.sun.com/source/806-3573/underhood.html It's these SCCS files that contain the various revisions of source files, along with comments and details from the developer when a revision of a source file was created. As Mark stated in his blog, we are strongly leaning toward Mercurial, but we need to study the impact of the conversion. Martin Englund has been looking into the SCCS migration into Mecurial so we have a feeling of the size and performance differences. Just copying files into a new SCM isn't the issue here, it's the conversion of all the file revisions and the information that goes along with each revision. As an example, the Hotspot workspace alone contains roughly 3,300 files, but has a total of 140,000 individual file revisions. And Hotspot is one of the younger workspaces in our JDK workspace corral. We know (thanks to Martin) that Mercurial can handle the 3,300 files with amazing speed, and Martin even tried 40,000 files. It was very fast. Now we need to see what happens when it gets all the revisions too. Teamware did not provide a very good 'change set' model, the workspaces had individual history of putbacks or commits, but the history of these actions didn't propagate up the tree of repositories. So we lack any good Teamware history data to help us group the individual SCCS file revisions together into logical 'change sets'. So for the most part we are left with the individual SCCS revision data for thousands of files. So we are brainstorming how we can group individual file changes together into change sets with just the:
Why not just do a blind 'one file revision' to 'one change set'? I guess it's part of being an engineer, we can do better than that. :^) And it looks like a fun graph project too, humm, maybe I can get some use out of that Mathematics degree I have? Of course, if we figure this out, and I don't get fired for doing a horrible job of it (just kidding), this SCCS revision conversion work could map to any of SCM's with a change set model, but we will be focusing on Mercurial for the time being. The Open Solaris team did a fairly detailed study on SCMs which is available at http://opensolaris.org/os/community/tools/scm/. Mercurial is an open source project and details about Mercurial can be found at http://www.selenic.com/mercurial/wiki/index.cgi. Martin Englund has also been nice enough to provide a Teamware to Mercurial mapping for the existing Teamware users at http://blogs.sun.com/martin/entry/mercurial_for_teamware_users.
No transition will be easy, and we know that some of you might be
upset that the choice wasn't SubVersion, but for what we need to
do in the JDK, with our JDK developers all over the world,
our answer wasn't SubVersion.
JPRT: Build/Test System for the JDKPosted by kellyohair on September 13, 2006 at 08:48 PM | Permalink | Comments (5)I did a little blogging on JPRT at http://blogs.sun.com/kto/entry/jprt_sun_hardware_is_so but that was mostly to talk about the COOL rack of Sun hardware that I used. Now I want to talk a little more about why we need something like JPRT, and what it does for us. I've been working on this JPRT project for quite some time now, so I've kind of lost touch with the real world lately. Ronald Reagan is still the President, isn't he? ;^) Anyway.... JPRT ("JDK Putback Reliablity Testing", but ignore what the letters stand for, I change what they mean every day, just to annoy people :^) is a build and test system for the JDK, or any source base that has been configured for JPRT. As I mentioned in the above blog, JPRT is a major modification to a system called PRT that the HotSpot VM development team has been using for many years, very successfully I might add. Keeping the source base always buildable and reliable is the first step in the 12 steps of dealing with your product quality... or was the 12 steps from Alcoholics Anonymous... oh well, anyway, it's the first of many steps. ;^) Internally when we make changes to any part of the JDK, there are certain procedures we are required to perform prior to any putback or commit of the changes. The procedures often vary from team to team, depending on many factors, such as whether native code is changed, or if the change could impact other areas of the JDK. But a common requirement is a verification that the source base with the changes (and merged with the very latest source base) will build on many of not all 8 platforms, and a full 'from scratch' build, not an incremental build, which can hide full build problems. The testing needed varies, depending on what has been changed.
Anyone that was worked on a project where multiple engineers or
groups are submitting changes to a shared source base
knows how disruptive a 'bad commit' can be on everyone.
How many times have you heard:
We don't tolerate bad commits, but our enforcement is somewhat lacking, usually it's an 'after the fact' correction. Luckily the Source Code Management system we use (another antique called TeamWare) allows for a tree of repositories and 'bad commits' are usually isolated to a small team. Punishment to date has been pretty drastic, the Queen of Hearts in 'Alice in Wonderland' said 'Off With Their Heads', well trust me, you don't want to be the engineer doing a 'bad commit' to the JDK. With JPRT, hopefully this will become a thing of the past, not that we have had many 'bad commits' to the master source base, in general the teams doing the integrations know how important their jobs are and they rarely make 'bad commits'. So for these JDK integrators, maybe what JPRT does is keep them from chewing their finger nails at night. ;^) Over the years each of the teams have accumulated sets of machines they use for building, or they use some of the shared machines available to all of us. But the hunt for build machines is just part of the job, or has been. And although the issues with consistency of the build machines hasn't been a horrible problem, often you never know if the Solaris build machine you are using has all the right patches, or if the Linux machine has the right service pack, or if the Windows machine has it's latest updates. Hopefully the JPRT system can solve this problem. When we ship the binary JDK bits, it is SO very important that the build machines are correct, and we know how difficult it is to get them setup. Sure, if you need to debug a JDK problem that only shows up on Windows XP or Solaris 9, you'll still need to hunt down a machine, but not as a regular everyday occurance. I'm a big fan of a regular nightly build and test system, constantly verifying that a source base builds and tests out. There are many examples of automated build/tests, some that trigger on any change to the source base, some that just run every night. Some provide a protection gateway to the 'golden' source base which only gets changes that the nightly process has verified are good. The JPRT (and PRT) system is meant to guard the source base before anything is sent to it, guarding all source bases from the evil developer, well maybe 'evil' isn't the right word, I haven't met many 'evil' developers, more like 'error prone' developers. ;^) Humm, come to think about it, I may be one from time to time. :^{ But the point is that by spreading the build up over a set of machines, and getting the turnaround down to under an hour, it becomes realistic to completely build on all platforms and test it, on every putback. We have the technology, we can build and rebuild and rebuild, and it will be better than it was before, ha ha... Anybody remember the Six Million Dollar Man? Man, I gotta get out more often.. Anyway, now the nightly build and test can become a 'fetch the latest JPRT build bits' and start extensive testing (the testing not done by JPRT, or the platforms not tested by JPRT). Is it Open Source? No, not yet. Would you like to be? Let me know. Or is it more important that you have the ability to use such a system for JDK changes?
So enough blabbering on about this JPRT system, tell me what you
think.
Stay tuned for the next episode, same Bloody Bat time, same Bloody Bat channel. ;^) New JDK Build DocumentationPosted by kellyohair on August 28, 2006 at 01:49 PM | Permalink | Comments (2)The latest JDK 6 build machine setup and build instructions are now available at: http://download.java.net/jdk6/docs/build/README-builds.html. Do NOT go to http://download.java.net/README-JRL.html, those are old pages, and I'm trying to get them updated or removed. We have re-structured the build instructions and am trying to add in more information and details on the various build dependencies. This is a work in progress and we will be adding more information to this file as we move forward. If you have any input or comments, please share it with everyone by posting a forum note at http://forums.java.net/jive/forum.jspa?forumID=25. Late JavaOne 2006 Trip ReportPosted by kellyohair on June 06, 2006 at 02:11 PM | Permalink | Comments (0)Started this right after JavaOne, then got distracted... hopefully someone gets something useful out of it. Go to http://developers.sun.com/channel/ for the complete scoop on JavaOne 2006.
What a week, I'm tired, my feet hurt, and I think I have a headache from the after dark speaker system.
I must be getting too old for this, but I'll be back next year, what am I? Nuts?
Why do people inflict so much pain on themselves, complain about it, and then do the same thing the next year?
Because it's a blast maybe? Because it's JavaOne? Who knows?
So enough complaining, I'll give a little trip report on what I saw and did at JavaOne this year, with my somewhat twisted humor (I read too many National Lampoon magazines in college). There is NO way I could cover even a fraction of all that was happening, so this is just a smattering of what was at JavaOne 2006.
In Summary, the conference seemed more crowded and the Sun PODs in particular seemed really busy to me, more so than in years past, but that's just an impression. Everyone seemed upbeat and friendly, and it seemed like overall a good conference. Hope you enjoyed the long winded trip report, Looking forward to next year. Oh yeah, I almost forgot, I normally skip the "Picture with Duke", but this time there was no line, so click on this to see my picture with Duke:
Ok, one last thing... I'm sure you are asking, "Why the Aloha Shirt?".
Well, I'm not sure, once upon a time, a long long time ago, a fellow
named Bob J. used to wear them, and Sun also
used to have "Friday Aloha Shirt"
days, but as to why I continue to wear them?
To the point that it's all I wear?
I guess it's because they aren't boring, kind of the complete
opposite of a business suit.
And they look better than a printed T-Shirt. :^)
The Bloody Bat and Fixing RegressionsPosted by kellyohair on February 01, 2006 at 02:52 PM | Permalink | Comments (0)
JNI How ToPosted by kellyohair on January 31, 2006 at 10:49 AM | Permalink | Comments (1)I just saw the page http://ringlord.com/publications/jni-howto/. It has some good detail on using JNI on Linux. Compilation of JNI CodePosted by kellyohair on January 09, 2006 at 07:23 PM | Permalink | Comments (12)I've added a few clarifying comments in italics below. Using the JavaTM Native Interface (JNI) is not something many Java programmers have to deal with, but when you do, you need to know something about native applications. Whether it's Windows, linux, or Solaris, each native platform and sometimes native compiler or even the release of the native compiler has slightly different issues, so I thought I would write a little on each of these issues. With JNI you are actually building a native shared library (.so or .dll file) that the JavaTM Virtual Machine (JVM) will dynamically load into the Java native process with dlopen() on Solaris and Linux, or LoadLibrary() on Windows. This "dynamically loaded shared library" fact is the basis for many of the compilation issues, not so much the use of JNI, dynamic loading of native libraries can be tricky. Some of the compilation issues relate to the library being loaded into a Java process and causing conflicts in the way the JDK was compiled itself, or the way the JDK assumes code was compiled (sometimes this is considered a JDK bug, but it depends on a great number of factors). All libraries loaded into java are assumed to be MT-safe (Multi-thread safe). This means that multiple threads could be executing the code at the same time, and static or global data may need to be placed in critical sections. If you don't know what MT-safe means, you should do some research and make sure you understand what this means, it is a critical concept to understand when creating JNI libraries and writing JNI code. So if there is a compiler option to select MT-safe generated code, you will need it. Compiler optimizations are always an issue and you need to be careful with high optimization levels. The safest route is to stick with just -g compilations, then use lowest optimization level you need, increasing it only when your native code and the overall application really benefits from increased optimizations. TipsSo here a a few tips on the different platforms and the common compiler options to watch out for:
Solaris
For 64bit SPARC:
For X86:
For AMD64:
-xarch=v8,
for SPARC 64bit use -xarch=v9,
for X86 (32-bit)
leave the option off or use -xarch=generic
,
and for AMD64 (64bit) use -xarch=amd64
with both C and C++.
This is to be specific as to the architecture and the file format of the .o files (and ultimately of the .so). Other -xarch values may work, but many won't mix well with the native code of the JDK, so be careful. Also be careful when using -xarch and some of the other compiler optimization options that target specific processors (e.g. -fast should not be used unless you follow it with an overriding -xarch option). -KPIC -mt
with both C and C++.
The -mt should be used for all compiles and links,
it makes sure the library is
built properly to be a MT-safe library.
The -KPIC option makes sure your code is built in a
position-independent way to maximum use in a shared library.
-xregs=no%appl and for X86 and AMD64 use -xregs=no%frameptr
with both C and C++.
On SPARC, certain global registers should not be used by system libraries and on X86, you will be better off if the frame pointer register is NOT used as a general purpose register. Not using -xregs=no%frameptr can cause problems
in getting accurate stack traces in native code.
-xmemalign=4
with both C and C++.
Usually the defaults for memory alignment is acceptable, but the general theory is that a shared library compiled with great alignment is probably ok, with less alignment is a SIGBUS disaster waiting to happen. We build the SPARC 32bit JDK with -xmemalign=4s to be compatible
with any user libraries built by older compilers that had this as the
default.
Newer Sun compilers have a default of
-xmemalign=8s, so we
explicitly ask for -xmemalign=4s.
We build the SPARC 64bit JDK with
-xmemalign=8s explicitly (which has
always been the default), if the
-xmemalign=4s option is used
to build a SPARC 64bit library, it's likely the JDK will crash
with a SIGBUS (alignment error).
-xO4, and the rest with
-xO2, and sometimes the JVM can make
assumptions about native code optimizations that can cause problems.
For example, on X86 it is important that the code in the native libraries have frame pointer registers, which is why we use -xregs=no%frameptr, and prevent this optimization.
Sometimes optimizations above -xO2 can remove the use of frame pointer registers (wanting the extra general purpose register for
performance sake)
and this can cause problems when doing stack frame walking.
The -xO2 level has proven to be relatively safe.
-features=no%except -DCC_NOEX
if your C++ code does not use C++ exceptions.
Unless you are well aware how to handle C++ exceptions in shared libraries. Very little of the JDK code uses C++ exceptions. The problem, as I understand it, is when the C++ exception escapes your shared library, you really don't want this to happen. So if you do use C++ exceptions, you just need to keep it 'contained' so to speak, inside your own library, handling them internally or turning them into Java exceptions with JNI. There also can be some code performance loss when the C++ compiler is generating code that needs to handle C++ exceptions. So if your code is not using C++ exceptions at all, it's best to tell the compiler that, it really can't know at compile time. -Xa -v -xstrconst -xc99=%none -errwarn=%all
with the C compiler, and -errwarn=%all with the C++ compiler.
Although not required, I have found these options to be helpful in tracking down problems in C code. The -Xa allows both ISO standard C and K&R C
but favors ISO Standard C when they conflict.
The -v asks for more warning messages.
The -xstrconst forces all string literals in a
strictly read-only area of memory.
The -xc99=%none makes sure C99 language features
are not used (assuming you want highly portable C code).
The -errwarn=%all option turns all warning errors
into fatal, and you might not want this, but if you have spent
some time in getting all your code error free, it might be worthwhile.
The Mustang (JDK 6) release does not have a 'java_g' version so this applies to Tiger (JDK 5) and older releases only. -G -z defs -z text when building your library.
Although not required, ideally you want your shared library to have a read-only and 100% shared text or code segment. These options will help guarantee that. -M mapfile.
Although this isn't technically required, it is highly recommended. A mapfile (called a version script in Linux) allows you to control various aspects of the shared library that is built. The feature of mapfiles that I recommend people should use here is the ability to limit the extern symbols accessable from your library. For example, if you had a native method called "func" in Java class "bar" which was in the Java package "foo", ultimately with the use of javah you would end up with an external symbol name of "Java_foo_bar_func", and your JNI shared library would have an extern symbol with that name. But there could be lots of extern functions in your native library, and odds are, all you want to expose is this one name. This mapfile would do the trick: Creating a shared library with only the one symbol you wanted to make available. Static links mean that the code from a library is actually copied into your own library, e.g. you inherit extern symbols The C++ runtime library is /usr/lib/libCrun.so (and also /usr/lib/libCstd.so). Although it's possible to do this, it just isn't worth it. -norunpath -xnolib.
The -xnolib makes it so you are explicit with
every library you want loaded, so if you indeed want all the
C++ runtime support libraries, you would need to add
-lCstd -lCrun -lm -lc.
The -norunpath has to do with the runpath or runtime
path directories built into the library you have built.
In general you do not want to create a library that refers to
any directories in your C++ compiler installation area.
The libCrun.so and libCstd.so
libraries will be (and should be) found in /usr/lib and in
general you don't need to do anything special for those libraries.
But if you have other private libraries that you are dependent on
you need to deal with the runpath issue (see the -R
option in the man pages).
ldd -r LibraryName.
After the shared library has been built, the utility ldd can be used to verify that all dependent libraries
have been satisfied, and all externs can be found.
If ldd says anything is missing, it is very likely that the JVM will also
be unable to load this library.
This usually means that you missed some -lname
options when building the library, or perhaps forgot a -R path
option that tells the library where to look for libraries at runtime.
Also, inspect the list of libraries that your library needs, does it make sense? LinuxFor X86:
For AMD64:
-fPIC -pthread -D_REENTRANT.
The -D_REENTRANT should be used for all compiles and links, I don't know all the details on the use of this macro,
I just know we use it.
I suspect that the use of -pthread means
that you also get -D_REENTRANT, but I'm not 100% sure of that
on all versions of Linux or GNU compilers, so you should probably
check the compiler you are using.
In addition we use -Di586 -DARCH='"i586"' -DLINUX -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -D_LITTLE_ENDIAN
on X86
and -DAMD64 -DARCH='"AMD64"' -D_LP64=1 on AMD64.
The -KPIC option makes sure your code is built in a
position-independent way to maximum use in a shared library.
-fno-omit-frame-pointer.
It is important that these libraries have frame pointer register usage, see the above comments on the Solaris -xregs=no%frameptr
option.
-fno-strict-aliasing.
Avoid this pointer optimization, on Solaris compilers this optimization kicks in at -xO5, and you'd want to avoid it there too.
If you want this optimization you need to make sure that
all pointer usage in the native code follows the rules specified
by this option.
-O3, and the rest with
-O2.
The same general comments on optimizations apply to this compiler as to the above Sun compiler. Be careful as you increase the optimization level. The -O2 level has proven to be relatively safe.
-W -Wall -Wno-unused -Wno-parentheses -Werror.
Although not required, I have found these options to be helpful in tracking down problems in C code with gcc by issuing more warning errors. The -Werror turns all warning errors
into fatal ones.
-shared -z defs -Wl,-O1 -Wl,-soname=LibraryName.
When building the shared library, this -soname option makes sure the library name is stored inside the library.
The -O1 linker option will help reduce the size of
the resulting shared library.
-Xlinker -version-script=mapfile.
| |||