#!/usr/bin/make -f
# -*- makefile -*-
# icedtea_version 2.4.7
include /usr/share/cdbs/1/rules/debhelper.mk

SHELL = /bin/bash
PE_BOOTSTRAP := 0


UPSTREAM_NAME := java
NAME          := pe-$(UPSTREAM_NAME)
JAVAVER       := 1.8.0
UPDATEVER     := 91
BUILDVER      := b14
VERSION       := $(JAVAVER).$(UPDATEVER).$(BUILDVER)
ORIGIN        := openjdk
FULL_NAME     := java-$(JAVAVER)-$(ORIGIN)


PREFIX     := /opt/puppetlabs/server
BINDIR     := $(PREFIX)/bin
HOMEDIR    := $(PREFIX)/apps/$(UPSTREAM_NAME)
DATADIR    := $(HOMEDIR)/share
LIBDIR     := $(HOMEDIR)/lib
JVMDIR     := $(LIBDIR)/jvm
INCLUDEDIR := $(HOMEDIR)/include
PERSISTDIR := $(PREFIX)/data/$(UPSTREAM_NAME)
CONFDIR    := /etc/puppetlabs/$(UPSTREAM_NAME)
DATADIR    := $(PREFIX)/share
MANDIR     := $(DATADIR)/man


ARCH         := $(shell dpkg-architecture -qDEB_BUILD_ARCH)
BUILD_CPU    := $(shell dpkg-architecture -qDEB_BUILD_ARCH_CPU)
CODENAME     := $(shell lsb_release -c | sed -n 's/^Codename:\s*\(.*\)$$/\1/p')
PE_BOOTSTRAP := 0

# Convert an absolute path to a relative path.  Each symbolic link is
# specified relative to the directory in which it is installed so that
# it will resolve properly within chrooted installations.
PERL           := $(shell which perl)
ABS_SCRIPT     := 'use File::Spec; print File::Spec->abs2rel($$ARGV[0], $$ARGV[1])'
ABS2REL        := $(PERL) -e $(ABS_SCRIPT)
SDKDIR         := $(UPSTREAM_NAME)
JVMJARDIR      := $(LIBDIR)/jvm-exports/$(UPSTREAM_NAME)

OUR_JVMDIR     := /usr/lib/jvm/java-7-openjdk-amd64
ifeq ($(CODENAME),xenial)
	OUR_JVMDIR     := /usr/lib/jvm/java-8-openjdk-amd64
endif
ifeq ($(PE_BOOTSTRAP),1)
  OUR_JVMDIR   := /opt/puppet/lib/jvm/pe-java
endif

JREDIR         := $(SDKDIR)/jre
JVMPRIVDIR     := $(HOMEDIR)/lib/jvm-private
JAVADOCDIR     := $(DATADIR)/javadoc
BUILDOUTPUTDIR := $(CURDIR)/openjdk/build/jdk8.build


SOURCEDIR    := $(CURDIR)
SOURCE0      := $(SOURCEDIR)/jdk8u-jdk8u$(UPDATEVER)-$(BUILDVER).tar.gz
# nss configuration file
SOURCE1      := $(SOURCEDIR)/nss.cfg
# Ensure we aren't using the limited crypto policy
SOURCE2      := $(SOURCEDIR)/TestCryptoLevel.java

PATCHDIR     := $(CURDIR)
# Debian multi-arch
PATCH0       := $(PATCHDIR)/Patch-for-debian-multiarch-support.patch
# RHBZ 808293
PATCH2       := $(PATCHDIR)/PStack-808293.patch
# Allow multiple initialization of PKCS11 libraries
PATCH3       := $(PATCHDIR)/multiple-pkcs11-library-init.patch
# Disable doclint for compatibility
PATCH4       := $(PATCHDIR)/disable-doclint-by-default.patch

prep:
	patch -l -p1 < $(PATCH0)
	patch -l -p0 < $(PATCH2)
	patch -l -p0 < $(PATCH3)
	patch -l -p0 < $(PATCH4)

