Win10下编译OpenJDK8

2023年 2月 28日 93点热度 0人点赞

踩了无数的坑之后终于成功的在Windows10下编译了OpenJDK8,在Windows下编译JDK确实比较麻烦,所以在这里记录下本人编译的整个过程,可以作为备忘的同时还能分享给他人。

相关参考文章

文本在编写和实施过程中参考了如下的博文或文章:

https://blog.csdn.net/wqlinloveruby/article/details/80409031https://www.jianshu.com/p/e85f93cc74cb

OpenJDK源码目录下的README-builds.html官方文档

编译环境

Windows10专业版64位;

编译前准备

Tip: 以下软件的安装和解压目录尽量不要包含中文或空格,不然可能会出现问题

1.安装 Visual Studio 2010 Professional

在windows下编译JDK需要使用Visual Studio 2010 Professional

推荐下载地址:https://msdn.itellyou.cn/

最好下载英文版的IDE,不然可能会出现问题,下载完成后只用勾选安装C++部分就行

2. 准备OpenJDK8

首先下载OpenJDK8,推荐下载地址:https://download.java.net/openjdk/jdk8 ,下载完成后解压

3. 编译JDK环境安装

编译OpenJDK需要本机先安装上JDK作为编译JDK,而且该编译JDK的版本必须要使用前一个版本的JDK,编译OpenJDK8需要安装JDK7 Update 7 以后的版本。

首先下载Oracle JDK7 并解压,推荐下载地址:https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

下载完成后配置JDK环境变量(JAVA_HOME、Path、classpath)

配置完后验证下:

4. 安装Cygwin

编译JDK需要使用到Unix和Linux上的一些工具软件,Cygwin可以在Windows上运行这些系统上的软件

推荐下载地址:http://www.cygwin.com/

下载最新版的Cygwin后安装,由于默认的安装只会安装一些必要的软件,所以安装过程中需要选择安装一些额外的包,需要的包如下图:

Tip: 如果已经安装完了Cygwin软件后,想要继续安装其他的软件包,可以再次运行Cygwin的安装程序,在过程中确保其选中了本地的Cygwin安装目录,一直点击下一步后会出现选择安装包的界面。

5. 准备FreeType-2.7

编译JDK需要用到FreeType,它是一个字体渲染库,官方文档中没有提及,但它是必须的。最好使用2.7版本的,我先前使用较新版本的会出现问题。

推荐下载地址:https://www.freetype.org/ ,下载完成后解压

运行Visual Studio 2010,依次点击 File -> Open -> Project/Solution

选择打开 freetype-2.7/builds/windows/vc2010/freetype.sln 文件,选中项目后右击选择Properties,弹出窗口后操作如下图:

点击应用后再点击确定关闭窗口,右击项目,点击 Build 按钮后成功编译出lib文件。

再次右击项目,点击 Properties按钮,弹出窗口。

点击应用后再点击确定关闭窗口;右击项目,点击 Build 按钮后成功编译出dll文件。

在 freetype-2.7/ 目录下新建 lib 目录

将 freetype-2.7/objs/vc2010/x64 目录下的 freetype.lib 和 freetype.dll 两个文件拷贝到lib目录下

开始编译

1.生成编译配置脚本

运行Cygwin,cd 进入OpenJDK8的根目录

Tip :Cygwin中的目录可以直接用Windows的目录标记方式,比如:‘D:DirNamefile.txt’,单必须使用单引号包围,也可以使用类似linux的形式:如:/cygdrive/d/DirName/file.txt,推荐使用后一种方式兼容性较好。

输入如下命令:

./configure --with-freetype=**/freetype-2.7/ --with-target-bits=64 --enable-debug

注意以上的freetype路径替换成你本机上的路径

运行成功后显示如下:

如果生成配置文件失败,请查看下面的失败问题处理

2.编译JDK

Cygwin切换到JDK根目录下

执行如下命令

make all

命令执行后会开始编译,编译过程可能比较久,具体看机器性能

编译成功后显示如下:

如果编译失败请查看下面的失败问题处理

3.验证编译结果

在这里仅简单验证一下,官方说需要用jtreg来进行回归测试,但该测试比较麻烦和耗时所以就先忽略

运行 cmd.exe ,进入目录 openjdk8/build/windows-x86_64-normal-server-fast/debug/jdk/bin

依次输入命令:

javac -version

java -version

可以看到自己编译的JDK包含了一些独特的信息

失败问题处理

