天天看點

Manjaro通過源碼編譯jdk11

我在編譯中遇到的最大的問題就是gcc版本問題,因manjaro是滾動更新,是以gcc也是很新的版本,導緻無法編譯jdk11

1 下載下傳源碼

網上根據關鍵詞查找jdk源碼,查找出來很多可以下載下傳源碼的連結,這裡我們使用github去官方倉庫,openjdk是托管在github的OpenJDK組織下,該組織下有各個版本的openjdk源碼,不要直接使用jdk倉庫,這個倉庫存放的是目前正在開發的最新版本代碼,我們要用的是jdk11,是以我們搜尋jdk11倉庫,我這裡選擇的是jdk11u這個庫。

Manjaro通過源碼編譯jdk11
git clone https://github.com/openjdk/jdk11u.git
           

2 編譯

按照readme的文檔進行編譯

Manjaro通過源碼編譯jdk11

2.1 configure

首先執行進入源碼目錄,執行

bash configure

此指令會檢查編譯需要的環境,如果報錯,根據錯誤提示安裝必要的編譯工具。

注意事項:

  1. 安裝必要的環境,包括gcc、autoconf、boot JDK等
  2. 編譯一個jdk是需要依賴一個現有的jdk,另外對版本有要求,比如你編譯的版本是N,則需要你電腦上有一個版本至少為N-1的版本,這裡我編譯jdk11時,我電腦事先安裝了jdk11,理論上至少需要一個jdk10+
  3. gcc版本不能太老,也不能太新,這裡一定要看你目前版本對應的文檔,每個jdk版本對gcc版本要求也不一樣,新版本jdk肯定能相容更新的gcc,我在編譯jdk11時,因為我的manjro是滾動更新,gcc版本是12,結果太新了導緻編譯報錯。
bash configure
#……省略前邊若幹日志
#……
config.status: creating /home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release/buildjdk-spec.gmk
config.status: creating /home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release/compare.sh
config.status: creating /home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release/Makefile

====================================================
The existing configuration has been successfully updated in
/home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release
using default settings.

Configuration summary:
* Debug level:    release
* HS debug level: product
* JVM variants:   server
* JVM features:   server: 'aot cds cmsgc compiler1 compiler2 epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services vm-structs zgc' 
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 11.0.18-internal+0-adhoc.chenkun.jdk11u (11.0.18-internal)

Tools summary:
* Boot JDK:       openjdk version "11.0.17" 2022-10-18 OpenJDK Runtime Environment (build 11.0.17+1) OpenJDK 64-Bit Server VM (build 11.0.17+1, mixed mode) (at /usr/lib/jvm/java-11-openjdk)
* Toolchain:      gcc (GNU Compiler Collection)
* C Compiler:     Version 12.2.0 (at /usr/bin/gcc)
* C++ Compiler:   Version 12.2.0 (at /usr/bin/g++)

Build performance summary:
* Cores to use:   16
* Memory limit:   31876 MB

           

如上,執行

bash configure

後,檢查了環境包括Boot JDK,Toochain,C Compiler,C++ Compiler,這裡c和c++編譯器版本要一緻,可以看到上面我的版本是12.2.0,這個版本太新會導緻編譯有問題,在building文檔中也有說明,最新支援到7.4,更新的版本沒有測試,可能相容可能不相容。

Manjaro通過源碼編譯jdk11

2.2 執行編譯make images

make images
##省略中間若幹日志
/home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp:105:31: error: non-static data member initializers only available with '-std=c++11' or '-std=gnu++11' [-Werror=c++11-extensions]
  105 |     CgroupV1Controller* _pids = NULL;
   ... (rest of output omitted)
* For target hotspot_variant-server_libjvm_objs_cgroupV2Subsystem_linux.o:
In file included from /home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp:25:
/home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp:54:32: error: non-static data member initializers only available with '-std=c++11' or '-std=gnu++11' [-Werror=c++11-extensions]
   54 |     CgroupController* _unified = NULL;
      |                                ^
