[讨论] 在Windows中构建OpenJDK8u已经很简单了

ZHH2009 2014-10-01
这里以32位Windows7为例

1. 下载和安装一些需要用到的软件

1.1 TortoiseHg

TortoiseHg用来下载OpenJDK8u的源代码,
TortoiseHg下载页面是: http://tortoisehg.bitbucket.org/download/
选择32位版本: http://bitbucket.org/tortoisehg/files/downloads/tortoisehg-3.1.1-x86.msi



1.2 JDK7

编译OpenJDK8u的源代码需要先安装JDK7,
JDK7下载页面是: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
安装好后记得配置JAVA_HOME环境变量

1.3 Cygwin

下载 http://cygwin.com/setup-x86.exe
运行setup-x86.exe之后经过几个步骤,在选择安装包时下面这些是必需的:

Binary Name   Category        Package        Description
================================================================
ar.exe        Devel            binutils      The GNU assembler, linker and binary utilities

make.exe      Devel            make          The GNU version of the 'make' utility built for CYGWIN

m4.exe        Interpreters     m4            GNU implementation of the traditional Unix macro processor

cpio.exe      Utils            cpio          A program to manage archives of files

gawk.exe      Utils            awk           Pattern-directed scanning and processing language

file.exe      Utils            file          Determines file type using 'magic' numbers

zip.exe       Archive          zip           Package and compress (archive) files

unzip.exe     Archive          unzip         Extract compressed files in a ZIP archive

free.exe      System           procps        Display amount of free and used memory in the system
================================================================

(注: 此表来自OpenJDK8u的源代码根目录中的README-builds.html)


1.4 freetype

下载地址: http://gnuwin32.sourceforge.net/downlinks/freetype-bin-zip.php
会得到一个freetype-2.3.5-1-bin.zip文件,这里假设解压到C:\freetype-2.3.5目录

1.5 Visual Studio 2010 和 Visual Studio 2010 SP1

Visual Studio 2010下载地址:
http://download.microsoft.com/download/1/E/5/1E5F1C0A-0D5B-426A-A603-1798B951DDAE/VS2010Express1.iso

Visual Studio 2010 SP1下载地址:
http://download.microsoft.com/download/E/B/A/EBA0A152-F426-47E6-9E3F-EFB686E3CA20/VS2010SP1dvd1.iso

都是英文版,先装Visual Studio 2010再装Visual Studio 2010 SP1


2. 下载和编译OpenJDK8u的源代码

2.1 下载源代码

可以先建个目录,比如E:\openjdk,然后在命令行提示符下进入此目录,
接着顺序执行下面的命令:
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev
cd jdk8u-dev
sh get_source.sh



2.2 编译源代码

执行完2.1后再顺序执行下面的命令:

bash ./configure --with-freetype=/cygdrive/c/freetype-2.3.5 --with-target-bits=32 --enable-debug --with-jvm-variants=client 

make images


其中/cygdrive/c/freetype-2.3.5就是在上面1.3小节中提到的C:\freetype-2.3.5目录,
--with-target-bits=32表示构建32位的JDK,
--enable-debug表示构建一个可以调试的JDK(fastdebug),
--with-jvm-variants=client表示只构建client版的JVM,不加这个参数默认构建server版的,
如果使用--with-jvm-variants=client,server则同时构建client和server版的JVM。

make images会生成j2sdk-image

构建后的文件都在E:\openjdk\jdk8u-dev\build\windows-x86-normal-client-fastdebug目录中,
执行此目录下的
images\j2re-image\bin\java.exe -version
images\j2sdk-image\bin\java.exe -version
jdk\bin\java.exe -version
都有如下输出
openjdk version "1.8.0-internal-fastdebug"
OpenJDK Runtime Environment (build 1.8.0-internal-fastdebug-_2014_10_01_13_35-b00)
OpenJDK Client VM (build 25.40-b11-fastdebug, mixed mode)



更多有关编译构建OpenJDK8u源代码的细节可以参考源代码根目录中的README-builds.html
ZHH2009 2014-10-01
如何在Visual Studio 2010调试HotSpot VM以及一些不属于HotSpot VM的代码?


1. 生成Visual Studio项目

假设在前面把Visual Studio 2010和Cygwin安装到如下目录:
D:\VS2010
D:\Cygwin


然后修改E:\openjdk\jdk8u-dev\hotspot\make\windows\makefiles\projectcreator.make文件,
在ProjectCreatorIncludesPRIVATE那一项追加一个"-ignorePath aix"(这是官方遗漏了)
--------------------------------------
    -ignorePath zero \
    -ignorePath aix \
--------------------------------------
否则在Visual Studio 2010中有编译错误.

