Skip to content

Commit

Permalink
dev-java/openjdk: New package to provide Java 11 from source
Browse files Browse the repository at this point in the history
I'm not sure if this will build on hardened. There used to be an
upstream mechanism to handle PaX markings but this disappeared in an
earlier version. It might build with USE=-jbootstrap though. Please
let us know.

Thanks to Alex Dubov for the initial ebuild attempt.

Closes: gentoo#9835
Signed-off-by: James Le Cuirot <[email protected]>
Package-Manager: Portage-2.3.51, Repoman-2.3.11
  • Loading branch information
chewi committed Nov 8, 2018
1 parent 6a26918 commit 369063c
Show file tree
Hide file tree
Showing 4 changed files with 267 additions and 0 deletions.
1 change: 1 addition & 0 deletions dev-java/openjdk/Manifest
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DIST jdk-11.0.1+13.tar.bz2 90134818 BLAKE2B c79f32dc5b531a06317afb87ef15495267e914b9b292a1d434514a90298d8234e7e0ba92659416b15d9392c7513d976a0c81411953cb6706a27ee57c965e36fb SHA512 c534c2fa8dcd4fdebef6f00473d5ceaae4a33bd1e1a417846508e25f154b1ded649a73468c8c71ac0c1e27bab5f641a3b480a264b532a0c30be2869c3d11a15d
16 changes: 16 additions & 0 deletions dev-java/openjdk/files/openjdk-11.env.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Copyright 1999-2018 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

VERSION="OpenJDK ${PV}"
JAVA_HOME="${EPREFIX}/usr/$(get_libdir)/${PN}-${SLOT}"
JDK_HOME="${EPREFIX}/usr/$(get_libdir)/${PN}-${SLOT}"
JAVAC="\${JAVA_HOME}/bin/javac"
PATH="\${JAVA_HOME}/bin"
ROOTPATH="\${JAVA_HOME}/bin"
LDPATH="\${JAVA_HOME}/lib/:\${JAVA_HOME}/lib/server/"
MANPATH=""
PROVIDES_TYPE="JDK JRE"
PROVIDES_VERSION="${SLOT}"
BOOTCLASSPATH=""
GENERATION="2"
ENV_VARS="JAVA_HOME JDK_HOME JAVAC PATH ROOTPATH LDPATH MANPATH"
16 changes: 16 additions & 0 deletions dev-java/openjdk/metadata.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="project">
<email>[email protected]</email>
<name>Java</name>
</maintainer>
<longdescription>Java™ is the world's leading programming language and platform. The code for Java is open source and available at OpenJDK™.</longdescription>
<use>
<flag name="headless-awt">Don't install the X backend for AWT, needed by some GUIs</flag>
<flag name="gentoo-vm">Allow this JDK to be recognised by Gentoo (package manager, eselect, java-config, EXPERIMENTAL!)</flag>
<flag name="jbootstrap">Build OpenJDK twice, the second time using the result of the first</flag>
<flag name="source">Install JVM sources</flag>
<flag name="webstart">Provide javaws command through symlink to icedtea-web</flag>
</use>
</pkgmetadata>
234 changes: 234 additions & 0 deletions dev-java/openjdk/openjdk-11.0.1_p13.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
# Copyright 1999-2018 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=6

inherit autotools check-reqs flag-o-matic java-pkg-2 java-vm-2 multiprocessing pax-utils toolchain-funcs

MY_PV=${PV/_p/+}
SLOT=${MY_PV%%[.+]*}

DESCRIPTION="Open source implementation of the Java programming language"
HOMEPAGE="https://openjdk.java.net"
SRC_URI="https://hg.${PN}.java.net/jdk-updates/jdk${SLOT}u/archive/jdk-${MY_PV}.tar.bz2"
LICENSE="GPL-2"
KEYWORDS="~amd64 ~arm64 ~ppc64"

# Default variant must be first!
# The rest do not matter.
JVM_VARIANTS="
server
client
core
minimal
zero
"

IUSE=+$(printf "jvm_variant_%s " ${JVM_VARIANTS})
IUSE+="alsa debug doc examples gentoo-vm headless-awt +jbootstrap nsplugin +pch selinux source +webstart"

REQUIRED_USE="
^^ (
|| ( jvm_variant_server jvm_variant_client jvm_variant_minimal )
jvm_variant_core
jvm_variant_zero
)
"

CDEPEND="
media-libs/freetype:2=
net-print/cups
sys-libs/zlib
!headless-awt? (
x11-libs/libX11
x11-libs/libXext
x11-libs/libXi
x11-libs/libXrender
x11-libs/libXt
x11-libs/libXtst
)
"

RDEPEND="
${CDEPEND}
alsa? ( media-libs/alsa-lib )
selinux? ( sec-policy/selinux-java )
"

DEPEND="
${CDEPEND}
app-arch/zip
media-libs/alsa-lib
!headless-awt? (
x11-base/xorg-proto
)
|| (
dev-java/openjdk-bin:${SLOT}
dev-java/openjdk:${SLOT}
)
"

PDEPEND="webstart? ( >=dev-java/icedtea-web-1.6.1:0 )
nsplugin? ( >=dev-java/icedtea-web-1.6.1:0[nsplugin] )"

S="${WORKDIR}/jdk${SLOT}u-jdk-${MY_PV}"