下面描述了本人在编译过程中遇到过的问题和解决方法,如果你遇见了其他的问题,请参考其他相关博客或资料,同时欢迎在评论区探讨该问题或解决方案

1.提示cygwin太老,但使用的cygwin确实是1.7版本以后的版本

提示如下如图:

这是由于OpenJDK8自带的生成配置的脚本的问题。

文本编辑器打开OpenJDK目录下的 openjdk8/common/autoconf/generated-configure.sh 这个文件

搜索上面的提示文字“Your cygwin is too old

将if条件语句注释掉

2.编译images库时失败

执行编译到images相关库的时候会出错

错误信息中显示了一个CreateJars.gmk出错,查阅相关资料后发现是文件中需要加上两个回车符号,也就是 'r’表示为CR这个符号。

用 Notepad++ 软件打开OpenJDK目录里的 CreateJars.gmk 这个文件

依次点击菜单栏中的:视图 -> 显示符号 -> 显示所有符号

然后就可以看到所有的符号,包括换行符和回车符

找到文件中如下的地方:

在两个 ‘class$$’ 中间加入回车符号(按下Ctrl + M),如下图:

修改完成后保存,执行 make clean 命令清理后再次执行 make all 编译

原文地址:Win10下编译OpenJDK8

我遇到的问题

cygwin \r命令没有找到

git的core.autocrlf问题:我的openjdk源码是github上下载的,checkout到某个分支的时候会进行crlf的转换,导致很多shell脚本执行有问题,这个时候需要设置git config core.autocrlf false,然后重新checkout分支。

freetype编译32位和64位的问题

在configure的时候一直提示:Can not continue without freetype. You need to build a 64-bit version of freetype.

我用VS2010编译的时候肯定选的是x64,但是configure始终包那个错,好久都没解决,然后看到github有freetype编译好的64位的lib,我就直接下载过来用了。

下载地址在这里:freetype release in github

增量编译问题

windows下的增量编译问题真的找了好久。

ChangeSet 8179079:Incremental HotSpot builds broken on WindowsIncremental HotSpot builds broken on Windows

