AlpineLinux-3.16编译openjdk17
若想在alpine-3.16上编译,必须C++版本必须低于11或使用版本低于1.2.3的musl-dev,否则只有通过修改jdk源码(大量)才能编译成功.1
释放community源
su -c 'vi /etc/apk/repositories' 删除community url前面的#
su -c 'apk update'
获取jdk17-dev源码
su -c 'apk add --no-cache git'
git clone https://github.com/openjdk17u-dev.git && cd jdk17u-dev
安装openjdk16作为Boot-jdk
需要community源
su -c 'apk add --no-cache openjdk16'
安装编译需要的软件包
su -c 'apk add --no-cache bash autoconf file make zip \
gcc g++ \
libxtst-dev libxt-dev libxrender-dev libxrandr-dev \
cups-dev fontconfig-dev alsa-lib-dev'
安装musl-dev 1.2.24
su -c 'apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/v3.15/main musl-dev=1.2.2-r7'
设置编译参数
bash configure --with-debug-level=fastdebug
可以先通过
bash configure --help
了解更多参数选项的含义
编译jdk源码
make images
或者
make all
简单测试编译成果
build/linux-x86_64-server-fastdebug/jdk/bin/java -version
或者
build/linux-x86_64-server-fastdebug/images/jdk/bin/java -version
openjdk version "17.0.5-internal" 2022-07-23
OpenJDK Runtime Environment (fastdebug build 17.0.5-internal+0-adhoc.waisam.jdk17u-dev)
OpenJDK 64-Bit Server VM (fastdebug build 17.0.5-internal+0-adhoc.waisam.jdk17u-dev, mixed mode, sharing)
只有jdk目录的java可用于调试, images内的不行
musl更新带来的影响
alpine-3.16 因为自带的标准C库musl更新到1.2.3,在使用C++11或以上版本时, 会将NULL定义为
nullptr
2,类型为:std:nullptr_t
,
而alpine-3.16的默认C++版本为C++143,这将使函数reinterpret_cast<oop*>(NULL)
无法转型,导致编译失败(笔者使用3.15的源重新安装了musl-dev 1.2.2-r7),自己编译GCC则需要数个小时) ↩︎musl-commit:
查看C++版本
gcc -dM -E -x c++ /dev/null | grep -F __cplusplus g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
↩︎C++ Standard __cplusplus C++98 199711L C++11 201103L C++14 201402L C++17 201703L C++20 202002L C++23 TBD 安装musl-dev 1.2.2避免以下类似错误
↩︎