blob: 19304fd6cc9a60961af150ac63f5c389e9782eec [file] [log] [blame]
#!/bin/bash
#
# Builds JDK17, optionally creating distribution artifacts for it.
# Usage:
# build_openjdk17-linux.sh [-q] [-d <dist_dir>] build_dir
# The JDK is built in <build_dir>.
# With -d, creates the following artifacts in <dist_dir>:
# jdk.zip archive of the JDK distribution
# jdk-debuginfo.zip .debuginfo files for JDK's shared libraries
# configure.log
# build.log
# Specify -q to suppress most of the output noise
set -eu
declare -r prog="${0##*/}"
function usage() {
cat <<EOF
Usage:
$prog [-q] [-d <dist_dir>] <build_dir>
JDK is built in <build_dir>.
With -d, creates the artifacts in <dist_dir>.
With -q, runs with minimum noise.
EOF
exit 1
}
# Creates the directory if it does not exist and returns its absolute path
function make_target_dir() {
mkdir -p "$1" && realpath "$1"
}
while getopts 'qd:' opt; do
case $opt in
d) dist_dir=$(make_target_dir $OPTARG) ;;
q) quiet=t ;;
*) usage ;;
esac
done
shift $(($OPTIND-1))
(($#==1)) || usage
declare -r out_path=$(make_target_dir "$1")
declare -r sysroot="$out_path/sysroot"
declare -r build_dir="$out_path/build"
declare -r top=$(realpath "$(dirname "$0")/../../..")
declare -r clang_bin="$top/prebuilts/clang/host/linux-x86/clang-r416183b/bin"
# "Installs" given Debian packages into specified directory.
function unpack_dependencies() {
local -r target_dir="$1"
local -r ar="$clang_bin/llvm-ar"
shift
mkdir -p "$target_dir"
for deb in "$@"; do
# Debian package is actually 'ar' archive. The package files are in data.tar.<type>
# member. Extract and untar it.
case $("$ar" -t "$deb" | grep data.tar) in
data.tar.xz)
"$ar" -p "$deb" data.tar.xz | (cd "$target_dir" && tar -Jx) ;;
data.tar.bz2)
"$ar" -p "$deb" data.tar.bz2 | (cd "$target_dir" && tar -jx) ;;
data.tar.gz)
"$ar" -p "$deb" data.tar.gz | (cd "$target_dir" && tar -zx) ;;
*)
printf "%s does not contain expected archive\n" "$deb"
exit 1
;;
esac
[[ -n "${quiet:-}" ]] || printf "Unpacked %s\n" "$deb"
done
# Rewrite absolute symlinks that point outside the sysroot to relative
# symlinks to the corresponding files in the sysroot.
for link in $(find "${target_dir}" -type l -lname '/*'); do
target=$(readlink ${link})
relative_target_dir=$(python -c 'import os.path, sys; print(os.path.relpath(*sys.argv[1:]))' ${target_dir} $(dirname ${link}))
relative_target=${relative_target_dir}/${target}
ln -sfn ${relative_target} ${link}
done
}
# Prepare
unpack_dependencies "$sysroot" $top/toolchain/jdk/deps/*.deb
function dist_logs() {
[[ -n "${dist_dir:-}" && -e "${build_dir}/build.log" ]] && cp "${build_dir}/build.log" "${dist_dir}/"
[[ -n "${dist_dir:-}" && -e "${build_dir}/configure-support/config.log" ]] && cp "${build_dir}/configure-support/config.log" "${dist_dir}/"
}
trap dist_logs EXIT
# Configure
mkdir -p "$build_dir"
[[ -n "${quiet:-}" ]] || set -x
(cd "$build_dir" &&
bash +x "$top/toolchain/jdk/jdk17/configure" \
"${quiet:+--quiet}" \
--disable-full-docs \
--disable-warnings-as-errors \
--with-alsa-include="$sysroot/usr/include" \
--with-alsa-lib="$sysroot/usr/lib/x86_64-linux-gnu" \
--with-boot-jdk="$top/prebuilts/jdk/jdk17/linux-x86" \
--with-cups-include="$sysroot/usr/include" \
--with-sysroot="$sysroot"\
--with-freetype=system \
--with-freetype-lib="$sysroot/usr/lib/x86_64-linux-gnu" \
--with-freetype-include="$sysroot/usr/include/freetype2" \
--with-libpng=bundled \
--with-native-debug-symbols=external \
--with-stdc++lib=static \
--with-toolchain-type=clang \
--with-tools-dir="$clang_bin" \
--with-version-pre= \
--with-version-opt=${BUILD_NUMBER:-0} \
--with-vendor-version-string=Android_PDK \
--with-zlib=bundled \
--x-libraries="$sysroot/usr/lib/x86_64-linux-gnu" \
--x-includes="$sysroot/usr/include" \
--with-extra-cflags="--sysroot=$sysroot -fno-delete-null-pointer-checks" \
--with-extra-cxxflags="--sysroot=$sysroot -fno-delete-null-pointer-checks" \
--with-extra-ldflags="--sysroot=$sysroot -fuse-ld=lld" \
AR=llvm-ar NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump STRIP=llvm-strip
)
# Make
declare -r make_log_level=${quiet:+warn}
make -C "$build_dir" LOG=${make_log_level:-debug} ${quiet:+-s} images
[[ -n "${dist_dir:-}" ]] || exit 0
# Dist
rm -rf "$dist_dir"/{jdk.zip,jdk-debuginfo.zip,build.log,configure.log}
(cd "$build_dir/images/jdk" &&
zip -9rDy${quiet:+q} "$dist_dir"/jdk.zip . -x 'demo/*' -x'man/*' -x'*.debuginfo' &&
zip -9rDy${quiet:+q} "$dist_dir"/jdk-debuginfo.zip . -i'*.debuginfo'
)