build: prep
	# How many cpu's do we have?
	export NUM_PROC=`/usr/bin/getconf _NPROCESSORS_ONLN 2> /dev/null || :`
	export NUM_PROC=$${NUM_PROC:-1}
	export CFLAGS=$$(echo $$CFLAGS | sed 's/-Wall//g')
	#see https://bugzilla.redhat.com/show_bug.cgi?id=1120792
	if [ "$$CODENAME" = "trusty" -o "$$CODENAME" = "xenial" ] ; then \
		export EXTRA_CFLAGS="-fstack-protector-strong -fno-devirtualize" ; \
		export EXTRA_CPP_FLAGS="-fno-devirtualize" ; \
	else \
		export EXTRA_CFLAGS="" ; \
		export EXTRA_CPP_FLAGS="" ; \
	fi ; \
	mkdir -p $(BUILDOUTPUTDIR) ; \
	pushd $(BUILDOUTPUTDIR) ; \
		bash ../../configure \
			--disable-zip-debug-info \
			--disable-debug-symbols \
			--with-milestone="fcs" \
			--with-update-version=$(UPDATEVER) \
			--with-build-number=$(BUILDVER) \
			--with-boot-jdk=$(OUR_JVMDIR) \
			--with-debug-level=release \
			--enable-unlimited-crypto \
			--with-zlib=bundled \
			--with-giflib=bundled \
			--with-stdc++lib=dynamic \
			--with-extra-cxxflags="$$EXTRA_CPP_FLAGS" \
			--with-extra-cflags="$$EXTRA_CFLAGS" \
			--with-num-cores="$$NUM_PROC" \
			--with-jvm-variants=server; \
		make \
			DEBUG_BINARIES=true \
			STRIP_POLICY=no_strip \
			POST_STRIP_CMD="" \
			LOG=trace \
			all ; \
	popd
	# the build (erroneously) removes read permissions from some jars
	# this is a regression in OpenJDK 7 (our compiler):
	# http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=1437
	find $(BUILDOUTPUTDIR)/images/j2sdk-image -iname '*.jar' -exec chmod ugo+r {} \;
	chmod ugo+r $(BUILDOUTPUTDIR)/images/j2sdk-image/lib/ct.sym
	# remove redundant *diz and *debuginfo files
	find $(BUILDOUTPUTDIR)/images/j2sdk-image -iname '*.diz' -exec rm {} \;
	find $(BUILDOUTPUTDIR)/images/j2sdk-image -iname '*.debuginfo' -exec rm {} \;
	export JAVA_HOME=$(BUILDOUTPUTDIR)/images/j2sdk-image ; \
	install -m 644 $(SOURCE1) $(JAVA_HOME)/jre/lib/security/ ; \
	echo "sun.zoneinfo.dir=/usr/share/javazi" >> "$$JAVA_HOME"/jre/lib/tz.properties ; \
	# Check unlimited policy has been used \
	$$JAVA_HOME/bin/javac -d . $(SOURCE2) ; \
	$$JAVA_HOME/bin/java TestCryptoLevel ; \
	# Check debug symbols are present and can identify code
	SERVER_JVM="$$JAVA_HOME/jre/lib/$(ARCH)/server/libjvm.so" ; \
	if [ -f "$$SERVER_JVM" ] ; then \
		nm -aCl "$$SERVER_JVM" | grep javaCalls.cpp ; \
	fi ; \
	CLIENT_JVM="$$JAVA_HOME/jre/lib/$(ARCH)/client/libjvm.so" ; \
	if [ -f "$$CLIENT_JVM" ] ; then \
		nm -aCl "$$CLIENT_JVM" | grep javaCalls.cpp ; \
	fi ; \
	ZERO_JVM="$$JAVA_HOME/jre/lib/$(ARCH)/zero/libjvm.so" ; \
	if [ -f "$$ZERO_JVM" ] ; then \
		nm -aCl "$$ZERO_JVM" | grep javaCalls.cpp ; \
	fi