/home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp:56:38: error: non-static data member initializers only available with '-std=c++11' or '-std=gnu++11' [-Werror=c++11-extensions]
   56 |     CachingCgroupController* _memory = NULL;
      |                                      ^
/home/chenkun/IdeaProjects/jdk11u/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp:57:35: error: non-static data member initializers only available with '-std=c++11' or '-std=gnu++11' [-Werror=c++11-extensions]
   57 |     CachingCgroupController* _cpu = NULL;
      |                                   ^
cc1plus: all warnings being treated as errors

* All command lines available in /home/chenkun/IdeaProjects/jdk11u/build/linux-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===

No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See doc/building.html#troubleshooting for assistance.

make[1]: *** [/home/chenkun/IdeaProjects/jdk11u/make/Init.gmk:305:main] 錯誤 2
make: *** [/home/chenkun/IdeaProjects/jdk11u/make/Init.gmk:186:images] 錯誤 2

           

以上編譯報錯了,根據搞錯大概也看出編譯器的版本最大隻能支援到11,是以我這裡需要安裝另一個版本的編譯器,這裡就展現arch系linux的缺點了,滾動版本太激進會導緻有的老軟體存在各種版本不相容。

2.3 解決編譯器gcc版本問題

使用yay安裝老版本的gcc,這裡我和文檔保持一緻,文檔說目前最新的已測試通過的版本是gcc7,這裡我就安裝gcc7:

$ yay gcc7
8 aur/armeb-none-eabi-gcc75-linaro-bin 7.5_2019.12-1 (+0 0.00) 
    The GNU Compiler Collection - cross compiler for ARM EABI (bare-metal) big-endian target.
7 aur/arm-none-eabi-gcc73-linaro 7.3_2018.05-1 (+0 0.00) (過時的: 2021-11-02) 
    The GNU Compiler Collection - cross compiler for ARM EABI (bare-metal) target.
6 aur/aarch64-linux-gnu-gcc75-linaro-bin 2019.12-1 (+0 0.00) 
    The GNU Compiler Collection - cross compiler for ARM64 target
5 aur/arm-linux-gnueabi-gcc75-linaro-bin 7.5.0-1 (+1 0.00) 
    The GNU Compiler Collection - cross compiler for ARM target
4 aur/arm-linux-gnueabihf-gcc75-linaro-bin 7.5-0 (+2 0.57) 
    The GNU Compiler Collection- cross compiler for ARMv7 EABI hard float target. (Linaro)
3 aur/gcc7-libs 7.5.0-4 (+15 0.02) (已安裝)
    Runtime libraries shipped by GCC (7.x.x)
2 aur/gcc7-fortran 7.5.0-4 (+15 0.02) 
    Fortran front-end for GCC (7.x.x)
1 aur/gcc7 7.5.0-4 (+15 0.02) (已安裝)
    The GNU Compiler Collection - C and C++ frontends (7.x.x)
==> 要安裝的包 (示例: 1 2 3, 1-3 或 ^4)
==> 
           

如上,選擇第一個就行了,因為我已經安裝過了,是以顯示已安裝。

安裝好了以後,需要把預設的gcc改成7版本的。

##1. 檢視目前預設的gcc在哪裡
which gcc
/usr/bin/gcc

which g++ 
/usr/bin/g++

##2. 備份原來的12.2.0版本,編譯完jdk後還原,防止系統其他軟體出現問題
cd /usr/bin
sudo cp gcc gcc.bak
sudo cp g++ g++.bak

## 3. 把gcc7設為預設
sudo cp gcc-7 gcc
sudo cp g++-7 g++
           

設定預設gcc後,重新執行

bash configure

,然後

make clean

,然後再

make images

就成功了,編譯好的jdk預設在./build/linux-x86_64-normal-server-release/images/jdk