# The space required to build varies wildly depending on USE flags,
# ranging from 2GB to 24GB. This function is certainly not exact but
# should be close enough to be useful.
openjdk_check_requirements() {
local M variant count=0

for variant in ${JVM_VARIANTS}; do
use jvm_variant_${variant} &&
count=$(( $count + 1 ))
done

M=$(usex debug 2600 875)
M=$(( $(usex debug 2900 375) * $count + $M ))
M=$(( $(usex jbootstrap 2 1) * $M ))
M=$(( $(usex doc 300 0) + $(usex source 120 0) + 820 + $M ))

CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE}
}

pkg_pretend() {
openjdk_check_requirements
}

pkg_setup() {
openjdk_check_requirements
java-vm-2_pkg_setup

JAVA_PKG_WANT_BUILD_VM="openjdk-${SLOT} openjdk-bin-${SLOT}"
JAVA_PKG_WANT_SOURCE="${SLOT}"
JAVA_PKG_WANT_TARGET="${SLOT}"

# The nastiness below is necessary while the gentoo-vm USE flag is
# masked. First we call java-pkg-2_pkg_setup if it looks like the
# flag was unmasked against one of the possible build VMs. If not,
# we try finding one of them in their expected locations. This would
# have been slightly less messy if openjdk-bin had been installed to
# /opt/${PN}-${SLOT} or if there was a mechanism to install a VM env
# file but disable it so that it would not normally be selectable.

local vm
for vm in ${JAVA_PKG_WANT_BUILD_VM}; do
if [[ -d ${EPREFIX}/usr/$(get_libdir)/jvm/${vm} ]]; then
java-pkg-2_pkg_setup
return
fi
done

if has_version --host-root dev-java/openjdk:${SLOT}; then
export JDK_HOME=${EPREFIX}/usr/$(get_libdir)/openjdk-${SLOT}
else
JDK_HOME=$(best_version --host-root dev-java/openjdk-bin:${SLOT})
[[ -n ${JDK_HOME} ]] || die "Build VM not found!"
JDK_HOME=${JDK_HOME#*/}
JDK_HOME=${EPREFIX}/opt/${JDK_HOME%-r*}
export JDK_HOME
fi
}

src_configure() {
# Work around stack alignment issue, bug #647954.
use x86 && append-flags -mincoming-stack-boundary=2

chmod +x configure || die

local variant build_variants
for variant in ${JVM_VARIANTS}; do
use jvm_variant_${variant} &&
build_variants+=${variant},
done

local myconf=()

# PaX breaks pch, bug #601016
if use pch && ! host-is-pax; then
myconf+=( --enable-precompiled-headers )
else
myconf+=( --disable-precompiled-headers )
fi

# Enabling full docs appears to break doc building. If not
# explicitly disabled, the flag will get auto-enabled if pandoc and
# graphviz are detected. pandoc has loads of dependencies anyway.

(
unset JAVA JAVAC XARGS
CFLAGS= CXXFLAGS= LDFLAGS= \
CONFIG_SITE=/dev/null \
econf \
--with-boot-jdk="${JDK_HOME}" \
--with-extra-cflags="${CFLAGS}" \
--with-extra-cxxflags="${CXXFLAGS}" \
--with-extra-ldflags="${LDFLAGS}" \
--with-jvm-variants=${build_variants%,} \
--with-native-debug-symbols=$(usex debug internal none) \
--with-version-pre=gentoo \
--with-version-string=${MY_PV%+*} \
--with-version-build=${MY_PV#*+} \
--enable-headless-only=$(usex headless-awt yes no) \
--enable-full-docs=no \
--disable-ccache \
"${myconf[@]}"
)
}

src_compile() {
emake -j1 \
$(usex jbootstrap bootcycle-images product-images) $(usex doc docs '') \
JOBS=$(makeopts_jobs) LOG=debug CFLAGS_WARNINGS_ARE_ERRORS= # No -Werror
}

src_install() {
local dest="/usr/$(get_libdir)/${PN}-${SLOT}"
local ddest="${ED}${dest#/}"

cd "${S}"/build/*-release/images/jdk || die

# Oracle and IcedTea have libjsoundalsa.so depending on
# libasound.so.2 but OpenJDK only has libjsound.so. Weird.
if ! use alsa ; then
rm -v lib/libjsound.* || die
fi

if ! use examples ; then
rm -vr demo/ || die
fi

if ! use source ; then
rm -v lib/src.zip || die
fi

dodir "${dest}"
cp -pPR * "${ddest}" || die

use gentoo-vm && java-vm_install-env "${FILESDIR}"/${PN}-${SLOT}.env.sh
java-vm_set-pax-markings "${ddest}"
java-vm_revdep-mask
java-vm_sandbox-predict /dev/random /proc/self/coredump_filter

if use doc ; then
insinto /usr/share/doc/${PF}/html
doins -r "${S}"/build/*-release/images/docs/*
dosym ${PF} /usr/share/doc/${PN}-${SLOT}
fi
}

pkg_postinst() {
java-vm-2_pkg_postinst

if use gentoo-vm ; then
ewarn "WARNING! You have enabled the gentoo-vm USE flag, making this JDK"
ewarn "recognised by the system. This will almost certainly break things."
else
ewarn "The experimental gentoo-vm USE flag has not been enabled so this JDK"
ewarn "will not be recognised by the system. For example, simply calling"
ewarn "\"java\" will launch a different JVM. This is necessary until Gentoo"
ewarn "fully supports Java ${SLOT}. This JDK must therefore be invoked using its"
ewarn "absolute location under ${EPREFIX}/usr/$(get_libdir)/${PN}-${SLOT}."
fi
}

0 comments on commit 369063c

Please sign in to comment.