OpenJDK successfully built with Visual Studio express edition
Kelly.Ohair at Sun.COM
Thu Dec 10 22:44:46 UTC 2009
Andrew John Hughes wrote:
> 2009/12/10 Kelly O'Hair <Kelly.Ohair at sun.com>:
>> Damjan Jovanovic wrote:
>>> I'm documenting my (unbelievably difficult but ultimately) successful
>>> experience of building OpenJDK on Windows with Visual Studio express
>> Thanks for sending this out. You do deserve some kind of medal, building
>> on Windows is very difficult.
>> First off, where and how did you get the sources?
>> It's not exactly clear what sources we are dealing with here.
> Errr... he says in the next paragraph 'the awt tree from about a week
> ago' i.e. http://hg.openjdk.java.net/jdk7/awt
Ah.. You are right. When I saw "awt tree" I was thinking the awt sources
in some jdk tree.... :^( Clearly it is the awt forest.
> My congratulations too on the successful build. I wouldn't even want
> to contemplate this...
>>> I built the awt tree from about a week ago, with Windows Vista, Cygwin
>>> 1.5.25-15, Microsoft Visual Studio 2008 Express Edition SP1, Freetype
>>> 2.3.5-1, jdk-7-ea-plug-b77-windows-i586-03_dec_2009.jar, DirectX SDK
>>> as per README-builds.html, Ant copied from Netbeans 6.7, and make from
>>> the cmake.org website (as per README-builds.html). The import JDK was
>> So the devil is in the details, but first off, you have picked a few things
>> that differ from our recommended set of things:
>> * Windows Vista - My condolences, but I don't know of anyone using Vista
>> to build. I know Windows 2000 is almost 10 years old, and Windows XP is
>> pretty old, but XP is the newest OS we can recommend. Anything newer is
>> in the 'on your own' category. But I am glad you were ultimately
>> at least we know it is possible.
>> * Microsoft Visual Studio 2008 Express Edition SP1 - We recommend the
>> purchased copy, but we understand why you are using this version and
>> we would like to see it work, but it's the ATL issue that is the killer.
>> Whatever adjustments we can make to allow it's use we will do.
>> * Freetype (on windows) - A royal pain in my side. More later.
>> * The jdk-7-ea-plug-b77-windows-i586-03_dec_2009.jar should not be needed
>> anymore for a successful build. I would skip it. (Binary plugs are
> Reminds me we need to forwardport the doc. update for this. OpenJDK6
> lists them as optional, but 7 doesn't.
I added a note to 6896978 for jdk7 to fix this. You are right.
>> * DirectX SDK - Which version did you use? Just curious.
>> * Ant copied from Netbeans 6.7 - If that worked, fine. But I would really
>> rather people download and install the official 1.7.1 version of ant.
>> NetBeans may be sifting out parts of ant in it's install, so using the
>> ant from NetBeans may not be the same behavior as from an official ant
>> install. But if you got it to work, that's great.
> This is especially true with the recent jaxp/jaxws changes which rely
> on the regexp extension. I know that's not in the base package on
> most GNU/Linux distros.
I added a note to 6896978 for jdk7 on this. We should be clear about this.
You could spend a lifetime keeping these READMEs up-to-date. :^(
>> * Was the cmake you got 3.81? Just curious.
>>> Firstly the README-builds.html talks a lot about path problems,
>>> without offering any good solutions. After much effort, I discovered
>>> that you have to use /cygpath/c paths only in $PATH and use double
>>> quote quoted C:/ style paths everywhere else (eg. export
>>> WindowsSdkDir="C:/Program Files/Microsoft SDKs/Windows/v6.0A/").
>> If this isn't clear I'll try and improve it.
>> By the way, the Microsoft SDK should probably be v6.1, but I don't
>> think it will matter much. You did not list installing the Microsoft SDK
>> above, did you explicitly install v6.0A or did that come with the Visual
>> Studio compiler install?
>>> Microsoft's quality C compilers apparently need environment variables
>>> set before they work properly, otherwise they crash (not complain, but
>>> actually crash). The vcvars32.bat doesn't work from inside cygwin, so
>>> I had to run "set > a.txt", then run "vcvars32.bat", then "set >
>>> b.txt", and finally diff a.txt with b.txt to find out what these
>>> mysterious variables were, then convert them into C:/ and /cygpath/c
>>> style paths that get set in cygwin. Running
>>> jdk/make/jdk_generic_profile.sh loses the variables again, so I
>>> avoided it.
>> Sigh... I should change jdk/make/jdk_generic_profile.sh, it was never
>> made cygwin compliant. That file was mainly meant for documentation
>> purposes, not sure how I feel about people using it as part of their
>> build process, :^(
>> On vcvars32.bat, I have created a shell script called vsvars.sh
>> (See http://blogs.sun.com/kto/entry/windows_visual_studio_stupid_pet)
>> that I plan on adding to the jdk repository at some point.
>> It will (from a cygwin shell) effectively do the vcvars32.bat for
>> you and set PATH correctly. All you need to do is run
>> eval `vsvars.sh -v9`
>> I hate vcvars32.bat. And you are right about the crashes and unfriendly
>> behavior, it's windows. Sorry.
>>> Compilation misdetects the Ant version and complains it is too old,
>>> but works fine.
>> "Compilation misdetects"? Can you run 'ant -version' from the command line?
>> The ant startup scripts are a bit crufty on Windows, better in ant 1.7.1,
>> but I have no idea what NetBeans has done with the Windows ant.bat or
>> ant shell script startup files.
>> On Windows, you usually need at least three things to get 'ant -version'
>> to work: 1. ant in PATH, 2. ANT_HOME set, and 3. JAVA_HOME set.
>> Unfortunately, when building the jdk, we don't allow JAVA_HOME to be
>> set right now due to the potential build problems it can introduce.
>> So getting 'ant -version' on windows has been tricky.
>> With the older ant versions (like 1.6.*, this ant startup was worse).
>> When ant is broken up and spread around, like on some Linux systems,
>> it's hard to set ANT_HOME, and I had that problem with NetBeans, and
>> on Windows, sometimes you just have to set ANT_HOME because the startup
>> script can't seem to find where it is living. :^(
>> So I always just install my own ant, makes life easier.
> Indeed, my own GNU/Linux builds set ANT to /usr/bin/ant explicitly and
> so does IcedTea.
The problem I've had with Linux builds is that depending on the Linux,
you might have a different version of ant. Some have newer ones than
others. Most work, but I just find it easier to have my own little
ant farm on all platforms. ;^)
I also work on JavaFX and it has a requirement of ant 1.7.1 because
it uses some NetBeans ant project files for building, and I think
NetBeans 6.7 started requiring ant 1.7.1, which is no sweat for NetBeans
itself because it ships it's own ant, but building outside of NetBeans
means you need ant 1.7.1 in your PATH. Oh well...
What a world ... what a world... http://www.youtube.com/watch?v=qfV_ENR5IZE
>>> Even "make sanity" rapidly died as freetype_versioncheck didn't build.
>>> claims you need OPENJDK=true set, an undocumented fact that doesn't
>>> help. After much effort I discovered
>>> where someone got it to work with Freetype 2.3.5 by copying
>>> bin/freetype.dll into lib/freetype6.dll and applying a patch; I also
>>> had to copy zlib1.dll into the build/windows-i586/btbins. Please at
>>> least document the fact Freetype 2.3.4 is the last working version?
>> Sigh... freetype... :^( What a pain on windows.
>> I'm going to file a bug on this, see if we can't clean up this dependency
>> at least as far as building or setting up goes.
>> I have been down this path, and finally published freetype binary bundles
>> at http://cr.openjdk.java.net/~ohair/FreeType/
>>> It then compiled for a few minutes further and died in the corba/
>>> subdirectory, with "COMPILER_PATH cannot be empty here". I found
>>> and edited the file in question to fix RC (I had to use the full C:/
>>> style path, the one from that email didn't work for me), unfortunately
>>> it still didn't help, so I just commented out lines 96-98 and it
>>> compiled much further.
>> Usually when you get "COMPILER_PATH cannot be empty here", one of
>> * PATH is not setup correctly (according to vcvars32.bat)
>> * ALT_COMPILER_PATH (if you set it) is not set correctly
>> * The system environment variable VS90CMNTOOLS is not defined
>> or the Makefiles can't find the default location for the compilers.
>> If you ssh into a windows system, VS90CMNTOOLS will not be set.
>> If you installed in a non-standard location, that could be the issue.
>> So I'm a little confused as how you could continue at this point and
>> would like to understand that.
>> Can you send me the "C:/Program Files/" directory where the
>> cl.exe compiler file was found in your install?
>>> The problem repeated itself under the jdk/ directory, and I had to
>>> edit another file and fix the path to RC and RCS.
>> Yes, the path to RC/RCS is problematic, I think we have a bug on that.
>> It appears to be a moving and sometimes replicated exe that moves
>> with each release. :^(
>>> Then, still in jdk/, came missing headers. The first was afxres.h
>>> which I got from mingw and copied into Visual Studio's include
>>> directory. This got it to compile further.
>> Humm... I thought we replaced a bunch of these afxres.h uses with
>> just windows.h or winres.h. Ah... jkernel... new stuff.
>>> Next missing header was atlbase.h which lead me to discover an email
>>> stating that the Visual Studio express editions are not supposed to
>>> work (again, undocumented in README-builds.html). Indeed I found that
>>> atlbase.h is part of ATL, which isn't part of any Visual Studio
>>> express edition or the Platform SDK (6 or 7). Visual Studio is
>>> expensive to buy just to compile OpenJDK. But am I really going to let
>>> that stop me, after the previous 8 hour battle?
>> Well, we can't document everything that doesn't work, but I understand
>> your situation. We had been trying to allow for the Express compiler to
>> work, but we could not guarantee it.
>> At one point, I thought we were ATL #include free, but I see jkernel changes
>> were added recently and re-introduced an atl dependency.
>>> $ grep atl * -iR | grep include
>>> Binary file hotspot/.hg/store/data/src/share/vm/include_d_b__core.i
>>> jdk/src/windows/native/sun/jkernel/kernel.cpp:#include <atlbase.h>
>>> jdk/src/windows/native/sun/jkernel/kernel.cpp:#include <atlwin.h>
>>> jdk/src/windows/native/sun/jkernel/stdafx.h:#include <atlbase.h>
>>> jdk/src/windows/native/sun/jkernel/stdafx.h:#include <atlcom.h>
>>> jdk/src/windows/native/sun/jkernel/stdafx.h:#include <atlwin.h>
>>> jdk/src/windows/native/sun/jkernel/DownloadDialog.cpp:#include <atlbase.h>
>>> jdk/src/windows/native/sun/jkernel/DownloadDialog.cpp:#include <atlcom.h>
>>> jdk/src/windows/native/sun/jkernel/DownloadDialog.cpp:#include <atlwin.h>
>>> jdk/src/windows/native/sun/jkernel/DownloadDialog.cpp:#include <atlhost.h>
>>> jdk/src/windows/native/sun/jkernel/DownloadHelper.cpp:#include <atlbase.h>
>>> jdk/src/windows/native/sun/jkernel/DownloadHelper.cpp:#include <atlcom.h>
>>> jdk/src/windows/native/sun/jkernel/DownloadHelper.cpp:#include <atlwin.h>
>>> jdk/src/windows/native/sun/jkernel/DownloadHelper.cpp:#include <atlhost.h>
>>> jdk/src/windows/native/sun/jkernel/stdafx.cpp:#include <atlimpl.cpp>
>> I see this bug has been filed recently on this problem:
>>> So in other words only jkernel uses the ATL for anything. Pity that it
>>> uses it extensively, so there's no easy way to take ATL out as a
>>> dependency. Someone should rewrite it without ATL: 4000 lines of code
>>> shouldn't hold 7 million lines hostage.
>> There may be a way to skip the jkernel build. Perhaps if you
>> removed the jkernel from SUBDIRS in jdk/make/sun/Makefile?
>> I have no idea if that would work, just a guess.
>>> But if ATL can't come out of jkernel, maybe jkernel can come out of
>>> Java. I put in lots of #if 0 around the entire contents of all the
>>> jkernel .cpp files, and made preJVMStartup() into a no-op.
>> That's another way I suppose.
>>> It compiled further, complaining in at least one place about missing
>>> /usr/bin/diff which isn't documented as a dependency, but luckily that
>>> doesn't stop the build.
>> What? Where did it complain about /usr/bin/diff? That's strange.
>> You have one I assume, but Windows processes may not accept some
>> cygwin files as being valid. Let me know if you still have
>> the error message on this, I'd like to get to the bottom of this.
>>> When it got to compiling fonts, it broke again, this time looking for
>>> freetype.dll instead of freetype6.dll. I copied the one to the other
>>> and typed make with crossed fingers. After 20 minutes of compiling it
>>> got to the fonts again and they compiled.
>> Sigh... freetype again... I'm glad you got it to compile, it
>> should not be this hard. Sorry about that.
>>> After a very long wait, it finally compiled successfully...
>>> ...and the hello world worked :-).
>> Glad it was finally successful.
>>> Now I'm onto what I thought would be the hard part: the actual patch I
>>> want to write :-).
>>> Patches I used to build it are attached.
>> I'll try and make sure there are bugs filed on these issues, can't
>> promise your exact patches can be used.
>>> Hope this helps someone.
>> I'm sure it will.
>> Now you can go get a little devil tatoo that says
>> "I built OpenJDK on Windows". ;^)
More information about the build-dev