Files
ports/java/openjdk8/Makefile
Dimitry Andric 3822416493 java/openjdk*: work around UB in markOopDesc, fix builds with clang 13
During an exp-run for llvm 13 (see bug 258209), it turned out that
java/openjdk11 through openjdk13 fail to build with clang 13:

=== Output from failing command(s) repeated here ===
* For target jdk__packages_attribute.done:

These crashes are all caused by the markOop/markOopDesc classes, which
are used to keep track of objects, and which are 'marked' using the low
few bits. (See
https://github.com/openjdk/jdk13u/blob/master/src/hotspot/share/oops/markOop.hpp
).

After some laborious bisecting, I found out that these crashes start
occuring after the upstream commit https://github.com
/llvm/llvm-project/commit/16d03818412 (Return "[CGCall] Annotate this
argument with alignment").

What happens afterwards, is that clang considers the "this" pointer to
always be aligned to the alignment of the actual object, and then
masking or adding a few low bits is not working as expected.

The reason openjdk14 and higher work fine with clang 13, and don't crash
similarly, is that the OpenJDK people completely redid the
markOop/markOopDesc classes in
ae5615c614
("8229258: Rework markOop and markOopDesc into a simpler mark word value
carrier"). E.g, the markOopDesc class was renamed to markWord, and
*stores* a pointer-like value instead of *being* a pointer-like value.
This is a much safer way of handling things.

However, this upstream commit is *very* large, as are a few of its
follow-ups, which is probably the reason why it has not been backported
to JDKs <= 13. I tried manually backporting it, but got lost in many
nasty patch conflicts and problems.

As a workaround, build openjdk8 through 13 with clang12 from the
devel/llvm12 port, for the time being.

In addition, allow openjdk14 through 17 to be built with clang 13, by
adding -Wno-unused-but-set-parameter to the compilation flags.

PR:		258954
Approved by:	maintainer timeout (2 weeks)
MFH:		2021Q4
2021-10-16 14:22:03 +02:00

319 lines
11 KiB
Makefile

PORTNAME= openjdk
PORTVERSION= ${JDK_MAJOR_VERSION}.${JDK_UPDATE_VERSION}.${JDK_BUILD_NUMBER}.${BSD_JDK_VERSION}
PORTREVISION= 2
CATEGORIES= java devel
MASTER_SITES= LOCAL/jkim:jtreg
PKGNAMESUFFIX?= ${JDK_MAJOR_VERSION}
MAINTAINER= java@FreeBSD.org
COMMENT?= Java Development Kit ${JDK_MAJOR_VERSION}
LICENSE= GPLv2
ONLY_FOR_ARCHS= aarch64 amd64 armv6 armv7 i386 powerpc powerpc64 powerpc64le
BUILD_DEPENDS= zip:archivers/zip \
autoconf>0:devel/autoconf \
${LOCALBASE}/include/cups/cups.h:print/cups \
bash:shells/bash
LIB_DEPENDS= libfontconfig.so:x11-fonts/fontconfig \
libfreetype.so:print/freetype2 \
libinotify.so:devel/libinotify
RUN_DEPENDS= javavm:java/javavmwrapper \
dejavu>0:x11-fonts/dejavu
USES= compiler:features cpe gmake iconv pkgconfig
CPE_VENDOR= oracle
USE_GITHUB= yes
GH_ACCOUNT= battleblow
GH_PROJECT= jdk8u
GH_TAGNAME= jdk${JDK_MAJOR_VERSION}u${JDK_UPDATE_VERSION}-b${JDK_BUILD_NUMBER}.${BSD_JDK_VERSION}
_MAKE_JOBS= #
CPPFLAGS+= -I${LOCALBASE}/include
LDFLAGS+= -L${LOCALBASE}/lib
MAKE_ENV= CLASSPATH="" JAVA_HOME="" LD_LIBRARY_PATH=""
MAKE_ENV+= IGNORE_OLD_CONFIG=true
MAKE_ENV+= COMPILER_WARNINGS_FATAL="false"
JDK_BUILDDIR= ${WRKSRC}/build/${JDK_OSARCH}-normal-${JDK_BUILD_JVM}-${JDK_BUILD_TYPE}
.if !defined(BUILD_JRE)
JDK_IMAGEDIR= ${JDK_BUILDDIR}/images/j2sdk-image
JRE_IMAGEDIR= ${JDK_BUILDDIR}/images/j2sdk-image/jre
.else
JRE_IMAGEDIR= ${JDK_BUILDDIR}/images/j2re-image
.endif
JDK_JVMDIR= lib/${ARCH:C/armv.*/arm/:S/powerpc64/ppc64/}
JDK_OSARCH= bsd-${ARCH:S/amd64/x86_64/:C/armv.*/arm/:S/i386/x86/:S/powerpc64/ppc64/}
INSTALLDIR= ${PREFIX}/${PKGBASE}
NOPRECIOUSMAKEVARS= yes
JDK_MAJOR_VERSION= 8
JDK_UPDATE_VERSION= 302
JDK_BUILD_NUMBER= 08
BSD_JDK_VERSION= 1
JTREG_VERSION= 4.1
JTREG_BUILD_NUMBER= b08
JDK_BUG_URL= https://bugs.freebsd.org/bugzilla/enter_bug.cgi?product=Ports%20%26%20Packages&component=Individual%20Port(s)&short_desc=java/${PORTNAME}${JDK_MAJOR_VERSION}%3A%20
GNU_CONFIGURE= yes
CONFIGURE_ARGS= --with-boot-jdk=${BOOTSTRAPJDKDIR}
CONFIGURE_ARGS+= --with-build-number="b${JDK_BUILD_NUMBER}"
.if ${JDK_UPDATE_VERSION} > 0
CONFIGURE_ARGS+= --with-update-version=${JDK_UPDATE_VERSION}
.endif
CONFIGURE_ARGS+= --with-vendor-name="OpenJDK BSD Porting Team" \
--with-vendor-url="https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/" \
--with-vendor-bug-url="${JDK_BUG_URL}" \
--with-vendor-vm-bug-url="${JDK_BUG_URL}"
.if defined(NO_CCACHE)
CONFIGURE_ARGS+= --disable-ccache
.endif
CONFIGURE_ARGS+= --disable-freetype-bundling \
--disable-zip-debug-info \
--with-cacerts-file=${FILESDIR}/cacerts \
--with-cups=${LOCALBASE} \
--with-debug-level=${JDK_BUILD_TYPE} \
--with-freetype=${LOCALBASE} \
--with-freetype-include=${LOCALBASE}/include/freetype2 \
--with-jobs=${MAKE_JOBS_NUMBER} \
--with-jvm-variants=${JDK_BUILD_JVM} \
--with-milestone=fcs \
--with-package-path=${LOCALBASE} \
--with-zlib=system
CONFIGURE_SCRIPT= ../../configure
CONFIGURE_WRKSRC= ${WRKSRC}/common/autoconf
OPTIONS_DEFINE= ALSA POLICY TZUPDATE X11 FONTCONFIG
OPTIONS_DEFINE_armv6= FPUHACK
OPTIONS_DEFINE_armv7= FPUHACK
OPTIONS_DEFAULT= ALSA POLICY TZUPDATE X11
OPTIONS_DEFAULT_armv6= FPUHACK
OPTIONS_DEFAULT_armv7= FPUHACK
FPUHACK_DESC= Hack denormalized numbers in flush-to-zero mode
POLICY_DESC= Install the Unlimited Strength Policy Files
TZUPDATE_DESC= Update the time zone data
ALSA_CONFIGURE_ENV_OFF= ALSA_NOT_NEEDED=yes
ALSA_CONFIGURE_ON= --with-alsa=${LOCALBASE}
ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib
FPUHACK_EXTRA_PATCHES= ${PATCHDIR}/fpuhack.patch
POLICY_CONFIGURE_ENABLE= unlimited-crypto
TZUPDATE_RUN_DEPENDS= java-zoneinfo>0:java/java-zoneinfo
X11_BUILD_DEPENDS_OFF= ${LOCALBASE}/include/X11/Xlib.h:x11/libX11 \
${LOCALBASE}/include/X11/extensions/Xdbe.h:x11/libXext \
${LOCALBASE}/include/X11/extensions/Xrender.h:x11/libXrender \
${LOCALBASE}/include/X11/Intrinsic.h:x11-toolkits/libXt
X11_CONFIGURE_OFF= --disable-headful
X11_CONFIGURE_ON= --with-giflib=system \
--x-includes=${LOCALBASE}/include \
--x-libraries=${LOCALBASE}/lib
X11_LIB_DEPENDS= libgif.so:graphics/giflib
X11_MAKE_ENV_OFF= BUILD_HEADLESS_ONLY=1 \
MAKEFLAGS=X_CFLAGS="-I${LOCALBASE}/include"
X11_USES= xorg
X11_USE= XORG=x11,xext,xi,xrender,xt,xtst
FONTCONFIG_EXTRA_PATCHES= ${PATCHDIR}/fontconfig.patch
FONTCONFIG_IMPLIES= X11
JAVAVMS_COMMENT= OpenJDK${JDK_MAJOR_VERSION}
.if !defined(BUILD_JRE)
OPTIONS_DEFINE+= TEST
OPTIONS_DEFAULT+= RELEASE
OPTIONS_SINGLE= BUILD
OPTIONS_SINGLE_BUILD= DEBUG DEBUGFAST RELEASE
BUILD_DESC= Select OpenJDK build type
DEBUG_DESC= Build for debugging (without optimizations)
DEBUGFAST_DESC= Build for debugging (with optimizations)
RELEASE_DESC= Build for release (default)
TEST_DESC= Run regression tests
DEBUG_VARS= JDK_BUILD_TYPE=slowdebug
DEBUGFAST_VARS= JDK_BUILD_TYPE=fastdebug
RELEASE_BUILD_DEPENDS_OFF= ${LOCALBASE}/bin/objcopy:devel/binutils
RELEASE_CONFIGURE_ON= --disable-debug-symbols
RELEASE_VARS= JDK_BUILD_TYPE=release
RELEASE_VARS_OFF= OBJCOPY=${LOCALBASE}/bin/objcopy
TEST_ALL_TARGET= test
TEST_ALL_TARGET_OFF= images
TEST_CONFIGURE_ON= --with-jtreg=${WRKDIR}/jtreg
TEST_DISTFILES= jtreg${JTREG_VERSION}-${JTREG_BUILD_NUMBER}${EXTRACT_SUFX}:jtreg
.else
ALL_TARGET= images
CONFIGURE_ARGS+= --disable-debug-symbols
JAVAVMS_COMMENT+= JRE
JDK_BUILD_TYPE= release
.endif
# XXX configure script rejects CC/CPP/CXX with absolute paths.
.for t in CC CPP CXX
.if defined(${t}) && ${${t}:M/*}
BUILD_${t}= ${${t}:C|.*/||g}
CONFIGURE_ENV+= ${t}="${BUILD_${t}}"
TOOLS_DIR+= ${${t}:S|/${BUILD_${t}}$||}
.endif
.endfor
.if defined(TOOLS_DIR)
CONFIGURE_ARGS+= --with-tools-dir="${TOOLS_DIR:u:S/ /:/g}"
.endif
.include <bsd.port.pre.mk>
BOOTSTRAP_JDKS= ${LOCALBASE}/openjdk8 \
${LOCALBASE}/openjdk7 \
${LOCALBASE}/bootstrap-openjdk8
# do we have valid native jdk installed?
.for BJDK in ${BOOTSTRAP_JDKS}
. if !defined(BOOTSTRAPJDKDIR) && exists(${BJDK}/bin/javac)
BOOTSTRAPJDKDIR= ${BJDK}
. endif
.endfor
# if no valid jdk found, set dependency
.if !defined(BOOTSTRAPJDKDIR)
BOOTSTRAPJDKDIR?= ${LOCALBASE}/bootstrap-openjdk8
BUILD_DEPENDS+= ${BOOTSTRAPJDKDIR}/bin/javac:java/bootstrap-openjdk8
.endif
.if ${ARCH} == armv6 || ${ARCH} == armv7 || ${ARCH} == i386
# XXX We must limit max heap size for 32-bit targets.
CONFIGURE_ARGS+= --with-boot-jdk-jvmargs="-Xmx768m"
MAKE_ENV+= JAVADOC_CMD_MEM="-Xmx768m"
.endif
.if ${ARCH} == i386
CONFIGURE_ARGS+= --disable-jfr
# Fix the build for i386 when WITH_LLD_IS_LD is set
# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225741
MAKE_ENV+= LFLAGS="-Wl,-z,notext"
.endif
.if ${ARCH} == aarch64 || ${ARCH} == amd64 || ${ARCH} == i386 || ${ARCH:Mpowerpc64*}
JDK_BUILD_JVM= server
.else
JDK_BUILD_JVM= zero
LIB_DEPENDS+= libffi.so:devel/libffi
.endif
.if ${COMPILER_TYPE} == clang
MAKE_ENV+= COMPILER_WARNINGS_FATAL=false USE_CLANG=true
CONFIGURE_ENV+= LIBCXX="-lc++"
.if ${COMPILER_VERSION} >= 130
# PR258954: OpenJDK <= 13 crash due to undefined behavior with clang >= 13
# See also https://bugs.openjdk.java.net/browse/JDK-8229258
LLVM_VER= 12
BUILD_DEPENDS+= clang${LLVM_VER}:devel/llvm${LLVM_VER}
CC= ${LOCALBASE}/bin/clang${LLVM_VER}
CXX= ${LOCALBASE}/bin/clang++${LLVM_VER}
.endif
.endif
# GCC is broken with PCH: https://lists.freebsd.org/pipermail/svn-src-all/2015-March/101722.html
.if ${COMPILER_TYPE} == gcc
CONFIGURE_ARGS+= --with-toolchain-type=gcc
.if ${ARCH} == "powerpc64"
MAKE_ARGS+= USE_PRECOMPILED_HEADER=1
.else
MAKE_ARGS+= USE_PRECOMPILED_HEADER=0
.endif
.endif
.if defined(PPC_ABI) && ${PPC_ABI} == ELFv2
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-ppc64-elfv2
MAKE_ARGS+= USE_PRECOMPILED_HEADER=0
.endif
.if ${ARCH} == powerpc64
CONFIGURE_ARGS+= --disable-jfr
.endif
.if ${ARCH} == powerpc64le
CONFIGURE_ARGS+= --disable-jfr
MAKE_ARGS+= USE_PRECOMPILED_HEADER=0
.endif
.if empty(ICONV_LIB)
ICONV_CPPFLAGS= -DLIBICONV_PLUG
.else
ICONV_CPPFLAGS= -I${LOCALBASE}/include
ICONV_LDFLAGS= -L${LOCALBASE}/lib ${ICONV_LIB}
.endif
post-extract-TEST-on:
@${LN} -sf ${WRKDIR}/jtreg/linux/bin ${WRKDIR}/jtreg/
post-patch:
@${FIND} ${WRKSRC} -name '*.orig' -delete
@${SED} -e 's|%%LOCALBASE%%|${LOCALBASE}|' \
${FILESDIR}/bsd.fontconfig.properties.in > \
${WRKSRC}/jdk/src/solaris/classes/sun/awt/fontconfigs/bsd.fontconfig.properties
@${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|' \
-e 's|%%OBJCOPY%%|${OBJCOPY}|' \
${WRKSRC}/configure \
${WRKSRC}/common/autoconf/toolchain.m4 \
${WRKSRC}/jdk/make/lib/Awt2dLibraries.gmk \
${WRKSRC}/jdk/make/lib/NioLibraries.gmk \
${WRKSRC}/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java \
${WRKSRC}/jdk/src/share/classes/sun/print/PSPrinterJob.java \
${WRKSRC}/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java
@${REINPLACE_CMD} -e 's|%%ICONV_CPPFLAGS%%|${ICONV_CPPFLAGS}|' \
-e 's|%%ICONV_LDFLAGS%%|${ICONV_LDFLAGS}|' \
${WRKSRC}/jdk/make/lib/Awt2dLibraries.gmk \
${WRKSRC}/jdk/make/lib/CoreLibraries.gmk \
${WRKSRC}/jdk/make/lib/ServiceabilityLibraries.gmk
.if defined(BUILD_JRE)
@${REINPLACE_CMD} -e 's|-f Images.gmk$$|& jre-image|' \
-e 's|-f Images.gmk overlay-images$$|-f Images.gmk jre-overlay-image|' \
${WRKSRC}/jdk/make/BuildJdk.gmk
.endif
@${CHMOD} 755 ${WRKSRC}/configure
post-patch-ALSA-off:
@${REINPLACE_CMD} '/EXTRA_SOUND_JNI_LIBS += jsoundalsa/d' \
${WRKSRC}/jdk/make/lib/SoundLibraries.gmk
post-build:
.if !defined(BUILD_JRE)
@${BOOTSTRAPJDKDIR}/bin/jar cfe \
${JRE_IMAGEDIR}/lib/compilefontconfig.jar \
build.tools.compilefontconfig.CompileFontConfig \
-C ${JDK_BUILDDIR}/jdk/btclasses build/tools/compilefontconfig
@${BOOTSTRAPJDKDIR}/bin/jar cfe \
${JRE_IMAGEDIR}/lib/javazic.jar \
build.tools.tzdb.TzdbZoneRulesCompiler \
-C ${JDK_BUILDDIR}/jdk/btclasses build/tools/tzdb
.endif
post-build-TZUPDATE-on:
@# Update time zones
@${RM} -r ${JRE_IMAGEDIR}/lib/zi
@${LN} -sf ${LOCALBASE}/share/java/zi ${JRE_IMAGEDIR}/lib
do-install:
@${MKDIR} ${STAGEDIR}${INSTALLDIR}
.if !defined(BUILD_JRE)
@cd ${JDK_IMAGEDIR} && ${COPYTREE_SHARE} . ${STAGEDIR}${INSTALLDIR}
@cd ${STAGEDIR}${INSTALLDIR} && \
${FIND} bin jre/bin -type f -exec ${CHMOD} ${BINMODE} {} \; && \
${CHMOD} ${BINMODE} jre/${JDK_JVMDIR}/jexec \
jre/${JDK_JVMDIR}/jspawnhelper ${JDK_JVMDIR}/jexec
@${ECHO_CMD} "@dir ${INSTALLDIR}/jre/lib/applet" >> ${TMPPLIST}
.else
@cd ${JRE_IMAGEDIR} && ${COPYTREE_SHARE} . ${STAGEDIR}${INSTALLDIR}
@cd ${STAGEDIR}${INSTALLDIR} && \
${FIND} bin -type f -exec ${CHMOD} ${BINMODE} {} \; && \
${CHMOD} ${BINMODE} ${JDK_JVMDIR}/jexec ${JDK_JVMDIR}/jspawnhelper
@${ECHO_CMD} "@dir ${INSTALLDIR}/lib/applet" >> ${TMPPLIST}
.endif
@${ECHO_CMD} "@javavm ${INSTALLDIR}/bin/java" >> ${TMPPLIST}
@${FIND} ${STAGEDIR}${INSTALLDIR} -not -type d | ${SORT} | \
${SED} -e 's|^${STAGEDIR}${PREFIX}/||' >> ${TMPPLIST}
.include <bsd.port.post.mk>