# 编译openjdk12


最近开始拜读《深入理解Java虚拟机》第三版，希望自己可以对JVM虚拟机能得到一个整体的认识，以及让自己变得更厉害啦😁

我没有读过之前的两版，但感觉第一章就满精彩的，了解了Java的发展历史，也了解到了更多的jvm，很有意思。

在书中，作者建议读者自己尝试编译一下openjdk的源码，所以就有了这篇文章。

## 源码下载

https://hg.openjdk.java.net/ 这个地址中有所有版本的openjdk，我所想要编译的openjdk12在`jdk`这个目录下面，具体地址是https://hg.openjdk.java.net/jdk/jdk12/

可以选择两种方式，第一种使用`hg`这个命令进行下载，类似于`git`。第二种使用浏览器直接下载，点击左侧的`zip`即可开始下载。如果下载速度过慢，或者是已经被墙了，可以尝试修改自己本地的dns地址，或者是使用代理软件。

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188670968/O0kB6Uh65.png)

*这里推荐一下本人自用的v2ray机场吧：[无界](http://www.wujievpn.cc/user/index.html#/register?code=S4i3QPX2)*

## 编译

### 编译环境

我使用的是macOS 10.15.6，我本地默认开发使用的jdk版本是oracle jdk 1.8.0_251。

这个版本是不满足openjdk的构建标准的。按照作者所述，需要依赖于N-1个版本openjdk及以后版本，所以我得先安装openjdk 11才可以。

```shell
brew search openjdk
brew info openjdk@11
brew install openjdk@11
```

`brew search openjdk`检索的时候，可以发现有两个，如果对第一个`brew info`查看，可以得知是最新版本的，当下是openjdk14，不满足N-1，所以我选择安装openjdk@11(从作者的描述来看，我认为使用openjdk14应当也是可以编译openjdk12的，不过我没有实践)

我采用的是书中提到的默认参数

```shell
bash configure --enable-debug --with-jvm-variants=server
```

### 编译遇到的问题

#### 问题1

```shell
configure: error: No xcodebuild tool and no system framework headers found, use --with-sysroot or --with-sdk-name to provide a path to a valid SDK
```

解决方案参考了`https://segmentfault.com/a/1190000020736814`。

我首先尝试运行了一下`xcodebuild`，得到了和[上文](https://segmentfault.com/a/1190000020736814)作者一致的错误，但是我本地是没有安装xcode这个app的，因为我平时不会使用到xcode进行编程，所以我想尝试一下是否可以不安装xcode。

我在stackoverflow上找到了`https://stackoverflow.com/questions/17980759/xcode-select-active-developer-directory-error`这个类似的问题，我有注意到这个回答：

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188672901/Hz1ZEV1LB.png)

我尝试了一下，是不可以的。于是我回到这个回答尝试去看一下这个回答下方的评论。

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188674403/HJzmIAYww.png)

有看到评论说在新版本的macOS上已经无法脱离xcode了，所以最后还是把xcode给安装上了。

```shell
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
```

#### 问题2

```
configure: Found potential Boot JDK using well-known locations (in /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk)
configure: Potential Boot JDK found at /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home is incorrect JDK version (java version "1.8.0_251"); ignoring
configure: (Your Boot JDK version must be one of: 11 12)
configure: Could not find a valid Boot JDK. You might be able to fix this by running 'brew cask install java'.
configure: This might be fixed by explicitly setting --with-boot-jdk
configure: error: Cannot continue
/Users/baofeidyz/workspace/openjdk/jdk12/build/.configure-support/generated-configure.sh: line 82: 5: Bad file descriptor
configure exiting with result code 1
```

按照提示，需要指定`--with-boot-jdk`

```shell
bash configure --enable-debug --with-jvm-variants=server --with-boot-jdk=/usr/local/opt/openjdk@11
```

#### 问题3

```
/Users/baofeidyz/workspace/openjdk/jdk12/test/hotspot/gtest/classfile/test_symbolTable.cpp:62:6: error: explicitly assigning value of variable of type 'TempNewSymbol' to itself [-Werror,-Wself-assign-overloaded]
  s1 = s1; // self assignment
  ~~ ^ ~~
1 error generated.
make[3]: *** [/Users/baofeidyz/workspace/openjdk/jdk12/build/macosx-x86_64-server-fastdebug/hotspot/variant-server/libjvm/gtest/objs/test_symbolTable.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [hotspot-server-libs] Error 2
```

没有c++基础，确实不知道这部分代码是在做什么，所以还是借助于Google尝试解决问题。

不得不说这版本的读者还是很多的，随手一搜就找到了相关的解决方案：https://www.xingmal.com/article/article/1248517712636940288

根据[此文](https://www.xingmal.com/article/article/1248517712636940288)的作者描述，我尝试将这个报错的代码注释掉了。

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188676439/CmMDtsD18.png)

最后记得要先`make clean`再`make images`。

## 写到最后

其实问题3，我是比较好奇的，为什么会报错，虽然我用取巧的方案屏蔽掉了，但是不知道原因，就感觉给自己留了一个坑。不知道openjdk应该如何去提问？