binary-install/pe-java::
	mkdir -p $(CURDIR)/debian/$(cdbs_curpkg)/
	export STRIP_KEEP_SYMTAB=libjvm*
	# Create directory structure
	install -d -m 755 $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(SDKDIR)
	install -d -m 755 $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)
	install -d -m 755 $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/lib/$(ARCH)/server
	install -d -m 755 $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/lib/$(ARCH)/client
	touch $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/lib/$(ARCH)/server/classes.jsa
	touch $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/lib/$(ARCH)/client/classes.jsa
	install -d -m 755 $(CURDIR)/debian/$(cdbs_curpkg)/$(BINDIR)
	# Install contents
	pushd $(BUILDOUTPUTDIR)/images/j2sdk-image ; \
		cp -a bin include lib src.zip $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(SDKDIR) ; \
		cp -a jre/bin jre/lib $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR) ; \
	popd
	ln -s $(HOMEDIR)/lib/jvm/$(JREDIR)/bin/java $(CURDIR)/debian/$(cdbs_curpkg)$(BINDIR)/java ; \
	ln -s $(HOMEDIR)/lib/jvm/$(JREDIR)/bin/keytool $(CURDIR)/debian/$(cdbs_curpkg)$(BINDIR)/keytool ; \
	install -d -m 755 $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMJARDIR)
	pushd $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMJARDIR) ; \
		RELATIVE=$$($(ABS2REL) $(JVMDIR)/$(JREDIR)/lib $(JVMJARDIR)) ; \
		ln -sf $$RELATIVE/jsse.jar jsse-$(VERSION).jar ; \
		ln -sf $$RELATIVE/jce.jar jce-$(VERSION).jar ; \
		ln -sf $$RELATIVE/rt.jar jndi-$(VERSION).jar ; \
		ln -sf $$RELATIVE/rt.jar jndi-ldap-$(VERSION).jar ; \
		ln -sf $$RELATIVE/rt.jar jndi-cos-$(VERSION).jar ; \
		ln -sf $$RELATIVE/rt.jar jndi-rmi-$(VERSION).jar ; \
		ln -sf $$RELATIVE/rt.jar jaas-$(VERSION).jar ; \
		ln -sf $$RELATIVE/rt.jar jdbc-stdext-$(VERSION).jar ; \
		ln -sf jdbc-stdext-$(VERSION).jar jdbc-stdext-3.0.jar ; \
		ln -sf $$RELATIVE/rt.jar sasl-$(VERSION).jar ; \
		for jar in *-$(VERSION).jar ; do \
			if [ x$(VERSION) != x$(JAVAVER) ] ; then \
				ln -sf $$jar $$(echo $$jar | sed "s|-$(VERSION).jar|-$(JAVAVER).jar|g") ; \
			fi ; \
			ln -sf $$jar $$(echo $$jar | sed "s|-$(VERSION).jar|.jar|g") ; \
		done ; \
	popd
	install -d -m 755 $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMPRIVDIR)/$(SHORT_NAME)/jce/vanilla
	rm -rf man/*
	# Install nss.cfg
	install -m 644 $(SOURCE1) $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/lib/security/
	# Install Javadoc documentation.
	#install -d -m 755 $(CURDIR)/debian/$(cdbs_curpkg)/$(JAVADOCDIR)
	#cp -a $(BUILDOUTPUTDIR)/docs $(CURDIR)/debian/$(cdbs_curpkg)/$(JAVADOCDIR)/$(SHORT_NAME)
	# Remove src.zip to make the package smaller
	rm $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(SDKDIR)/src.zip
	# Remove "headful" libs to clean up dependencies
	rm -f $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/lib/**/{libjsoundalsa,libsplashscreen,libpulse-java,libawt_xawt,libjawt}.so
	# Remove policytool, and appletviewer to loose libX dependencies
	rm $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(SDKDIR)/bin/policytool
	rm $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(SDKDIR)/bin/appletviewer
	rm $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/bin/policytool
	# Add our keystore provided by puppet-agent
	rm -f $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/lib/security/cacerts ;\
	ln -sf /opt/puppetlabs/puppet/ssl/puppet-cacerts $(CURDIR)/debian/$(cdbs_curpkg)/$(JVMDIR)/$(JREDIR)/lib/security/cacerts

.PHONY: build clean binary-indep binary-arch binary install