--- a/make/common/NativeCompilation.gmk	Mon Apr 16 00:48:00 2018 -0700
+++ b/make/common/NativeCompilation.gmk	Wed Apr 18 03:57:40 2018 -0700
@@ -116,6 +116,7 @@
 	  ($(ECHO) $$@: \\ \
 	  && $(SED) -e '/^Note: including file:/!d' \
 	      -e 's|Note: including file: *||' \
+          -e 's|\r||g' \
 	      -e 's|\\|/|g' \
 	      -e 's|^\([a-zA-Z]\):|/cygdrive/\1|g' \
 	      -e '/$(subst /,\/,$(TOPDIR))/!d' \

其实就是加了一行。

总结

configure脚本

./configure  --with-freetype=/cygdrive/c/Users/yangxu/projects/freetype-2.7.1/ --with-target-bits=64 --enable-debug  --with-boot-jdk=/cygdrive/c/tools/jdk1.7.0_80

文件修改

duhbb@duhbb /cygdrive/c/Users/duhbb/projects/jdk
$ git diff

##############################################################################################
# 解决cygwin版本太低
##############################################################################################

diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh
index 13440958a83..629bb8e95a0 100644
--- a/common/autoconf/generated-configure.sh
+++ b/common/autoconf/generated-configure.sh
@@ -7218,11 +7218,11 @@ $as_echo "$CYGWIN_VERSION" >&6; }
     WINDOWS_ENV_VERSION="$CYGWIN_VERSION"

     CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION | $GREP ^1.7.`
-    if test "x$CYGWIN_VERSION_OK" = x; then
-      { $as_echo "$as_me:$: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&5
-$as_echo "$as_me: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&6;}
-      as_fn_error $? "Cannot continue" "$LINENO" 5
-    fi
+#    if test "x$CYGWIN_VERSION_OK" = x; then
+#      { $as_echo "$as_me:$: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&5
+#$as_echo "$as_me: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&6;}
+#      as_fn_error $? "Cannot continue" "$LINENO" 5
+#    fi
     if test "x$CYGPATH" = x; then
       as_fn_error $? "Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" "$LINENO" 5
     fi

##############################################################################################
# MSVC忽略警告
##############################################################################################
diff --git a/hotspot/make/windows/makefiles/compile.make b/hotspot/make/windows/makefiles/compile.make
index 9da2742335e..cd27a3423f8 100644
--- a/hotspot/make/windows/makefiles/compile.make
+++ b/hotspot/make/windows/makefiles/compile.make
@@ -53,7 +53,7 @@ CXX=cl.exe
 # improving the quality of crash log stack traces involving jvm.dll.

 # These are always used in all compiles
-CXX_FLAGS=$(EXTRA_CFLAGS) /nologo /W3 /WX
+CXX_FLAGS=$(EXTRA_CFLAGS) /nologo /W3 /WX-

 # Let's add debug information when Full Debug Symbols is enabled
 !if "$(ENABLE_FULL_DEBUG_SYMBOLS)" == "1"

##############################################################################################
# MSVC忽略警告
##############################################################################################
diff --git a/hotspot/src/share/tools/hsdis/Makefile b/hotspot/src/share/tools/hsdis/Makefile
index 2a48f9a81d8..c67134b4f51 100644
--- a/hotspot/src/share/tools/hsdis/Makefile
+++ b/hotspot/src/share/tools/hsdis/Makefile
@@ -116,7 +116,7 @@ OUTFLAGS        += -o $@
 else #Windows
 OS             = windows
 CC             = gcc
-CFLAGS         +=  /nologo /MD /W3 /WX /O2 /Fo$(@:.dll=.obj) /Gi-
+CFLAGS         +=  /nologo /MD /W3 /WX- /O2 /Fo$(@:.dll=.obj) /Gi-
 CFLAGS         += LIBARCH=\"$(LIBARCH)\"
 DLDFLAGS       += /dll /subsystem:windows /incremental:no \
                        /export:decode_instruction

##############################################################################################
# Windows下的回车问题
##############################################################################################
diff --git a/jdk/make/CreateJars.gmk b/jdk/make/CreateJars.gmk
index 1c020634dae..5b7f58a82a6 100644
--- a/jdk/make/CreateJars.gmk
+++ b/jdk/make/CreateJars.gmk
@@ -265,7 +265,7 @@ $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.jars.contents: $(BUILD_TOOLS) $(IMAGES_OU
 $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.rt.jar.contents: $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.jars.contents
        $(MKDIR) -p $(@D)
        $(RM) $@ $@.tmp
-       $(GREP) -e '\.class$$' $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.jars.contents > $@.tmp
+       $(GREP) -e '\.class^M$$' $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.jars.contents > $@.tmp
         ifneq ($(PROFILE), )
           # # Add back classes from excluded packages (fixing the $ substitution in the process)
          for type in $(subst \$$,\, $(RT_JAR_INCLUDE_TYPES)) ; do \
@@ -277,7 +277,7 @@ $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.rt.jar.contents: $(IMAGES_OUTPUTDIR)/lib$
 $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.resources.jar.contents: $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.jars.contents
        $(MKDIR) -p $(@D)
        $(RM) $@ $@.tmp
-       $(GREP) -v -e '\.class$$' \
+       $(GREP) -v -e '\.class^M$$' \
            -e '/_the\.*' -e '^_the\.*' -e '\\_the\.*' -e 'javac_state' \
            $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.jars.contents > $@.tmp
         ifneq ($(PROFILE), )

##############################################################################################
# Windows下的回车问题
##############################################################################################
diff --git a/make/common/NativeCompilation.gmk b/make/common/NativeCompilation.gmk
index 6ee497f5262..003ba1a2066 100644
--- a/make/common/NativeCompilation.gmk
+++ b/make/common/NativeCompilation.gmk
@@ -116,6 +116,7 @@ define add_native_source
          ($(ECHO) $$@: \\ \
          && $(SED) -e '/^Note: including file:/!d' \
              -e 's|Note: including file: *||' \
+             -e 's|\r||g' \
              -e 's|\\|/|g' \
              -e 's|^\([a-zA-Z]\):|/cygdrive/\1|g' \
              -e '/$(subst /,\/,$(TOPDIR))/!d' \

##############################################################################################
# 参数问题
##############################################################################################
diff --git a/nashorn/make/BuildNashorn.gmk b/nashorn/make/BuildNashorn.gmk
index fc87044245b..a987874c7ea 100644
--- a/nashorn/make/BuildNashorn.gmk
+++ b/nashorn/make/BuildNashorn.gmk
@@ -77,7 +77,7 @@ $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run: $(BUILD_NASGEN)
        $(RM) -rf $(@D)/jdk $(@D)/netscape
        $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/
        $(FIXPATH) $(JAVA) \
-           -cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \
+           -Xbootclasspath/p:"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \
            jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D)
        $(TOUCH) $@

命令

make all JOBS=32

rainbow

这个人很懒,什么都没留下

文章评论