接着在命令行提示符下进入E:\openjdk\jdk8u-dev\hotspot\make\windows目录,
顺序执行如下命令:
D:\VS2010\Common7\Tools\vsvars32.bat
set HOTSPOTMKSHOME=D:\Cygwin\bin 
create E:\openjdk\jdk8u-dev\build\windows-x86-normal-client-fastdebug\images\j2sdk-image
(注: create对应当前目录下的create.bat文件)


生成的项目文件在E:\openjdk\jdk8u-dev\hotspot\build\vs-i486目录中。


2. 导入项目

运行Microsoft Visual Studio 2010, 按Ctrl + Shift + O,
打开E:\openjdk\jdk8u-dev\hotspot\build\vs-i486\jvm.vcxproj
然后右击左边的jvm项目名,选择Build就可以构建jvm了。

3. 调试HotSpot VM

在Visual Studio 2010中打开jvm\share\vm\runtime\thread.cpp文件,
在create_vm方法中(比如对应"if (!is_supported_jni_version(args->version))"这行)打个断点,
然后按F5就可以了,会先进入e:\openjdk\jdk8u-dev\jdk\src\share\bin\main.c,这个文件不属于HotSpot,
实际上对应java.exe。

最后点Debug->Continue就会转到create_vm方法中。
wingwing1987 2014-10-12
执行
bash ./configure --with-freetype=/cygdrive/c/freetype-2.3.5 --with-target-bits=32 --enable-debug --with-jvm-variants=client  

报错,权限都有了

configure: error: Bad file permissions on src files. This is usually caused by cloning the repositories with a non cygwin hg in a directory not created in cygwin.
configure exiting with result code 1
wingwing1987 2014-10-12
wingwing1987 写道
执行
bash ./configure --with-freetype=/cygdrive/c/freetype-2.3.5 --with-target-bits=32 --enable-debug --with-jvm-variants=client  

报错,权限都有了

configure: error: Bad file permissions on src files. This is usually caused by cloning the repositories with a non cygwin hg in a directory not created in cygwin.
configure exiting with result code 1



突然又可以,完全无解,搞了两日。。。。删除一下,编译一下。。
还是多谢楼主分享。
ZHH2009 2014-10-12
cygwin和hg在Windows下我有时也会碰到一些很奇怪的问题,
比如下载源代码时有时cpu占用率超高,甚至看上去像死机了一样,
特别是到clone jdk那个提示时,1个小时过去了都没响应,目录中也没看到有更新,
杀掉进程后然后又看到目录中有更新了,sh get_source.sh那条命令要执行多次才勉强下完代码。

构建过程中也会很耗时间,总之若出现想不到的错误,删除build目录,重来一次。

我在这两个过程中出现问题最多的是在下载源代码那,构建过程倒是很顺利。
wingwing1987 2014-10-13
ZHH2009 写道
cygwin和hg在Windows下我有时也会碰到一些很奇怪的问题,
比如下载源代码时有时cpu占用率超高,甚至看上去像死机了一样,
特别是到clone jdk那个提示时,1个小时过去了都没响应,目录中也没看到有更新,
杀掉进程后然后又看到目录中有更新了,sh get_source.sh那条命令要执行多次才勉强下完代码。

构建过程中也会很耗时间,总之若出现想不到的错误,删除build目录,重来一次。

我在这两个过程中出现问题最多的是在下载源代码那,构建过程倒是很顺利。


cygwin 想问问你,你安装几个包?按照官方几个组件还是全安装?

我试一下,又有问题,我make的版本是4.0,

编译没什么错,make iamges就报错,是make版本太高?


====================================================
A new configuration has been successfully created in
/cygdrive/d/openjdk/jdk8u-dev/build/windows-x86-normal-client-fastdebug
using configure arguments '--with-freetype=/cygdrive/d/freetype-2.3.5 --with-target-bits=32 --enable-debug --with-jvm-variants=client'.

Configuration summary:
* Debug level:    fastdebug
* JDK variant:    normal
* JVM variants:   client
* OpenJDK target: OS: windows, CPU architecture: x86, address length: 32

Tools summary:
* Environment:    cygwin version 1.7.32(0.274/5/3) (root at /cygdrive/d/cygwin)
* Boot JDK:       java version "1.7.0_67"  Java(TM) SE Runtime Environment (build 1.7.0_67-b01)  Java HotSpot(TM) Client VM (build 24.65-b04, mixed mode)   (at /cygdrive/c/jdk)
* C Compiler:     Microsoft CL.EXE version 16.00.40219.01 (at /cygdrive/c/VS/VC/BIN/cl)
* C++ Compiler:   Microsoft CL.EXE version 16.00.40219.01 (at /cygdrive/c/VS/VC/BIN/cl)

Build performance summary:
* Cores to use:   1
* Memory limit:   1907 MB
* ccache status:  installed and in use

WARNING: The result of this configuration has overridden an older
configuration. You *should* run 'make clean' to make sure you get a
proper build. Failure to do so might result in strange build problems.



