1PORTNAME=	openjdk
2PORTVERSION=	${JDK_MAJOR_VERSION}.${JDK_UPDATE_VERSION}.${JDK_BUILD_NUMBER}.${BSD_JDK_VERSION}
3CATEGORIES=	java devel
4MASTER_SITES=	FREEBSD_LOCAL/jkim:jtreg
5PKGNAMESUFFIX?=	${JDK_MAJOR_VERSION}
6
7MAINTAINER=	ports@MidnightBSD.org
8COMMENT?=	Java Development Kit ${JDK_MAJOR_VERSION}
9WWW=		https://openjdk.java.net/
10
11LICENSE=	gpl2
12
13BUILD_DEPENDS=	zip:archivers/zip \
14		autoconf>0:devel/autoconf \
15		${LOCALBASE}/include/cups/cups.h:print/cups \
16		bash:shells/bash
17LIB_DEPENDS=	libfontconfig.so:x11-fonts/fontconfig \
18		libfreetype.so:print/freetype2 \
19		libinotify.so:devel/libinotify
20RUN_DEPENDS=	javavm:java/javavmwrapper \
21		dejavu>0:x11-fonts/dejavu
22
23USES=		compiler:features cpe gmake iconv pkgconfig
24
25CPE_VENDOR=	oracle
26
27USE_GITHUB=	yes
28GH_ACCOUNT=	battleblow
29GH_PROJECT=	jdk8u
30GH_TAGNAME=	jdk${JDK_MAJOR_VERSION}u${JDK_UPDATE_VERSION}-b${JDK_BUILD_NUMBER}.${BSD_JDK_VERSION}
31
32_MAKE_JOBS=	#
33CPPFLAGS+=	-I${LOCALBASE}/include
34LDFLAGS+=	-L${LOCALBASE}/lib
35MAKE_ENV=	CLASSPATH="" JAVA_HOME="" LD_LIBRARY_PATH=""
36MAKE_ENV+=	IGNORE_OLD_CONFIG=true
37MAKE_ENV+=	COMPILER_WARNINGS_FATAL="false"
38
39JDK_BUILDDIR=	${WRKSRC}/build/${JDK_OSARCH}-normal-${JDK_BUILD_JVM}-${JDK_BUILD_TYPE}
40.if !defined(BUILD_JRE)
41JDK_IMAGEDIR=	${JDK_BUILDDIR}/images/j2sdk-image
42JRE_IMAGEDIR=	${JDK_BUILDDIR}/images/j2sdk-image/jre
43.else
44JRE_IMAGEDIR=	${JDK_BUILDDIR}/images/j2re-image
45.endif
46JDK_JVMDIR=	lib/${ARCH:C/armv.*/arm/:S/powerpc64/ppc64/}
47JDK_OSARCH=	bsd-${ARCH:S/amd64/x86_64/:C/armv.*/arm/:S/i386/x86/:S/powerpc64/ppc64/}
48INSTALLDIR=	${PREFIX}/${PKGBASE}
49
50NOPRECIOUSMAKEVARS=	yes
51
52JDK_MAJOR_VERSION=	8
53JDK_UPDATE_VERSION=	332
54JDK_BUILD_NUMBER=	09
55BSD_JDK_VERSION=	1
56PORTREVISION=	1
57JTREG_VERSION=		4.1
58JTREG_BUILD_NUMBER=	b08
59
60JDK_BUG_URL=		https://bugreport.midnightbsd.org/
61
62GNU_CONFIGURE=		yes
63CONFIGURE_ARGS=		--with-boot-jdk=${BOOTSTRAPJDKDIR}
64CONFIGURE_ARGS+=	--with-build-number="b${JDK_BUILD_NUMBER}"
65.if ${JDK_UPDATE_VERSION} > 0
66CONFIGURE_ARGS+=	--with-update-version=${JDK_UPDATE_VERSION}
67.endif
68CONFIGURE_ARGS+=	--with-vendor-name="OpenJDK BSD Porting Team" \
69			--with-vendor-url="https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/" \
70			--with-vendor-bug-url="${JDK_BUG_URL}" \
71			--with-vendor-vm-bug-url="${JDK_BUG_URL}"
72.if defined(NO_CCACHE)
73CONFIGURE_ARGS+=	--disable-ccache
74.endif
75CONFIGURE_ARGS+=	--disable-freetype-bundling \
76			--disable-zip-debug-info \
77			--with-cacerts-file=${FILESDIR}/cacerts \
78			--with-cups=${LOCALBASE} \
79			--with-debug-level=${JDK_BUILD_TYPE} \
80			--with-freetype=${LOCALBASE} \
81			--with-freetype-include=${LOCALBASE}/include/freetype2 \
82			--with-jobs=${MAKE_JOBS_NUMBER} \
83			--with-jvm-variants=${JDK_BUILD_JVM} \
84			--with-milestone=fcs \
85			--with-package-path=${LOCALBASE} \
86			--with-zlib=system \
87			--with-extra-cflags="-fno-delete-null-pointer-checks -Wno-register" \
88			--with-extra-cxxflags="-fno-delete-null-pointer-checks -Wno-register" \
89			--with-extra-ldflags="-Wl,--undefined-version"
90CONFIGURE_SCRIPT=	../../configure
91CONFIGURE_WRKSRC=	${WRKSRC}/common/autoconf
92
93OPTIONS_DEFINE=		ALSA POLICY TZUPDATE X11 FONTCONFIG
94OPTIONS_DEFINE_armv6=	FPUHACK
95OPTIONS_DEFINE_armv7=	FPUHACK
96OPTIONS_DEFAULT=	ALSA POLICY TZUPDATE X11 FONTCONFIG
97OPTIONS_DEFAULT_armv6=	FPUHACK
98OPTIONS_DEFAULT_armv7=	FPUHACK
99FPUHACK_DESC=		Hack denormalized numbers in flush-to-zero mode
100POLICY_DESC=		Install the Unlimited Strength Policy Files
101TZUPDATE_DESC=		Update the time zone data
102
103ALSA_CONFIGURE_ENV_OFF=	ALSA_NOT_NEEDED=yes
104ALSA_CONFIGURE_ON=	--with-alsa=${LOCALBASE}
105ALSA_LIB_DEPENDS=	libasound.so:audio/alsa-lib
106FPUHACK_EXTRA_PATCHES=	${PATCHDIR}/fpuhack.patch
107POLICY_CONFIGURE_ENABLE=	unlimited-crypto
108TZUPDATE_RUN_DEPENDS=	java-zoneinfo>0:java/java-zoneinfo
109X11_BUILD_DEPENDS_OFF=	${LOCALBASE}/include/X11/Xlib.h:x11/libX11 \
110			${LOCALBASE}/include/X11/extensions/Xdbe.h:x11/libXext \
111			${LOCALBASE}/include/X11/extensions/Xrender.h:x11/libXrender \
112			${LOCALBASE}/include/X11/Intrinsic.h:x11-toolkits/libXt
113X11_CONFIGURE_OFF=	--disable-headful
114X11_CONFIGURE_ON=	--with-giflib=system \
115			--x-includes=${LOCALBASE}/include \
116			--x-libraries=${LOCALBASE}/lib
117X11_LIB_DEPENDS=	libgif.so:graphics/giflib
118X11_MAKE_ENV_OFF=	BUILD_HEADLESS_ONLY=1 \
119			MAKEFLAGS=X_CFLAGS="-I${LOCALBASE}/include"
120X11_USES=		xorg
121X11_USE=		XORG=x11,xext,xi,xrender,xt,xtst
122FONTCONFIG_EXTRA_PATCHES=	${PATCHDIR}/fontconfig.patch
123FONTCONFIG_IMPLIES=	X11
124
125JAVAVMS_COMMENT=	OpenJDK${JDK_MAJOR_VERSION}
126
127.if !defined(BUILD_JRE)
128OPTIONS_DEFINE+=	TEST
129OPTIONS_DEFAULT+=	RELEASE
130OPTIONS_SINGLE=		BUILD
131OPTIONS_SINGLE_BUILD=	DEBUG DEBUGFAST RELEASE
132BUILD_DESC=		Select OpenJDK build type
133DEBUG_DESC=		Build for debugging (without optimizations)
134DEBUGFAST_DESC=		Build for debugging (with optimizations)
135RELEASE_DESC=		Build for release (default)
136TEST_DESC=		Run regression tests
137
138DEBUG_VARS=		JDK_BUILD_TYPE=slowdebug
139DEBUGFAST_VARS=		JDK_BUILD_TYPE=fastdebug
140RELEASE_BUILD_DEPENDS_OFF=	${LOCALBASE}/bin/objcopy:devel/binutils
141RELEASE_CONFIGURE_ON=	--disable-debug-symbols
142RELEASE_VARS=		JDK_BUILD_TYPE=release
143RELEASE_VARS_OFF=	OBJCOPY=${LOCALBASE}/bin/objcopy
144TEST_ALL_TARGET=	test
145TEST_ALL_TARGET_OFF=	images
146TEST_CONFIGURE_ON=	--with-jtreg=${WRKDIR}/jtreg
147TEST_DISTFILES=		jtreg${JTREG_VERSION}-${JTREG_BUILD_NUMBER}${EXTRACT_SUFX}:jtreg
148.else
149ALL_TARGET=		images
150CONFIGURE_ARGS+=	--disable-debug-symbols
151JAVAVMS_COMMENT+=	JRE
152JDK_BUILD_TYPE=		release
153.endif
154
155# XXX configure script rejects CC/CPP/CXX with absolute paths.
156.for t in CC CPP CXX
157.if defined(${t}) && ${${t}:M/*}
158BUILD_${t}=	${${t}:C|.*/||g}
159CONFIGURE_ENV+=	${t}="${BUILD_${t}}"
160TOOLS_DIR+=	${${t}:S|/${BUILD_${t}}$||}
161.endif
162.endfor
163.if defined(TOOLS_DIR)
164CONFIGURE_ARGS+=	--with-tools-dir="${TOOLS_DIR:u:S/ /:/g}"
165.endif
166
167.include <bsd.port.pre.mk>
168
169BOOTSTRAP_JDKS=	${LOCALBASE}/openjdk8 \
170		${LOCALBASE}/openjdk7 \
171		${LOCALBASE}/bootstrap-openjdk8
172
173# do we have valid native jdk installed?
174.for BJDK in ${BOOTSTRAP_JDKS}
175.  if !defined(BOOTSTRAPJDKDIR) && exists(${BJDK}/bin/javac)
176BOOTSTRAPJDKDIR=	${BJDK}
177.  endif
178.endfor
179
180# if no valid jdk found, set dependency
181.if !defined(BOOTSTRAPJDKDIR) || defined(MAGUS) || defined(INDEXING)
182BOOTSTRAPJDKDIR?=	${LOCALBASE}/bootstrap-openjdk8
183BUILD_DEPENDS+=		${BOOTSTRAPJDKDIR}/bin/javac:java/bootstrap-openjdk8
184.endif
185
186.if ${ARCH} == armv6 || ${ARCH} == armv7 || ${ARCH} == i386
187# XXX We must limit max heap size for 32-bit targets.
188CONFIGURE_ARGS+=	--with-boot-jdk-jvmargs="-Xmx768m"
189MAKE_ENV+=	JAVADOC_CMD_MEM="-Xmx768m"
190.endif
191
192.if ${ARCH} == i386
193CONFIGURE_ARGS+=	--disable-jfr
194# Fix the build for i386 when WITH_LLD_IS_LD is set
195# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225741
196MAKE_ENV+=	LFLAGS="-Wl,-z,notext"
197.endif
198
199.if ${ARCH} == aarch64 || ${ARCH} == amd64 || ${ARCH} == i386 || ${ARCH:Mpowerpc64*}
200JDK_BUILD_JVM=	server
201.else
202JDK_BUILD_JVM=	zero
203LIB_DEPENDS+=	libffi.so:devel/libffi
204.endif
205
206.if ${COMPILER_TYPE} == clang
207MAKE_ENV+=	COMPILER_WARNINGS_FATAL=false USE_CLANG=true
208CONFIGURE_ENV+=	LIBCXX="-lc++"
209.endif
210
211# GCC is broken with PCH: https://lists.freebsd.org/pipermail/svn-src-all/2015-March/101722.html
212.if ${COMPILER_TYPE} == gcc
213CONFIGURE_ARGS+=	--with-toolchain-type=gcc
214.if ${ARCH} == "powerpc64"
215MAKE_ARGS+=	USE_PRECOMPILED_HEADER=1
216.else
217MAKE_ARGS+=	USE_PRECOMPILED_HEADER=0
218.endif
219.endif
220
221.if ${ARCH} == powerpc64le
222MAKE_ARGS+=	USE_PRECOMPILED_HEADER=0
223.endif
224
225.if empty(ICONV_LIB)
226ICONV_CPPFLAGS=	-DLIBICONV_PLUG
227.else
228ICONV_CPPFLAGS=	-I${LOCALBASE}/include
229ICONV_LDFLAGS=	-L${LOCALBASE}/lib ${ICONV_LIB}
230.endif
231
232post-extract-TEST-on:
233	@${LN} -sf ${WRKDIR}/jtreg/linux/bin ${WRKDIR}/jtreg/
234
235post-patch:
236	@${FIND} ${WRKSRC} -name '*.orig' -delete
237	@${SED} -e 's|%%LOCALBASE%%|${LOCALBASE}|' \
238	    ${FILESDIR}/bsd.fontconfig.properties.in > \
239	    ${WRKSRC}/jdk/src/solaris/classes/sun/awt/fontconfigs/bsd.fontconfig.properties
240	@${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|' \
241	    -e 's|%%OBJCOPY%%|${OBJCOPY}|' \
242	    ${WRKSRC}/configure \
243	    ${WRKSRC}/common/autoconf/toolchain.m4 \
244	    ${WRKSRC}/jdk/make/lib/NioLibraries.gmk \
245	    ${WRKSRC}/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java \
246	    ${WRKSRC}/jdk/src/share/classes/sun/print/PSPrinterJob.java \
247	    ${WRKSRC}/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java
248	@${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|' \
249	    -e 's|%%ICONV_CPPFLAGS%%|${ICONV_CPPFLAGS}|' \
250	    -e 's|%%ICONV_LDFLAGS%%|${ICONV_LDFLAGS}|' \
251	    ${WRKSRC}/jdk/make/lib/Awt2dLibraries.gmk
252	@${REINPLACE_CMD} -e 's|%%ICONV_CPPFLAGS%%|${ICONV_CPPFLAGS}|' \
253	    -e 's|%%ICONV_LDFLAGS%%|${ICONV_LDFLAGS}|' \
254	    ${WRKSRC}/jdk/make/lib/CoreLibraries.gmk \
255	    ${WRKSRC}/jdk/make/lib/ServiceabilityLibraries.gmk
256.if defined(BUILD_JRE)
257	@${REINPLACE_CMD} -e 's|-f Images.gmk$$|& jre-image|' \
258	    -e 's|-f Images.gmk overlay-images$$|-f Images.gmk jre-overlay-image|' \
259	    ${WRKSRC}/jdk/make/BuildJdk.gmk
260.endif
261	@${CHMOD} 755 ${WRKSRC}/configure
262
263post-patch-ALSA-off:
264	@${REINPLACE_CMD} '/EXTRA_SOUND_JNI_LIBS += jsoundalsa/d' \
265	    ${WRKSRC}/jdk/make/lib/SoundLibraries.gmk
266
267post-build:
268.if !defined(BUILD_JRE)
269	@${BOOTSTRAPJDKDIR}/bin/jar cfe \
270	    ${JRE_IMAGEDIR}/lib/compilefontconfig.jar \
271	    build.tools.compilefontconfig.CompileFontConfig \
272	    -C ${JDK_BUILDDIR}/jdk/btclasses build/tools/compilefontconfig
273	@${BOOTSTRAPJDKDIR}/bin/jar cfe \
274	    ${JRE_IMAGEDIR}/lib/javazic.jar \
275	    build.tools.tzdb.TzdbZoneRulesCompiler \
276	    -C ${JDK_BUILDDIR}/jdk/btclasses build/tools/tzdb
277.endif
278
279post-build-TZUPDATE-on:
280	@# Update time zones
281	-${RM} -r ${JRE_IMAGEDIR}/lib/zi
282	@${LN} -sf ${LOCALBASE}/share/java/zi ${JRE_IMAGEDIR}/lib
283
284do-install:
285	@${MKDIR} ${INSTALLDIR}
286.if !defined(BUILD_JRE)
287	@cd ${JDK_IMAGEDIR} && ${COPYTREE_SHARE} . ${INSTALLDIR}
288	@cd ${INSTALLDIR} && \
289	${FIND} bin jre/bin -type f -exec ${CHMOD} ${BINMODE} {} \; && \
290	${CHMOD} ${BINMODE} jre/${JDK_JVMDIR}/jexec \
291	    jre/${JDK_JVMDIR}/jspawnhelper ${JDK_JVMDIR}/jexec
292	@${ECHO_CMD} "@dir ${PKGBASE}/jre/lib/applet" >> ${TMPPLIST}
293.else
294	@cd ${JRE_IMAGEDIR} && ${COPYTREE_SHARE} . ${INSTALLDIR}
295	@cd ${INSTALLDIR} && \
296	${FIND} bin -type f -exec ${CHMOD} ${BINMODE} {} \; && \
297	${CHMOD} ${BINMODE} ${JDK_JVMDIR}/jexec ${JDK_JVMDIR}/jspawnhelper
298	@${ECHO_CMD} "@dir ${PKGBASE}/lib/applet" >> ${TMPPLIST}
299.endif
300	@${ECHO_CMD} "@javavm ${PKGBASE}/bin/java" >> ${TMPPLIST}
301	@-${FIND} ${INSTALLDIR} -type f -name '*.so' -exec ${STRIP_CMD} {} +
302	@-${FIND} ${INSTALLDIR} -type f -perm +111 -exec ${STRIP_CMD} {} +
303	@${FIND} ${INSTALLDIR} -not -type d | ${SORT} | \
304	    ${SED} -e 's|^${PREFIX}/||' >> ${TMPPLIST}
305
306.include <bsd.port.post.mk>
307