ubuntu 环境: 20.04 jdk 版本: openjdk-8 源码下载 openjdk的源码可以从github中获取:
1 2 3 git clone https://github.com/openjdk/jdk.git git checkout jdk8-b120 git checkout -b tag-jdk8-b120
国内码云上有同步的镜像仓库:
1 git clone git@gitee.com:mirrors/openjdk.git
源码编译 安装依赖 运行configure前先安装一些依赖:
1 sudo apt install gcc g++ gdb make build-essential cpio libasound2-dev libfreetype6-dev libcups2-dev libfontconfig1-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libffi-dev
执行configure
configure会检查项目依赖,如果有缺失的,按照提示安装即可。
Boot JDK JDK的编译需要“版本-1”的JDK,例如在编译JDK8时,会提示:
1 configure: Could not find a valid Boot JDK. You might be able to fix this by running 'sudo apt-get install openjdk-7-jdk'.
由于当前源不包含openjdk7,直接使用jdk8进行编译
1 bash configure --with-boot-jdk=/home/victorchutian/.sdkman/candidates/java/8.0.282-open
freeType 参考stackoverflow 增加编译参数:
1 2 3 4 bash configure \ --with-boot-jdk=/home/victorchutian/.sdkman/candidates/java/8.0.282-open \ --with-freetype-include=/usr/include/freetype2 \ --with-freetype-lib=/usr/lib/x86_64-linux-gnu \
最终参数 configure最终参数为:
1 2 3 4 5 6 7 8 bash configure \ --with-boot-jdk=/home/victorchutian/.sdkman/candidates/java/8.0.282-open \ --with-freetype-include=/usr/include/freetype2 \ --with-freetype-lib=/usr/lib/x86_64-linux-gnu \ --with-target-bits=64 \ --with-debug-level=slowdebug \ --with-jvm-variants=server \ --enable-debug-symbols
make 接下来就是编译:
OS is not supported 编译报错:
1 *** This OS is not supported: Linux 9c888f853395 5.19.0-43-generic #44~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon May 22 13:39:36 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
修改Makefile
1 2 SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4% 5%
/usr/bin/make: invalid option -- '/'
修改hotspot/make/linux/makefiles/adjust-mflags.sh文件
1 2 3 4 5 6 7 8 9 @@ -64,7 +64,7 @@ echo "$MFLAGS " \ | sed ' s/^-/ -/ - s/ -\([^ ][^ ]*\)j/ -\1 -j/ + s/ -\([^ I][^ I]*\)j/ -\1 -j/ s/ -j[0-9][0-9]*/ -j/ s/ -j\([^ ]\)/ -j -\1/ s/ -j/ -j' ${HOTSPOT_BUILD_JOBS:-${default_build_jobs} } '/
all warnings being treated as errors
hotspot/make/linux/makefiles/gcc.make,200行左右:
1 2 3 WARNINGS_ARE_ERRORS=-Werror 改为 WARNINGS_ARE_ERRORS=-Wno-error
语法错误 重新编译后还是有大量语法错误。将gcc版本控制在5.0以下,见jdk8最小构建环境
1 sudo apt install gcc-4.8 g++-4.8
如果出现Package ‘gcc-4.8’ has no installation candidate
1 2 3 4 deb http://dk.archive.ubuntu.com/ubuntu xenial main deb http://dk.archive.ubuntu.com/ubuntu xenial universe apt update
设置gcc为4.8版本的gcc
1 2 3 4 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
然后重新运行configure,继续编译。
class jdk.nashorn.internal.objects.ScriptFunctionImpl overrides final method setPrototype
修改nashorn/make/BuildNashorn.gmk文件,修改前:
1 2 3 4 5 6 7 8 9 10 11 73 # Copy classes to final classes dir and run nasgen to modify classes in jdk.nashorn.internal.objects package 74 $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run: $(BUILD_NASGEN) 75 $(ECHO) Running nasgen 76 $(MKDIR) -p $(@D) 77 $(RM) -rf $(@D)/jdk $(@D)/netscape 78 $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/ 79 $(FIXPATH) $(JAVA) \ 80 -cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \ 81 jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D) 82 $(TOUCH) $@ 83
修改第80行,修改后:
1 2 3 4 5 6 7 8 9 10 11 73 # Copy classes to final classes dir and run nasgen to modify classes in jdk.nashorn.internal.objects package 74 $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run: $(BUILD_NASGEN) 75 $(ECHO) Running nasgen 76 $(MKDIR) -p $(@D) 77 $(RM) -rf $(@D)/jdk $(@D)/netscape 78 $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/ 79 $(FIXPATH) $(JAVA) \ 80 -Xbootclasspath/p:"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \ 81 jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D) 82 $(TOUCH) $@ 83
编译完成 最后可以看到编译完成的日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # Finished docs (build time 00:00:43) ----- Build times ------- Start 2020-07-03 01:06:25 End 2020-07-03 01:09:40 00:00:09 corba 00:00:05 demos 00:00:43 docs 00:00:48 hotspot 00:00:07 images 00:00:06 jaxp 00:00:08 jaxws 00:00:53 jdk 00:00:12 langtools 00:00:04 nashorn 00:03:15 TOTAL
执行java命令:
1 2 3 4 5 $ ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version openjdk version "1.8.0-internal-debug" OpenJDK Runtime Environment (build 1.8.0-internal-debug-victorchutian_2020_07_03_18_32-b00) OpenJDK 64-Bit Server VM (build 25.0-b62-debug, mixed mode) victorchutian@9c888f853395:~/projects/openjdk$
vscode launch.json launch.json配置如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 { "version" : "0.2.0" , "configurations" : [ { "name" : "(gdb) Launch" , "type" : "cppdbg" , "request" : "launch" , "program" : "${workspaceFolder}/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java" , "args" : [ "-version" ] , "stopAtEntry" : true , "cwd" : "${workspaceFolder}" , "environment" : [ ] , "externalConsole" : false , "MIMode" : "gdb" , "miDebuggerPath" : "/usr/bin/gdb" , "setupCommands" : [ { "description" : "Enable pretty-printing for gdb" , "text" : "-enable-pretty-printing" , "ignoreFailures" : true } ] } ] }
c_cpp_properties.json vscode cpp插件需要c_cpp_properties.json.
首先安装compiledb 。然后使用compiledb make all
编译。然后会在项目根目录下生成文件compile_commands.json
。将其中的 -D 后的所有参数收集起来,然后将收集起来的参数添加到 c_cpp_properties.json 中的 define 配置中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { "configurations" : [ { "name" : "Linux" , "includePath" : [ "${workspaceFolder}/**" ] , "defines" : [ "LINUX" , "_GNU_SOURCE" , "AMD64" , "ASSERT" , "TARGET_OS_FAMILY_linux" , "TARGET_ARCH_x86" , "TARGET_ARCH_MODEL_x86_64" , "TARGET_OS_ARCH_linux_x86" , "TARGET_OS_ARCH_MODEL_linux_x86_64" , "TARGET_COMPILER_gcc" , "COMPILER2" , "COMPILER1" , "_REENTRANT" ] , "compilerPath" : "/usr/bin/g++" , "cStandard" : "c11" , "cppStandard" : "c++14" , "intelliSenseMode" : "linux-gcc-x64" , "compileCommands" : "${workspaceFolder}/compile_commands.json" } ] , "version" : 4 }
参考资料