$ make images

报错

Building OpenJDK for target 'images' in configuration 'windows-x86-normal-client-fastdebug'

## Starting langtools
Compiling 2 files for BUILD_TOOLS
d:\openjdk\jdk8u-dev\langtools\src\share\classes\com\sun\tools\javac\parser\JavacParser.java:310: error: cannot find symbol
        return tk.accepts(S.token(lookahead + 1).kind);
                                                ^
  symbol:   variable kind
  location: class Token
d:\openjdk\jdk8u-dev\langtools\src\share\classes\com\sun\tools\javac\parser\JavacParser.java:318: error: cannot find symbol
        return tk1.accepts(S.token(lookahead + 1).kind) &&
                                                 ^
  symbol:   variable kind
  location: class Token
d:\openjdk\jdk8u-dev\langtools\src\share\classes\com\sun\tools\javac\parser\JavacParser.java:319: error: cannot find symbol
                tk2.accepts(S.token(lookahead + 2).kind);
                                                  ^
  symbol:   variable kind
  location: class Token
d:\openjdk\jdk8u-dev\langtools\src\share\classes\com\sun\tools\javac\parser\JavacParser.java:327: error: cannot find symbol
        return tk1.accepts(S.token(lookahead + 1).kind) &&
                                                 ^
  symbol:   variable kind
  location: class Token
d:\openjdk\jdk8u-dev\langtools\src\share\classes\com\sun\tools\javac\parser\JavacParser.java:328: error: cannot find symbol
                tk2.accepts(S.token(lookahead + 2).kind) &&
                                                  ^
  symbol:   variable kind
  location: class Token
d:\openjdk\jdk8u-dev\langtools\src\share\classes\com\sun\tools\javac\parser\JavacParser.java:329: error: cannot find symbol
                tk3.accepts(S.token(lookahead + 3).kind);


ZHH2009 2014-10-13
cygwin都装了什么,记不清了,反正装了几年了,make版本也是4.0。

能执行make和bash了,说明cygwin该装的组件都装了。

make clean不一定奏效的,直接把build目录删除。

错误提示明显就跟cygwin无关,那个明显就是javac编译器发出的错误,
按照它给出的错误看看JavacParser.java文件用到的Token类为什么没有kind字段?



出现错误自己试着按错误提示找找原因吧。


surecn 2014-10-14
我在mac 下编译一直提示FreeType version  2.3.0  or higher is required这个错误
已经装了freetype 了, 命令行下freetype-config --ftversion 看到的就是2.5.3,请求大神帮忙
erdas_zhuang 2014-10-22

谢谢你这个文档。我的机器是64位win7,磕磕碰碰走到最后一步,然后出了问题:调试HotSpot VM。

问题是,按F5之后一个窗口闪过,vs2010的Output窗口有如下信息:

'java.exe': Loaded 'C:\downloads\myBooks\Java\OpenJDK\openjdk8u-dev\build\windows-x86_64-normal-server-fastdebug\images\j2sdk-image\bin\java.exe', Symbols loaded.

'java.exe': Loaded 'C:\Windows\System32\ntdll.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\kernel32.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\advapi32.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\msvcrt.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\sechost.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\rpcrt4.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\user32.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\gdi32.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\lpk.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\usp10.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\winsxs\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_fa396087175ac9ac\comctl32.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\shlwapi.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\imm32.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\Windows\System32\msctf.dll', Cannot find or open the PDB file

'java.exe': Loaded 'C:\downloads\myBooks\Java\OpenJDK\openjdk8u-dev\build\windows-x86_64-normal-server-fastdebug\images\j2sdk-image\jre\bin\msvcr100.dll', Symbols loaded.

The program '[7472] java.exe: Native' has exited with code 6 (0x6).

 

从出错信息上看,大概是说包含调试信息的pdb文件没有找到。

不过我编译整个opendjk8用的参数是--enable-debug,所以应该pdb都产生了。只是没有指定路径。

Did I miss anything important ?

谢谢。

ZHH2009 2014-10-22
提示信息只是说windows相关的dll的pdb没找到,这个很正常的,除非你的windows也是可调试的。openjdk的明显提示Symbols loaded了呀。

你可以把错误输出到一个日志文件的
怎么输出:
引用

在Visual Studio左边的Solution Explorer窗口中右击jvm项目,
在弹出菜单中选择Properties,紧接着出来"jvm Property Pages"窗口,
点Configuration Properties -> Debugging
在Command 最后加上 >E:\log.txt 2>&1
就可以重定向了


另外,你构建的是server版的jdk,
引用
windows-x86_64-normal-server-fastdebug

在“1. 生成Visual Studio项目 ”那里生成的是client版的jvm还是server?
Global site tag (gtag.js) - Google Analytics