commit: 53e9bfd4ab6a03c036ec7f95e666cd45fc466e63 Author: Benda Xu <heroxbd <AT> gentoo <DOT> org> AuthorDate: Thu Feb 9 04:51:55 2017 +0000 Commit: Benda XU <heroxbd <AT> gentoo <DOT> org> CommitDate: Thu Feb 9 04:51:55 2017 +0000 URL: https://gitweb.gentoo.org/proj/android.git/commit/?id=53e9bfd4
java-utils-2.eclass: merged. eclass/java-utils-2.eclass | 2888 -------------------------------------------- 1 file changed, 2888 deletions(-) diff --git a/eclass/java-utils-2.eclass b/eclass/java-utils-2.eclass deleted file mode 100644 index b4246b3..0000000 --- a/eclass/java-utils-2.eclass +++ /dev/null @@ -1,2888 +0,0 @@ -# Copyright 2004-2015 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Id$ - -# @ECLASS: java-utils-2.eclass -# @MAINTAINER: -# j...@gentoo.org -# @AUTHOR: -# Thomas Matthijs <a...@gentoo.org>, Karl Trygve Kalleberg <kar...@gentoo.org> -# @BLURB: Base eclass for Java packages -# @DESCRIPTION: -# This eclass provides functionality which is used by java-pkg-2.eclass, -# java-pkg-opt-2.eclass and java-ant-2 eclass, as well as from ebuilds. -# -# This eclass should not be inherited this directly from an ebuild. Instead, -# you should inherit java-pkg-2 for Java packages or java-pkg-opt-2 for packages -# that have optional Java support. In addition you can inherit java-ant-2 for -# Ant-based packages. -inherit eutils versionator multilib - -IUSE="elibc_FreeBSD" - -# Make sure we use java-config-2 -export WANT_JAVA_CONFIG="2" - -# @VARIABLE: JAVA_PKG_PORTAGE_DEP -# @INTERNAL -# @DESCRIPTION: -# The version of portage we need to function properly. Previously it was -# portage with phase hooks support but now we use a version with proper env -# saving. For EAPI 2 we have new enough stuff so let's have cleaner deps. -has "${EAPI}" 0 1 && JAVA_PKG_PORTAGE_DEP=">=sys-apps/portage-2.1.2.7" - -# @VARIABLE: JAVA_PKG_E_DEPEND -# @INTERNAL -# @DESCRIPTION: -# This is a convience variable to be used from the other java eclasses. This is -# the version of java-config we want to use. Usually the latest stable version -# so that ebuilds can use new features without depending on specific versions. -JAVA_PKG_E_DEPEND=">=dev-java/java-config-2.2.0-r3 ${JAVA_PKG_PORTAGE_DEP}" -has source ${JAVA_PKG_IUSE} && JAVA_PKG_E_DEPEND="${JAVA_PKG_E_DEPEND} source? ( app-arch/zip )" - -# @ECLASS-VARIABLE: JAVA_PKG_WANT_BOOTCLASSPATH -# @DEFAULT_UNSET -# @DESCRIPTION: -# The version of bootclasspath the package needs to work. Translates to a proper -# dependency. The bootclasspath can then be obtained by java-ant_rewrite-bootclasspath -if [[ -n "${JAVA_PKG_WANT_BOOTCLASSPATH}" ]]; then - if [[ "${JAVA_PKG_WANT_BOOTCLASSPATH}" == "1.5" ]]; then - JAVA_PKG_E_DEPEND="${JAVA_PKG_E_DEPEND} >=dev-java/gnu-classpath-0.98-r1:0.98" - else - eerror "Unknown value of JAVA_PKG_WANT_BOOTCLASSPATH" - # since die in global scope doesn't work, this will make repoman fail - JAVA_PKG_E_DEPEND="${JAVA_PKG_E_DEPEND} BAD_JAVA_PKG_WANT_BOOTCLASSPATH" - fi -fi - -# @ECLASS-VARIABLE: JAVA_PKG_ALLOW_VM_CHANGE -# @DESCRIPTION: -# Allow this eclass to change the active VM? -# If your system VM isn't sufficient for the package, the build will fail -# instead of trying to switch to another VM. -# -# Overriding the default can be useful for testing specific VMs locally, but -# should not be used in the final ebuild. -JAVA_PKG_ALLOW_VM_CHANGE=${JAVA_PKG_ALLOW_VM_CHANGE:="yes"} - -# @ECLASS-VARIABLE: JAVA_PKG_FORCE_VM -# @DEFAULT_UNSET -# @DESCRIPTION: -# Explicitly set a particular VM to use. If its not valid, it'll fall back to -# whatever /etc/java-config-2/build/jdk.conf would elect to use. -# -# Should only be used for testing and debugging. -# -# Example: use sun-jdk-1.5 to emerge foo: -# @CODE -# JAVA_PKG_FORCE_VM=sun-jdk-1.5 emerge foo -# @CODE - -# @ECLASS-VARIABLE: JAVA_PKG_WANT_BUILD_VM -# @DEFAULT_UNSET -# @DESCRIPTION: -# A list of VM handles to choose a build VM from. If the list contains the -# currently active VM use that one, otherwise step through the list till a -# usable/installed VM is found. -# -# This allows to use an explicit list of JDKs in DEPEND instead of a virtual. -# Users of this variable must make sure at least one of the listed handles is -# covered by DEPEND. -# Requires JAVA_PKG_WANT_SOURCE and JAVA_PKG_WANT_TARGET to be set as well. - -# @ECLASS-VARIABLE: JAVA_PKG_WANT_SOURCE -# @DEFAULT_UNSET -# @DESCRIPTION: -# Specify a non-standard Java source version for compilation (via javac -source -# parameter or Ant equivalent via build.xml rewriting done by java-ant-2 eclass). -# Normally this is determined from the jdk version specified in DEPEND. -# See java-pkg_get-source function below. -# -# Should generally only be used for testing and debugging. -# -# Use 1.4 source to emerge baz -# @CODE -# JAVA_PKG_WANT_SOURCE=1.4 emerge baz -# @CODE - -# @ECLASS-VARIABLE: JAVA_PKG_WANT_TARGET -# @DEFAULT_UNSET -# @DESCRIPTION: -# Same as JAVA_PKG_WANT_SOURCE (see above) but for javac -target parameter, -# which affects the version of generated bytecode. -# Normally this is determined from the jre/jdk version specified in RDEPEND. -# See java-pkg_get-target function below. -# -# Should generallyonly be used for testing and debugging. -# -# emerge bar to be compatible with 1.3 -# @CODE -# JAVA_PKG_WANT_TARGET=1.3 emerge bar -# @CODE - -# @ECLASS-VARIABLE: JAVA_PKG_DEBUG -# @DEFAULT_UNSET -# @DESCRIPTION: -# A variable to be set with "yes" or "y", or ANY string of length non equal to -# zero. When set, verbosity across java eclasses is increased and extra -# logging is displayed. -# @CODE -# JAVA_PKG_DEBUG="yes" -# @CODE - -# @ECLASS-VARIABLE: JAVA_RM_FILES -# @DEFAULT_UNSET -# @DESCRIPTION: -# An array containing a list of files to remove. If defined, this array will be -# automatically handed over to java-pkg_rm_files for processing during the -# src_prepare phase. -# -# @CODE -# JAVA_RM_FILES=( -# path/to/File1.java -# DELETEME.txt -# ) -# @CODE - -# @VARIABLE: JAVA_PKG_COMPILER_DIR -# @INTERNAL -# @DESCRIPTION: -# Directory where compiler settings are saved, without trailing slash. -# You probably shouldn't touch this variable except local testing. -JAVA_PKG_COMPILER_DIR=${JAVA_PKG_COMPILER_DIR:="/usr/share/java-config-2/compiler"} - -# @VARIABLE: JAVA_PKG_COMPILERS_CONF -# @INTERNAL -# @DESCRIPTION: -# Path to file containing information about which compiler to use. -# Can be overloaded, but it should be overloaded only for local testing. -JAVA_PKG_COMPILERS_CONF=${JAVA_PKG_COMPILERS_CONF:="/etc/java-config-2/build/compilers.conf"} - -# @ECLASS-VARIABLE: JAVA_PKG_FORCE_COMPILER -# @INTERNAL -# @DEFAULT_UNSET -# @DESCRIPTION: -# Explicitly set a list of compilers to choose from. This is normally read from -# JAVA_PKG_COMPILERS_CONF. -# -# Useful for local testing. -# -# Use jikes and javac, in that order -# @CODE -# JAVA_PKG_FORCE_COMPILER="jikes javac" -# @CODE - -# @ECLASS-VARIABLE: JAVA_PKG_FORCE_ANT_TASKS -# @DEFAULT_UNSET -# @DESCRIPTION: -# An $IFS separated list of ant tasks. Can be set in environment before calling -# emerge/ebuild to override variables set in ebuild, mainly for testing before -# putting the resulting (WANT_)ANT_TASKS into ebuild. Affects only ANT_TASKS in -# eant() call, not the dependencies specified in WANT_ANT_TASKS. -# -# @CODE -# JAVA_PKG_FORCE_ANT_TASKS="ant-junit ant-trax" \ -# ebuild foo.ebuild compile -# @CODE - -# TODO document me -JAVA_PKG_QA_VIOLATIONS=0 - -# @FUNCTION: java-pkg_doexamples -# @USAGE: [--subdir <subdir>] <file1/dir1> [<file2> ...] -# @DESCRIPTION: -# Installs given arguments to /usr/share/doc/${PF}/examples -# If you give it only one parameter and it is a directory it will install -# everything in that directory to the examples directory. -# -# @CODE -# Parameters: -# --subdir - If the examples need a certain directory structure -# $* - list of files to install -# -# Examples: -# java-pkg_doexamples demo -# java-pkg_doexamples demo/* examples/* -# @CODE -java-pkg_doexamples() { - debug-print-function ${FUNCNAME} $* - - [[ ${#} -lt 1 ]] && die "At least one argument needed" - - java-pkg_check-phase install - java-pkg_init_paths_ - - local dest=/usr/share/doc/${PF}/examples - if [[ ${1} == --subdir ]]; then - local dest=${dest}/${2} - dodir ${dest} - shift 2 - fi - - if [[ ${#} = 1 && -d ${1} ]]; then - ( # dont want to pollute calling env - insinto "${dest}" - doins -r ${1}/* - ) || die "Installing examples failed" - else - ( # dont want to pollute calling env - insinto "${dest}" - doins -r "$@" - ) || die "Installing examples failed" - fi - - # Let's make a symlink to the directory we have everything else under - dosym "${dest}" "${JAVA_PKG_SHAREPATH}/examples" || die -} - -# @FUNCTION: java-pkg_addres -# @USAGE: <jar> <dir> [<find arguments> ...] -# @DESCRIPTION: -# Adds resource files to an existing jar. -# It is important that the directory given is actually the root of the -# corresponding resource tree. The target directory as well as -# sources.lst, MANIFEST.MF, *.class, *.jar, and *.java files are -# automatically excluded. Symlinks are always followed. Additional -# arguments are passed through to find. -# -# @CODE -# java-pkg_addres ${PN}.jar resources ! -name "*.html" -# @CODE -# -# @param $1 - jar file -# @param $2 - resource tree directory -# @param $* - arguments to pass to find -java-pkg_addres() { - debug-print-function ${FUNCNAME} $* - - [[ ${#} -lt 2 ]] && die "at least two arguments needed" - - local jar=$(realpath "$1" || die "realpath $1 failed") - local dir="$2" - shift 2 - - pushd "${dir}" > /dev/null || die "pushd ${dir} failed" - find -L -type f ! -path "./target/*" ! -path "./sources.lst" ! -name "MANIFEST.MF" ! -regex ".*\.\(class\|jar\|java\)" "${@}" -print0 | xargs -r0 jar uf "${jar}" || die "jar failed" - popd > /dev/null || die "popd failed" -} - -# @FUNCTION: java-pkg_rm_files -# @USAGE: java-pkg_rm_files File1.java File2.java ... -# @DESCRIPTION: -# Remove unneeded files in ${S}. -# -# Every now and then, you'll run into situations whereby a file needs removing, -# be it a unit test or a regular java class. -# -# You can use this function by either: -# - calling it yourself in java_prepare() and feeding java-pkg_rm_files with -# the list of files you wish to remove. -# - defining an array in the ebuild named JAVA_RM_FILES with the list of files -# you wish to remove. -# -# Both way work and it is left to the developer's preferences. If the -# JAVA_RM_FILES array is defined, it will be automatically handed over to -# java-pkg_rm_files during the src_prepare phase. -# -# See java-utils-2_src_prepare. -# -# @CODE -# java-pkg_rm_files File1.java File2.java -# @CODE -# -# @param $* - list of files to remove. -java-pkg_rm_files() { - debug-print-function ${FUNCNAME} $* - local IFS="\n" - for filename in "$@"; do - [[ ! -f "${filename}" ]] && die "${filename} is not a regular file. Aborting." - einfo "Removing unneeded file ${filename}" - rm -f "${S}/${filename}" || die "cannot remove ${filename}" - eend $? - done -} - -# @FUNCTION: java-pkg_dojar -# @USAGE: <jar1> [<jar2> ...] -# @DESCRIPTION: -# Installs any number of jars. -# Jar's will be installed into /usr/share/${PN}(-${SLOT})/lib/ by default. -# You can use java-pkg_jarinto to change this path. -# You should never install a jar with a package version in the filename. -# Instead, use java-pkg_newjar defined below. -# -# @CODE -# java-pkg_dojar dist/${PN}.jar dist/${PN}-core.jar -# @CODE -# -# @param $* - list of jars to install -java-pkg_dojar() { - debug-print-function ${FUNCNAME} $* - - [[ ${#} -lt 1 ]] && die "At least one argument needed" - - java-pkg_check-phase install - java-pkg_init_paths_ - - # Create JARDEST if it doesn't exist - dodir ${JAVA_PKG_JARDEST} - - local jar - # for each jar - for jar in "${@}"; do - local jar_basename=$(basename "${jar}") - - java-pkg_check-versioned-jar ${jar_basename} - - # check if it exists - if [[ -e "${jar}" ]] ; then - # Don't overwrite if jar has already been installed with the same - # name - local dest="${ED}${JAVA_PKG_JARDEST}/${jar_basename}" - if [[ -e "${dest}" ]]; then - ewarn "Overwriting ${dest}" - fi - - # install it into JARDEST if it's a non-symlink - if [[ ! -L "${jar}" ]] ; then - #but first check class version when in strict mode. - is-java-strict && java-pkg_verify-classes "${jar}" - - ( - insinto "${JAVA_PKG_JARDEST}" - doins "${jar}" - ) || die "failed to install ${jar}" - java-pkg_append_ JAVA_PKG_CLASSPATH "${EPREFIX}/${JAVA_PKG_JARDEST}/${jar_basename}" - debug-print "installed ${jar} to ${ED}${JAVA_PKG_JARDEST}" - # make a symlink to the original jar if it's symlink - else - # TODO use dosym, once we find something that could use it - # -nichoj - ln -s "$(readlink "${jar}")" "${ED}${JAVA_PKG_JARDEST}/${jar_basename}" - debug-print "${jar} is a symlink, linking accordingly" - fi - else - die "${jar} does not exist" - fi - done - - # Extra logging if enabled. - if [[ -n ${JAVA_PKG_DEBUG} ]]; then - einfo "Verbose logging for \"${FUNCNAME}\" function" - einfo "Jar file(s) destination: ${JAVA_PKG_JARDEST}" - einfo "Jar file(s) created: ${@}" - einfo "Complete command:" - einfo "${FUNCNAME} ${@}" - fi - - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_regjar -# @USAGE: </path/to/installed/jar> -# @DESCRIPTION: -# Records an already installed (in ${D}) jar in the package.env -# This would mostly be used if the package has make or a custom script to -# install things. -# -# WARNING: -# if you want to use shell expansion, you have to use ${D}/... as the for in -# this function will not be able to expand the path, here's an example: -# -# @CODE -# java-pkg_regjar ${D}/opt/my-java/lib/*.jar -# @CODE -# - -# TODO should we be making sure the jar is present on ${D} or wherever? -java-pkg_regjar() { - debug-print-function ${FUNCNAME} $* - - java-pkg_check-phase install - - [[ ${#} -lt 1 ]] && die "at least one argument needed" - - java-pkg_init_paths_ - - local jar jar_dir jar_file - for jar in "${@}"; do - # TODO use java-pkg_check-versioned-jar - if [[ -e "${jar}" || -e "${D}${jar}" ]]; then - [[ -d "${jar}" || -d "${D}${jar}" ]] \ - && die "Called ${FUNCNAME} on a directory $*" - - #check that class version correct when in strict mode - is-java-strict && java-pkg_verify-classes "${jar}" - - # nelchael: we should strip ${D} in this case too, here's why: - # imagine such call: - # java-pkg_regjar ${D}/opt/java/*.jar - # such call will fall into this case (-e ${jar}) and will - # record paths with ${D} in package.env - java-pkg_append_ JAVA_PKG_CLASSPATH "${jar#${D}}" - else - if [[ ${jar} = *\** ]]; then - eerror "The argument ${jar} to ${FUNCNAME}" - eerror "has * in it. If you want it to glob in" - eerror '${D} add ${D} to the argument.' - fi - debug-print "${jar} or ${D}${jar} not found" - die "${jar} does not exist" - fi - done - - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_newjar -# @USAGE: <path/to/oldname.jar> [<newname.jar>] -# @DESCRIPTION: -# Installs a jar with a new name (defaults to $PN.jar) -# -# For example, installs a versioned jar without the version -java-pkg_newjar() { - debug-print-function ${FUNCNAME} $* - - local original_jar="${1}" - local new_jar="${2:-${PN}.jar}" - local new_jar_dest="${T}/${new_jar}" - - [[ -z ${original_jar} ]] && die "Must specify a jar to install" - [[ ! -f ${original_jar} ]] \ - && die "${original_jar} does not exist or is not a file!" - - rm -f "${new_jar_dest}" || die "Failed to remove ${new_jar_dest}" - cp "${original_jar}" "${new_jar_dest}" \ - || die "Failed to copy ${original_jar} to ${new_jar_dest}" - java-pkg_dojar "${new_jar_dest}" -} - -# @FUNCTION: java-pkg_addcp -# @USAGE: <classpath> -# @DESCRIPTION: -# Add something to the package's classpath. For jars, you should use dojar, -# newjar, or regjar. This is typically used to add directories to the classpath. -# The parameters of this function are appended to JAVA_PKG_CLASSPATH -java-pkg_addcp() { - java-pkg_append_ JAVA_PKG_CLASSPATH "${@}" - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_doso -# @USAGE: <path/to/file1.so> [...] -# @DESCRIPTION: -# Installs any number of JNI libraries -# They will be installed into /usr/lib by default, but java-pkg_sointo -# can be used change this path -# -# @CODE -# Example: -# java-pkg_doso *.so -# @CODE -java-pkg_doso() { - debug-print-function ${FUNCNAME} $* - - java-pkg_check-phase install - - [[ ${#} -lt 1 ]] && die "${FUNCNAME} requires at least one argument" - - java-pkg_init_paths_ - - local lib - # for each lib - for lib in "$@" ; do - # if the lib exists... - if [[ -e "${lib}" ]] ; then - # install if it isn't a symlink - if [[ ! -L "${lib}" ]] ; then - ( - insinto "${JAVA_PKG_LIBDEST}" - insopts -m0755 - doins "${lib}" - ) || die "failed to install ${lib}" - java-pkg_append_ JAVA_PKG_LIBRARY "${JAVA_PKG_LIBDEST}" - debug-print "Installing ${lib} to ${JAVA_PKG_LIBDEST}" - # otherwise make a symlink to the symlink's origin - else - dosym "$(readlink "${lib}")" "${JAVA_PKG_LIBDEST}/${lib##*/}" - debug-print "${lib} is a symlink, linking accordantly" - fi - # otherwise die - else - die "${lib} does not exist" - fi - done - - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_regso -# @USAGE: <file1.so> [...] -# @DESCRIPTION: -# Registers an already installed JNI library in package.env. -# -# @CODE -# Parameters: -# $@ - JNI libraries to register -# -# Example: -# java-pkg_regso *.so /path/*.so -# @CODE -java-pkg_regso() { - debug-print-function ${FUNCNAME} $* - - java-pkg_check-phase install - - [[ ${#} -lt 1 ]] && die "${FUNCNAME} requires at least one argument" - - java-pkg_init_paths_ - - local lib target_dir - for lib in "$@" ; do - # Check the absolute path of the lib - if [[ -e "${lib}" ]] ; then - target_dir="$(java-pkg_expand_dir_ ${lib})" - java-pkg_append_ JAVA_PKG_LIBRARY "/${target_dir#${D}}" - # Check the path of the lib relative to ${D} - elif [[ -e "${D}${lib}" ]]; then - target_dir="$(java-pkg_expand_dir_ ${D}${lib})" - java-pkg_append_ JAVA_PKG_LIBRARY "${target_dir}" - else - die "${lib} does not exist" - fi - done - - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_jarinto -# @USAGE: </path/to/install/jars/into> -# @DESCRIPTION: -# Changes the path jars are installed into via subsequent java-pkg_dojar calls. -java-pkg_jarinto() { - debug-print-function ${FUNCNAME} $* - - JAVA_PKG_JARDEST="${1}" -} - -# @FUNCTION: java-pkg_sointo -# @USAGE: </path/to/install/sofiles/into> -# @DESCRIPTION: -# Changes the path that JNI libraries are installed into via subsequent -# java-pkg_doso calls. -java-pkg_sointo() { - debug-print-function ${FUNCNAME} $* - - JAVA_PKG_LIBDEST="${1}" -} - -# @FUNCTION: java-pkg_dohtml -# @USAGE: <path/to/javadoc/documentation> [...] -# @DESCRIPTION: -# Install Javadoc HTML documentation. Usage of java-pkg_dojavadoc is preferred. -# -# @CODE -# java-pkg_dohtml dist/docs/ -# @CODE -java-pkg_dohtml() { - debug-print-function ${FUNCNAME} $* - - [[ ${#} -lt 1 ]] && die "At least one argument required for ${FUNCNAME}" - - # from /usr/lib/portage/bin/dohtml -h - # -f Set list of allowed extensionless file names. - dohtml -f package-list "$@" - - # this probably shouldn't be here but it provides - # a reasonable way to catch # docs for all of the - # old ebuilds. - java-pkg_recordjavadoc -} - -# @FUNCTION: java-pkg_dojavadoc -# @USAGE: [--symlink destination] <path/to/javadocs/root> -# @DESCRIPTION: -# Installs javadoc documentation. This should be controlled by the doc use flag. -# -# @CODE -# Parameters: -# $1: optional --symlink creates to symlink like this for html -# documentation bundles. -# $2: - The javadoc root directory. -# -# Examples: -# java-pkg_dojavadoc docs/api -# java-pkg_dojavadoc --symlink apidocs docs/api -# @CODE -java-pkg_dojavadoc() { - debug-print-function ${FUNCNAME} $* - - # For html documentation bundles that link to Javadoc - local symlink - if [[ ${1} = --symlink ]]; then - symlink=${2} - shift 2 - fi - - local dir="$1" - local dest=/usr/share/doc/${PF}/html - - # QA checks - - java-pkg_check-phase install - java-pkg_init_paths_ - - [[ -z "${dir}" ]] && die "Must specify a directory!" - [[ ! -d "${dir}" ]] && die "${dir} does not exist, or isn't a directory!" - if [[ ! -e "${dir}/index.html" ]]; then - local msg="No index.html in javadoc directory" - ewarn "${msg}" - is-java-strict && die "${msg}" - fi - - if [[ -e ${D}/${dest}/api ]]; then - eerror "${dest} already exists. Will not overwrite." - die "${dest}" - fi - - # Renaming to match our directory layout - - local dir_to_install="${dir}" - if [[ "$(basename "${dir}")" != "api" ]]; then - dir_to_install="${T}/api" - # TODO use doins - cp -r "${dir}" "${dir_to_install}" || die "cp failed" - fi - - # Actual installation - java-pkg_dohtml -r "${dir_to_install}" - - # Let's make a symlink to the directory we have everything else under - dosym ${dest}/api "${JAVA_PKG_SHAREPATH}/api" || die - - if [[ ${symlink} ]]; then - debug-print "symlinking ${dest}/{api,${symlink}}" - dosym ${dest}/{api,${symlink}} || die - fi - - # Extra logging if enabled. - if [[ -n ${JAVA_PKG_DEBUG} ]]; then - einfo "Verbose logging for \"${FUNCNAME}\" function" - einfo "Documentation destination: ${dest}" - einfo "Directory to install: ${dir_to_install}" - einfo "Complete command:" - einfo "${FUNCNAME} ${@}" - fi -} - -# @FUNCTION: java-pkg_dosrc -# @USAGE: <path/to/sources> [...] -# @DESCRIPTION: -# Installs a zip containing the source for a package, so it can used in -# from IDEs like eclipse and netbeans. -# Ebuild needs to DEPEND on app-arch/zip to use this. It also should be controlled by USE=source. -# -# @CODE -# Example: -# java-pkg_dosrc src/* -# @CODE - -# TODO change so it the arguments it takes are the base directories containing -# source -nichoj -# -# TODO should we be able to handle multiple calls to dosrc? -nichoj -# -# TODO maybe we can take an existing zip/jar? -nichoj -# -# FIXME apparently this fails if you give it an empty directories -java-pkg_dosrc() { - debug-print-function ${FUNCNAME} $* - - [ ${#} -lt 1 ] && die "At least one argument needed" - - java-pkg_check-phase install - - [[ ${#} -lt 1 ]] && die "At least one argument needed" - - if ! [[ ${DEPEND} = *app-arch/zip* ]]; then - local msg="${FUNCNAME} called without app-arch/zip in DEPEND" - java-pkg_announce-qa-violation ${msg} - fi - - java-pkg_init_paths_ - - local zip_name="${PN}-src.zip" - local zip_path="${T}/${zip_name}" - local dir - for dir in "${@}"; do - local dir_parent=$(dirname "${dir}") - local dir_name=$(basename "${dir}") - pushd ${dir_parent} > /dev/null || die "problem entering ${dir_parent}" - zip -q -r ${zip_path} ${dir_name} -i '*.java' - local result=$? - # 12 means zip has nothing to do - if [[ ${result} != 12 && ${result} != 0 ]]; then - die "failed to zip ${dir_name}" - fi - popd >/dev/null || die - done - - # Install the zip - ( - insinto "${JAVA_PKG_SOURCESPATH}" - doins ${zip_path} - ) || die "Failed to install source" - - JAVA_SOURCES="${JAVA_PKG_SOURCESPATH}/${zip_name}" - - # Extra logging if enabled. - if [[ -n ${JAVA_PKG_DEBUG} ]]; then - einfo "Verbose logging for \"${FUNCNAME}\" function" - einfo "Zip filename created: ${zip_name}" - einfo "Zip file destination: ${JAVA_PKG_SOURCESPATH}" - einfo "Directories zipped: ${@}" - einfo "Complete command:" - einfo "${FUNCNAME} ${@}" - fi - - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_dolauncher -# @USAGE: <filename> [options] -# @DESCRIPTION: -# Make a wrapper script to lauch/start this package -# If necessary, the wrapper will switch to the appropriate VM. -# -# Can be called without parameters if the package installs only one jar -# that has the Main-class attribute set. The wrapper will be named ${PN}. -# -# @CODE -# Parameters: -# $1 - filename of launcher to create -# $2 - options, as follows: -# --main the.main.class.to.start -# --jar /the/jar/too/launch.jar or just <name>.jar -# --java_args 'Extra arguments to pass to java' -# --pkg_args 'Extra arguments to pass to the package' -# --pwd Directory the launcher changes to before executing java -# -into Directory to install the launcher to, instead of /usr/bin -# -pre Prepend contents of this file to the launcher -# @CODE -java-pkg_dolauncher() { - debug-print-function ${FUNCNAME} $* - - java-pkg_check-phase install - java-pkg_init_paths_ - - if [[ ${#} = 0 ]]; then - local name="${PN}" - else - local name="${1}" - shift - fi - - # TODO rename to launcher - local target="${T}/${name}" - local var_tmp="${T}/launcher_variables_tmp" - local target_dir pre - - # Process the other the rest of the arguments - while [[ -n "${1}" && -n "${2}" ]]; do - local var="${1}" value="${2}" - if [[ "${var:0:2}" == "--" ]]; then - local var=${var:2} - echo "gjl_${var}=\"${value}\"" >> "${var_tmp}" - local gjl_${var}="${value}" - elif [[ "${var}" == "-into" ]]; then - target_dir="${value}" - elif [[ "${var}" == "-pre" ]]; then - pre="${value}" - fi - shift 2 - done - - # Test if no --jar and --main arguments were given and - # in that case check if the package only installs one jar - # and use that jar. - if [[ -z "${gjl_jar}" && -z "${gjl_main}" ]]; then - local cp="${JAVA_PKG_CLASSPATH}" - if [[ "${cp/:}" = "${cp}" && "${cp%.jar}" != "${cp}" ]]; then - echo "gjl_jar=\"${JAVA_PKG_CLASSPATH}\"" >> "${var_tmp}" - else - local msg="Not enough information to create a launcher given." - msg="${msg} Please give --jar or --main argument to ${FUNCNAME}." - die "${msg}" - fi - fi - - # Write the actual script - echo "#!/bin/bash" > "${target}" - if [[ -n "${pre}" ]]; then - if [[ -f "${pre}" ]]; then - cat "${pre}" >> "${target}" - else - die "-pre specified file '${pre}' does not exist" - fi - fi - echo "gjl_package=${JAVA_PKG_NAME}" >> "${target}" - cat "${var_tmp}" >> "${target}" - rm -f "${var_tmp}" - echo "source ${EPREFIX}/usr/share/java-config-2/launcher/launcher.bash" >> "${target}" - - if [[ -n "${target_dir}" ]]; then - ( - into "${target_dir}" - dobin "${target}" - ) - local ret=$? - return ${ret} - else - dobin "${target}" - fi -} - -# @FUNCTION: java-pkg_dowar -# @DESCRIPTION: -# Install war files. -# TODO document -java-pkg_dowar() { - debug-print-function ${FUNCNAME} $* - - # Check for arguments - [[ ${#} -lt 1 ]] && die "At least one argument needed" - java-pkg_check-phase install - - java-pkg_init_paths_ - - local war - for war in $* ; do - local warpath - # TODO evaluate if we want to handle symlinks differently -nichoj - # Check for symlink - if [[ -L "${war}" ]] ; then - cp "${war}" "${T}" - warpath="${T}$(basename "${war}")" - # Check for directory - # TODO evaluate if we want to handle directories differently -nichoj - elif [[ -d "${war}" ]] ; then - echo "dowar: warning, skipping directory ${war}" - continue - else - warpath="${war}" - fi - - # Install those files like you mean it - ( - insopts -m0644 - insinto "${JAVA_PKG_WARDEST}" - doins ${warpath} - ) - done -} - -# @FUNCTION: java-pkg_recordjavadoc -# @INTERNAL -# @DESCRIPTION: -# Scan for JavaDocs, and record their existence in the package.env file - -# TODO make sure this in the proper section -java-pkg_recordjavadoc() -{ - debug-print-function ${FUNCNAME} $* - # the find statement is important - # as some packages include multiple trees of javadoc - JAVADOC_PATH="$(find ${D}/usr/share/doc/ -name allclasses-frame.html -printf '%h:')" - # remove $D - TODO: check this is ok with all cases of the above - JAVADOC_PATH="${JAVADOC_PATH//${D}}" - if [[ -n "${JAVADOC_PATH}" ]] ; then - debug-print "javadocs found in ${JAVADOC_PATH%:}" - java-pkg_do_write_ - else - debug-print "No javadocs found" - fi -} - - -# @FUNCTION: java-pkg_jar-from -# @USAGE: [--build-only] [--with-dependencies] [--virtual] [--into dir] <package> [<package.jar>] [<destination.jar>] -# @DESCRIPTION: -# Makes a symlink to a jar from a certain package -# A lot of java packages include dependencies in a lib/ directory -# You can use this function to replace these bundled dependencies. -# The dependency is recorded into package.env DEPEND line, unless "--build-only" -# is passed as the very first argument, for jars that have to be present only -# at build time and are not needed on runtime (junit testing etc). -# -# @CODE -# Example: get all jars from xerces slot 2 -# java-pkg_jar-from xerces-2 -# -# Example: get a specific jar from xerces slot 2 -# java-pkg_jar-from xerces-2 xml-apis.jar -# -# Example: get a specific jar from xerces slot 2, and name it diffrently -# java-pkg_jar-from xerces-2 xml-apis.jar xml.jar -# -# Example: get junit.jar which is needed only for building -# java-pkg_jar-from --build-only junit junit.jar -# @CODE -# -# @CODE -# Parameters -# --build-only - makes the jar(s) not added into package.env DEPEND line. -# (assumed automatically when called inside src_test) -# --with-dependencies - get jars also from requested package's dependencies -# transitively. -# --virtual - Packages passed to this function are to be handled as virtuals -# and will not have individual jar dependencies recorded. -# --into $dir - symlink jar(s) into $dir (must exist) instead of . -# $1 - Package to get jars from, or comma-separated list of packages in -# case other parameters are not used. -# $2 - jar from package. If not specified, all jars will be used. -# $3 - When a single jar is specified, destination filename of the -# symlink. Defaults to the name of the jar. -# @CODE - -# TODO could probably be cleaned up a little -java-pkg_jar-from() { - debug-print-function ${FUNCNAME} $* - - local build_only="" - local destdir="." - local deep="" - local virtual="" - local record_jar="" - - [[ "${EBUILD_PHASE}" == "test" ]] && build_only="build" - - while [[ "${1}" == --* ]]; do - if [[ "${1}" = "--build-only" ]]; then - build_only="build" - elif [[ "${1}" = "--with-dependencies" ]]; then - deep="--with-dependencies" - elif [[ "${1}" = "--virtual" ]]; then - virtual="true" - elif [[ "${1}" = "--into" ]]; then - destdir="${2}" - shift - else - die "java-pkg_jar-from called with unknown parameter: ${1}" - fi - shift - done - - local target_pkg="${1}" target_jar="${2}" destjar="${3}" - - [[ -z ${target_pkg} ]] && die "Must specify a package" - - if [[ "${EAPI}" == "1" ]]; then - target_pkg="${target_pkg//:/-}" - fi - - # default destjar to the target jar - [[ -z "${destjar}" ]] && destjar="${target_jar}" - - local error_msg="There was a problem getting the classpath for ${target_pkg}." - local classpath - classpath="$(java-config ${deep} --classpath=${target_pkg})" - [[ $? != 0 ]] && die ${error_msg} - - # When we have commas this functions is called to bring jars from multiple - # packages. This affects recording of dependencencies performed later - # which expects one package only, so we do it here. - if [[ ${target_pkg} = *,* ]]; then - for pkg in ${target_pkg//,/ }; do - java-pkg_ensure-dep "${build_only}" "${pkg}" - [[ -z "${build_only}" ]] && java-pkg_record-jar_ "${pkg}" - done - # setting this disables further record-jar_ calls later - record_jar="true" - else - java-pkg_ensure-dep "${build_only}" "${target_pkg}" - fi - - # Record the entire virtual as a dependency so that - # no jars are missed. - if [[ -z "${build_only}" && -n "${virtual}" ]]; then - java-pkg_record-jar_ "${target_pkg}" - # setting this disables further record-jars_ calls later - record_jar="true" - fi - - pushd ${destdir} > /dev/null \ - || die "failed to change directory to ${destdir}" - - local jar - for jar in ${classpath//:/ }; do - local jar_name=$(basename "${jar}") - if [[ ! -f "${jar}" ]] ; then - debug-print "${jar} from ${target_pkg} does not exist" - die "Installation problems with jars in ${target_pkg} - is it installed?" - fi - # If no specific target jar was indicated, link it - if [[ -z "${target_jar}" ]] ; then - [[ -f "${target_jar}" ]] && rm "${target_jar}" - ln -snf "${jar}" \ - || die "Failed to make symlink from ${jar} to ${jar_name}" - if [[ -z "${record_jar}" ]]; then - if [[ -z "${build_only}" ]]; then - java-pkg_record-jar_ "${target_pkg}" "${jar}" - else - java-pkg_record-jar_ --build-only "${target_pkg}" "${jar}" - fi - fi - # otherwise, if the current jar is the target jar, link it - elif [[ "${jar_name}" == "${target_jar}" ]] ; then - [[ -f "${destjar}" ]] && rm "${destjar}" - ln -snf "${jar}" "${destjar}" \ - || die "Failed to make symlink from ${jar} to ${destjar}" - if [[ -z "${record_jar}" ]]; then - if [[ -z "${build_only}" ]]; then - java-pkg_record-jar_ "${target_pkg}" "${jar}" - else - java-pkg_record-jar_ --build-only "${target_pkg}" "${jar}" - fi - fi - popd > /dev/null || die - return 0 - fi - done - popd > /dev/null || die - # if no target was specified, we're ok - if [[ -z "${target_jar}" ]] ; then - return 0 - # otherwise, die bitterly - else - die "Failed to find ${target_jar:-jar} in ${target_pkg}" - fi -} - -# @FUNCTION: java-pkg_jarfrom -# @DESCRIPTION: -# See java-pkg_jar-from -java-pkg_jarfrom() { - java-pkg_jar-from "$@" -} - -# @FUNCTION: java-pkg_getjars -# @USAGE: [--build-only] [--with-dependencies] <package1>[,<package2>...] -# @DESCRIPTION: -# Get the classpath provided by any number of packages -# Among other things, this can be passed to 'javac -classpath' or 'ant -lib'. -# The providing packages are recorded as dependencies into package.env DEPEND -# line, unless "--build-only" is passed as the very first argument, for jars -# that have to be present only at build time and are not needed on runtime -# (junit testing etc). -# -# @CODE -# Example: Get the classpath for xerces-2 and xalan, -# java-pkg_getjars xerces-2,xalan -# -# Example Return: -# /usr/share/xerces-2/lib/xml-apis.jar:/usr/share/xerces-2/lib/xmlParserAPIs.jar:/usr/share/xalan/lib/xalan.jar -# -# -# Parameters: -# --build-only - makes the jar(s) not added into package.env DEPEND line. -# (assumed automatically when called inside src_test) -# --with-dependencies - get jars also from requested package's dependencies -# transitively. -# $1 - list of packages to get jars from -# (passed to java-config --classpath) -# @CODE -java-pkg_getjars() { - debug-print-function ${FUNCNAME} $* - - local build_only="" - local deep="" - - [[ "${EBUILD_PHASE}" == "test" ]] && build_only="build" - - while [[ "${1}" == --* ]]; do - if [[ "${1}" = "--build-only" ]]; then - build_only="build" - elif [[ "${1}" = "--with-dependencies" ]]; then - deep="--with-dependencies" - else - die "java-pkg_jar-from called with unknown parameter: ${1}" - fi - shift - done - - [[ ${#} -ne 1 ]] && die "${FUNCNAME} takes only one argument besides --*" - - - local pkgs="${1}" - - if [[ "${EAPI}" == "1" ]]; then - pkgs="${pkgs//:/-}" - fi - - jars="$(java-config ${deep} --classpath=${pkgs})" - [[ $? != 0 ]] && die "java-config --classpath=${pkgs} failed" - debug-print "${pkgs}:${jars}" - - for pkg in ${pkgs//,/ }; do - java-pkg_ensure-dep "${build_only}" "${pkg}" - done - - for pkg in ${pkgs//,/ }; do - if [[ -z "${build_only}" ]]; then - java-pkg_record-jar_ "${pkg}" - else - java-pkg_record-jar_ --build-only "${pkg}" - fi - done - - echo "${jars}" -} - -# @FUNCTION: java-pkg_getjar -# @USAGE: [--build-only] [--virtual] <package> <jarfile> -# @DESCRIPTION: -# Get the complete path of a single jar from a package -# The providing package is recorded as runtime dependency into package.env -# DEPEND line, unless "--build-only" is passed as the very first argument, for -# jars that have to be present only at build time and are not needed on runtime -# (junit testing etc). -# -# @CODE -# Example: -# java-pkg_getjar xerces-2 xml-apis.jar -# returns -# /usr/share/xerces-2/lib/xml-apis.jar -# -# Parameters: -# --build-only - makes the jar not added into package.env DEPEND line. -# --virtual - Packages passed to this function are to be handled as virtuals -# and will not have individual jar dependencies recorded. -# $1 - package to use -# $2 - jar to get -# @CODE -java-pkg_getjar() { - debug-print-function ${FUNCNAME} $* - - local build_only="" - local virtual="" - local record_jar="" - - [[ "${EBUILD_PHASE}" == "test" ]] && build_only="build" - - while [[ "${1}" == --* ]]; do - if [[ "${1}" = "--build-only" ]]; then - build_only="build" - elif [[ "${1}" == "--virtual" ]]; then - virtual="true" - else - die "java-pkg_getjar called with unknown parameter: ${1}" - fi - shift - done - - [[ ${#} -ne 2 ]] && die "${FUNCNAME} takes only two arguments besides --*" - - local pkg="${1}" target_jar="${2}" jar - - if [[ "${EAPI}" == "1" ]]; then - pkg="${pkg//:/-}" - fi - - [[ -z ${pkg} ]] && die "Must specify package to get a jar from" - [[ -z ${target_jar} ]] && die "Must specify jar to get" - - local error_msg="Could not find classpath for ${pkg}. Are you sure its installed?" - local classpath - classpath=$(java-config --classpath=${pkg}) - [[ $? != 0 ]] && die ${error_msg} - - java-pkg_ensure-dep "${build_only}" "${pkg}" - - # Record the package(Virtual) as a dependency and then set build_only - # So that individual jars are not recorded. - if [[ -n "${virtual}" ]]; then - if [[ -z "${build_only}" ]]; then - java-pkg_record-jar_ "${pkg}" - else - java-pkg_record-jar_ --build-only "${pkg}" - fi - record_jar="true" - fi - - for jar in ${classpath//:/ }; do - if [[ ! -f "${jar}" ]] ; then - die "Installation problem with jar ${jar} in ${pkg} - is it installed?" - fi - - if [[ "$(basename ${jar})" == "${target_jar}" ]] ; then - # Only record jars that aren't build-only - if [[ -z "${record_jar}" ]]; then - if [[ -z "${build_only}" ]]; then - java-pkg_record-jar_ "${pkg}" "${jar}" - else - java-pkg_record-jar_ --build-only "${pkg}" "${jar}" - fi - fi - echo "${jar}" - return 0 - fi - done - - die "Could not find ${target_jar} in ${pkg}" - return 1 -} - -# @FUNCTION: java-pkg_register-dependency -# @USAGE: <package>[,<package2>...] [<jarfile>] -# @DESCRIPTION: -# Registers runtime dependency on a package, list of packages, or a single jar -# from a package, into package.env DEPEND line. Can only be called in -# src_install phase. -# Intended for binary packages where you don't need to symlink the jars or get -# their classpath during build. As such, the dependencies only need to be -# specified in ebuild's RDEPEND, and should be omitted in DEPEND. -# -# @CODE -# Parameters: -# $1 - comma-separated list of packages, or a single package -# $2 - if param $1 is a single package, optionally specify the jar -# to depend on -# -# Examples: -# Record the dependency on whole xerces-2 and xalan, -# java-pkg_register-dependency xerces-2,xalan -# -# Record the dependency on ant.jar from ant-core -# java-pkg_register-dependency ant-core ant.jar -# @CODE -# -# Note: Passing both list of packages as the first parameter AND specifying the -# jar as the second is not allowed and will cause the function to die. We assume -# that there's more chance one passes such combination as a mistake, than that -# there are more packages providing identically named jar without class -# collisions. -java-pkg_register-dependency() { - debug-print-function ${FUNCNAME} $* - - java-pkg_check-phase install - - [[ ${#} -gt 2 ]] && die "${FUNCNAME} takes at most two arguments" - - local pkgs="${1}" - local jar="${2}" - - [[ -z "${pkgs}" ]] && die "${FUNCNAME} called with no package(s) specified" - - if [[ "${EAPI}" == "1" ]]; then - pkgs="${pkgs//:/-}" - fi - - if [[ -z "${jar}" ]]; then - for pkg in ${pkgs//,/ }; do - java-pkg_ensure-dep runtime "${pkg}" - java-pkg_record-jar_ "${pkg}" - done - else - [[ ${pkgs} == *,* ]] && \ - die "${FUNCNAME} called with both package list and jar name" - java-pkg_ensure-dep runtime "${pkgs}" - java-pkg_record-jar_ "${pkgs}" "${jar}" - fi - - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_register-optional-dependency -# @USAGE: <package>[,<package2>...] [<jarfile>] -# @DESCRIPTION: -# Registers optional runtime dependency on a package, list of packages, or a -# single jar from a package, into package.env OPTIONAL_DEPEND line. Can only be -# called in src_install phase. -# Intended for packages that can use other packages when those are in classpath. -# Will be put on classpath by launcher if they are installed. Typical case is -# JDBC implementations for various databases. It's better than having USE flag -# for each implementation triggering hard dependency. -# -# @CODE -# Parameters: -# $1 - comma-separated list of packages, or a single package -# $2 - if param $1 is a single package, optionally specify the jar to depend on -# -# Example: -# Record the optional dependency on some jdbc providers -# java-pkg_register-optional-dependency jdbc-jaybird,jtds-1.2,jdbc-mysql -# @CODE -# -# Note: Passing both list of packages as the first parameter AND specifying the -# jar as the second is not allowed and will cause the function to die. We assume -# that there's more chance one passes such combination as a mistake, than that -# there are more packages providing identically named jar without class -# collisions. -java-pkg_register-optional-dependency() { - debug-print-function ${FUNCNAME} $* - - java-pkg_check-phase install - - [[ ${#} -gt 2 ]] && die "${FUNCNAME} takes at most two arguments" - - local pkgs="${1}" - local jar="${2}" - - [[ -z "${pkgs}" ]] && die "${FUNCNAME} called with no package(s) specified" - - if [[ "${EAPI}" == "1" ]]; then - pkgs="${pkgs//:/-}" - fi - - if [[ -z "${jar}" ]]; then - for pkg in ${pkgs//,/ }; do - java-pkg_record-jar_ --optional "${pkg}" - done - else - [[ ${pkgs} == *,* ]] && \ - die "${FUNCNAME} called with both package list and jar name" - java-pkg_record-jar_ --optional "${pkgs}" "${jar}" - fi - - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_register-environment-variable -# @USAGE: <name> <value> -# @DESCRIPTION: -# Register an arbitrary environment variable into package.env. The gjl launcher -# for this package or any package depending on this will export it into -# environement before executing java command. -# Must only be called in src_install phase. -JAVA_PKG_EXTRA_ENV="${T}/java-pkg-extra-env" -JAVA_PKG_EXTRA_ENV_VARS="" -java-pkg_register-environment-variable() { - debug-print-function ${FUNCNAME} $* - - java-pkg_check-phase install - - [[ ${#} != 2 ]] && die "${FUNCNAME} takes two arguments" - - echo "${1}=\"${2}\"" >> ${JAVA_PKG_EXTRA_ENV} - JAVA_PKG_EXTRA_ENV_VARS="${JAVA_PKG_EXTRA_ENV_VARS} ${1}" - - java-pkg_do_write_ -} - -# @FUNCTION: java-pkg_get-bootclasspath -# @USAGE: <version> -# @DESCRIPTION: -# Returns classpath of a given bootclasspath-providing package version. -# -# @param $1 - the version of bootclasspath (e.g. 1.5), 'auto' for bootclasspath -# of the current JDK -java-pkg_get-bootclasspath() { - local version="${1}" - - local bcp - case "${version}" in - auto) - bcp="$(java-config -g BOOTCLASSPATH)" - ;; - 1.5) - bcp="$(java-pkg_getjars --build-only gnu-classpath-0.98)" - ;; - *) - eerror "unknown parameter of java-pkg_get-bootclasspath" - die "unknown parameter of java-pkg_get-bootclasspath" - ;; - esac - - echo "${bcp}" -} - - -# This function reads stdin, and based on that input, figures out how to -# populate jars from the filesystem. -# Need to figure out a good way of making use of this, ie be able to use a -# string that was built instead of stdin -# NOTE: this isn't quite ready for primetime. -#java-pkg_populate-jars() { -# local line -# -# read line -# while [[ -n "${line}" ]]; do -# # Ignore comments -# [[ ${line%%#*} == "" ]] && continue -# -# # get rid of any spaces -# line="${line// /}" -# -# # format: path=jarinfo -# local path=${line%%=*} -# local jarinfo=${line##*=} -# -# # format: jar@package -# local jar=${jarinfo%%@*}.jar -# local package=${jarinfo##*@} -# if [[ -n ${replace_only} ]]; then -# [[ ! -f $path ]] && die "No jar exists at ${path}" -# fi -# if [[ -n ${create_parent} ]]; then -# local parent=$(dirname ${path}) -# mkdir -p "${parent}" -# fi -# java-pkg_jar-from "${package}" "${jar}" "${path}" -# -# read line -# done -#} - -# @FUNCTION: java-pkg_find-normal-jars -# @USAGE: [<path/to/directory>] -# @DESCRIPTION: -# Find the files with suffix .jar file in the given directory (default: $WORKDIR) -java-pkg_find-normal-jars() { - local dir=$1 - [[ "${dir}" ]] || dir="${WORKDIR}" - local found - for jar in $(find "${dir}" -name "*.jar" -type f); do - echo "${jar}" - found="true" - done - [[ "${found}" ]] - return $? -} - -# @FUNCTION: java-pkg_ensure-no-bundled-jars -# @DESCRIPTION: -# Try to locate bundled jar files in ${WORKDIR} and die if found. -# This function should be called after WORKDIR has been populated with symlink -# to system jar files or bundled jars removed. -java-pkg_ensure-no-bundled-jars() { - debug-print-function ${FUNCNAME} $* - - local bundled_jars=$(java-pkg_find-normal-jars) - if [[ -n ${bundled_jars} ]]; then - echo "Bundled jars found:" - local jar - for jar in ${bundled_jars}; do - echo $(pwd)${jar/./} - done - die "Bundled jars found!" - fi -} - -# @FUNCTION: java-pkg_ensure-vm-version-sufficient -# @INTERNAL -# @DESCRIPTION: -# Checks if we have a sufficient VM and dies if we don't. -java-pkg_ensure-vm-version-sufficient() { - debug-print-function ${FUNCNAME} $* - - if ! java-pkg_is-vm-version-sufficient; then - debug-print "VM is not suffient" - eerror "Current Java VM cannot build this package" - einfo "Please use java-config -S to set the correct one" - die "Active Java VM cannot build this package" - fi -} - -# @FUNCTION: java-pkg_is-vm-version-sufficient -# @INTERNAL -# @DESCRIPTION: -# @RETURN: zero - VM is sufficient; non-zero - VM is not sufficient -java-pkg_is-vm-version-sufficient() { - debug-print-function ${FUNCNAME} $* - - depend-java-query --is-sufficient "${DEPEND}" > /dev/null - return $? -} - -# @FUNCTION: java-pkg_ensure-vm-version-eq -# @INTERNAL -# @DESCRIPTION: -# Die if the current VM is not equal to the argument passed. -# -# @param $@ - Desired VM version to ensure -java-pkg_ensure-vm-version-eq() { - debug-print-function ${FUNCNAME} $* - - if ! java-pkg_is-vm-version-eq $@ ; then - debug-print "VM is not suffient" - eerror "This package requires a Java VM version = $@" - einfo "Please use java-config -S to set the correct one" - die "Active Java VM too old" - fi -} - -# @FUNCTION: java-pkg_is-vm-version-eq -# @USAGE: <version> -# @INTERNAL -# @RETURN: zero - VM versions are equal; non-zero - VM version are not equal -java-pkg_is-vm-version-eq() { - debug-print-function ${FUNCNAME} $* - - local needed_version="$@" - - [[ -z "${needed_version}" ]] && die "need an argument" - - local vm_version="$(java-pkg_get-vm-version)" - - vm_version="$(get_version_component_range 1-2 "${vm_version}")" - needed_version="$(get_version_component_range 1-2 "${needed_version}")" - - if [[ -z "${vm_version}" ]]; then - debug-print "Could not get JDK version from DEPEND" - return 1 - else - if [[ "${vm_version}" == "${needed_version}" ]]; then - debug-print "Detected a JDK(${vm_version}) = ${needed_version}" - return 0 - else - debug-print "Detected a JDK(${vm_version}) != ${needed_version}" - return 1 - fi - fi -} - -# @FUNCTION: java-pkg_ensure-vm-version-ge -# @INTERNAL -# @DESCRIPTION: -# Die if the current VM is not greater than the desired version -# -# @param $@ - VM version to compare current to -java-pkg_ensure-vm-version-ge() { - debug-print-function ${FUNCNAME} $* - - if ! java-pkg_is-vm-version-ge "$@" ; then - debug-print "vm is not suffient" - eerror "This package requires a Java VM version >= $@" - einfo "Please use java-config -S to set the correct one" - die "Active Java VM too old" - fi -} - -# @FUNCTION: java-pkg_is-vm-version-ge -# @INTERNAL -# @DESCRIPTION: -# @CODE -# Parameters: -# $@ - VM version to compare current VM to -# @CODE -# @RETURN: zero - current VM version is greater than checked version; -# non-zero - current VM version is not greater than checked version -java-pkg_is-vm-version-ge() { - debug-print-function ${FUNCNAME} $* - - local needed_version=$@ - local vm_version=$(java-pkg_get-vm-version) - if [[ -z "${vm_version}" ]]; then - debug-print "Could not get JDK version from DEPEND" - return 1 - else - if version_is_at_least "${needed_version}" "${vm_version}"; then - debug-print "Detected a JDK(${vm_version}) >= ${needed_version}" - return 0 - else - debug-print "Detected a JDK(${vm_version}) < ${needed_version}" - return 1 - fi - fi -} - -java-pkg_set-current-vm() { - export GENTOO_VM=${1} -} - -java-pkg_get-current-vm() { - echo ${GENTOO_VM} -} - -java-pkg_current-vm-matches() { - has $(java-pkg_get-current-vm) ${@} - return $? -} - -# @FUNCTION: java-pkg_get-source -# @DESCRIPTION: -# Determines what source version should be used, for passing to -source. -# Unless you want to break things you probably shouldn't set _WANT_SOURCE -# -# @RETURN: string - Either the lowest possible source, or JAVA_PKG_WANT_SOURCE -java-pkg_get-source() { - echo ${JAVA_PKG_WANT_SOURCE:-$(depend-java-query --get-lowest "${DEPEND} ${RDEPEND}")} -} - -# @FUNCTION: java-pkg_get-target -# @DESCRIPTION: -# Determines what target version should be used, for passing to -target. -# If you don't care about lower versions, you can set _WANT_TARGET to the -# version of your JDK. -# -# @RETURN: string - Either the lowest possible target, or JAVA_PKG_WANT_TARGET -java-pkg_get-target() { - echo ${JAVA_PKG_WANT_TARGET:-$(depend-java-query --get-lowest "${DEPEND} ${RDEPEND}")} -} - -# @FUNCTION: java-pkg_get-javac -# @DESCRIPTION: -# Returns the compiler executable -java-pkg_get-javac() { - debug-print-function ${FUNCNAME} $* - - java-pkg_init-compiler_ - local compiler="${GENTOO_COMPILER}" - - local compiler_executable - if [[ "${compiler}" = "javac" ]]; then - # nothing fancy needs to be done for javac - compiler_executable="javac" - else - # for everything else, try to determine from an env file - - local compiler_env="/usr/share/java-config-2/compiler/${compiler}" - if [[ -f ${compiler_env} ]]; then - local old_javac=${JAVAC} - unset JAVAC - # try to get value of JAVAC - compiler_executable="$(source ${compiler_env} 1>/dev/null 2>&1; echo ${JAVAC})" - export JAVAC=${old_javac} - - if [[ -z ${compiler_executable} ]]; then - die "JAVAC is empty or undefined in ${compiler_env}" - fi - - # check that it's executable - if [[ ! -x ${compiler_executable} ]]; then - die "${compiler_executable} doesn't exist, or isn't executable" - fi - else - die "Could not find environment file for ${compiler}" - fi - fi - echo ${compiler_executable} -} - -# @FUNCTION: java-pkg_javac-args -# @DESCRIPTION: -# If an ebuild uses javac directly, instead of using ejavac, it should call this -# to know what -source/-target to use. -# -# @RETURN: string - arguments to pass to javac, complete with -target and -source -java-pkg_javac-args() { - debug-print-function ${FUNCNAME} $* - - local want_source="$(java-pkg_get-source)" - local want_target="$(java-pkg_get-target)" - - local source_str="-source ${want_source}" - local target_str="-target ${want_target}" - - debug-print "want source: ${want_source}" - debug-print "want target: ${want_target}" - - if [[ -z "${want_source}" || -z "${want_target}" ]]; then - die "Could not find valid -source/-target values for javac" - else - echo "${source_str} ${target_str}" - fi -} - -# @FUNCTION: java-pkg_get-jni-cflags -# @DESCRIPTION: -# Echos the CFLAGS for JNI compilations -java-pkg_get-jni-cflags() { - local flags="-I${JAVA_HOME}/include" - - local platform="linux" - use elibc_FreeBSD && platform="freebsd" - - # TODO do a check that the directories are valid - flags="${flags} -I${JAVA_HOME}/include/${platform}" - - echo ${flags} -} - -java-pkg_ensure-gcj() { - # was enforcing sys-devel/gcc[gcj] - die "${FUNCNAME} was removed. Use use-deps available as of EAPI 2 instead. #261562" -} - -java-pkg_ensure-test() { - # was enforcing USE=test if FEATURES=test - die "${FUNCNAME} was removed. Package mangers handle this already. #278965" -} - -# @FUNCTION: java-pkg_register-ant-task -# @USAGE: [--version x.y] [<name>] -# @DESCRIPTION: -# Register this package as ant task, so that ant will load it when no specific -# ANT_TASKS are specified. Note that even without this registering, all packages -# specified in ANT_TASKS will be loaded. Mostly used by the actual ant tasks -# packages, but can be also used by other ebuilds that used to symlink their -# .jar into /usr/share/ant-core/lib to get autoloaded, for backwards -# compatibility. -# -# @CODE -# Parameters -# --version x.y Register only for ant version x.y (otherwise for any ant -# version). Used by the ant-* packages to prevent loading of mismatched -# ant-core ant tasks after core was updated, before the tasks are updated, -# without a need for blockers. -# $1 Name to register as. Defaults to JAVA_PKG_NAME ($PN[-$SLOT]) -# @CODE -java-pkg_register-ant-task() { - local TASKS_DIR="tasks" - - # check for --version x.y parameters - while [[ -n "${1}" && -n "${2}" ]]; do - local var="${1#--}" - local val="${2}" - if [[ "${var}" == "version" ]]; then - TASKS_DIR="tasks-${val}" - else - die "Unknown parameter passed to java-pkg_register-ant-tasks: ${1} ${2}" - fi - shift 2 - done - - local TASK_NAME="${1:-${JAVA_PKG_NAME}}" - - dodir /usr/share/ant/${TASKS_DIR} - touch "${ED}/usr/share/ant/${TASKS_DIR}/${TASK_NAME}" -} - -# @FUNCTION: java-pkg_ant-tasks-depend -# @INTERNAL -# @DESCRIPTION: -# Translates the WANT_ANT_TASKS variable into valid dependencies. -java-pkg_ant-tasks-depend() { - debug-print-function ${FUNCNAME} ${WANT_ANT_TASKS} - - if [[ -n "${WANT_ANT_TASKS}" ]]; then - local DEP="" - for i in ${WANT_ANT_TASKS} - do - if [[ ${i} = ant-* ]]; then - DEP="${DEP}dev-java/${i} " - elif [[ ${i} = */*:* ]]; then - DEP="${DEP}${i} " - else - echo "Invalid atom in WANT_ANT_TASKS: ${i}" - return 1 - fi - done - echo ${DEP} - return 0 - else - return 0 - fi -} - - -# @FUNCTION: ejunit_ -# @INTERNAL -# @DESCRIPTION: -# Internal Junit wrapper function. Makes it easier to run the tests and checks for -# dev-java/junit in DEPEND. Launches the tests using junit.textui.TestRunner. -# @CODE -# Parameters: -# $1 - junit package (junit or junit-4) -# $2 - -cp or -classpath -# $3 - classpath; junit and recorded dependencies get appended -# $@ - the rest of the parameters are passed to java -# @CODE -ejunit_() { - debug-print-function ${FUNCNAME} $* - - local pkgs - if [[ -f ${JAVA_PKG_DEPEND_FILE} ]]; then - for atom in $(cat ${JAVA_PKG_DEPEND_FILE} | tr : ' '); do - pkgs=${pkgs},$(echo ${atom} | sed -re "s/^.*@//") - done - fi - - local junit=${1} - shift 1 - - local cp=$(java-pkg_getjars --with-dependencies ${junit}${pkgs}) - if [[ ${1} = -cp || ${1} = -classpath ]]; then - cp="${2}:${cp}" - shift 2 - else - cp=".:${cp}" - fi - - local runner=junit.textui.TestRunner - if [[ "${junit}" == "junit-4" ]] ; then - runner=org.junit.runner.JUnitCore - fi - debug-print "Calling: java -cp \"${cp}\" -Djava.io.tmpdir=\"${T}\" -Djava.awt.headless=true ${runner} ${@}" - java -cp "${cp}" -Djava.io.tmpdir="${T}/" -Djava.awt.headless=true ${runner} "${@}" || die "Running junit failed" -} - -# @FUNCTION: ejunit -# @DESCRIPTION: -# Junit wrapper function. Makes it easier to run the tests and checks for -# dev-java/junit in DEPEND. Launches the tests using org.junit.runner.JUnitCore. -# -# @CODE -# Parameters: -# $1 - -cp or -classpath -# $2 - classpath; junit and recorded dependencies get appended -# $@ - the rest of the parameters are passed to java -# -# Examples: -# ejunit -cp build/classes org.blinkenlights.jid3.test.AllTests -# ejunit org.blinkenlights.jid3.test.AllTests -# ejunit org.blinkenlights.jid3.test.FirstTest org.blinkenlights.jid3.test.SecondTest -# @CODE -ejunit() { - debug-print-function ${FUNCNAME} $* - - ejunit_ "junit" "${@}" -} - -# @FUNCTION: ejunit4 -# @DESCRIPTION: -# Junit4 wrapper function. Makes it easier to run the tests and checks for -# dev-java/junit:4 in DEPEND. Launches the tests using junit.textui.TestRunner. -# -# @CODE -# Parameters: -# $1 - -cp or -classpath -# $2 - classpath; junit and recorded dependencies get appended -# $@ - the rest of the parameters are passed to java -# -# Examples: -# ejunit4 -cp build/classes org.blinkenlights.jid3.test.AllTests -# ejunit4 org.blinkenlights.jid3.test.AllTests -# ejunit4 org.blinkenlights.jid3.test.FirstTest \ -# org.blinkenlights.jid3.test.SecondTest -# @CODE -ejunit4() { - debug-print-function ${FUNCNAME} $* - - ejunit_ "junit-4" "${@}" -} - -# @FUNCTION: java-utils-2_src_prepare -# @DESCRIPTION: -# src_prepare Searches for bundled jars -# Don't call directly, but via java-pkg-2_src_prepare! -java-utils-2_src_prepare() { - java-pkg_func-exists java_prepare && java_prepare - - # Check for files in JAVA_RM_FILES array. - if [[ ${JAVA_RM_FILES[@]} ]]; then - debug-print "$FUNCNAME: removing unneeded files" - java-pkg_rm_files "${JAVA_RM_FILES[@]}" - fi - - if is-java-strict; then - echo "Searching for bundled jars:" - java-pkg_find-normal-jars || echo "None found." - echo "Searching for bundled classes (no output if none found):" - find "${WORKDIR}" -name "*.class" - echo "Search done." - fi -} - -# @FUNCTION: java-utils-2_pkg_preinst -# @DESCRIPTION: -# pkg_preinst Searches for missing and unneeded dependencies -# Don't call directly, but via java-pkg-2_pkg_preinst! -java-utils-2_pkg_preinst() { - if is-java-strict; then - if [[ ! -e "${JAVA_PKG_ENV}" ]] || has ant-tasks ${INHERITED}; then - return - fi - - if has_version dev-java/java-dep-check; then - local output=$(GENTOO_VM= java-dep-check --image "${D}" "${JAVA_PKG_ENV}") - [[ ${output} ]] && ewarn "${output}" - else - eerror "Install dev-java/java-dep-check for dependency checking" - fi - fi -} - -# @FUNCTION: eant -# @USAGE: <ant_build_target(s)> -# @DESCRIPTION: -# Ant wrapper function. Will use the appropriate compiler, based on user-defined -# compiler. Will also set proper ANT_TASKS from the variable ANT_TASKS, -# variables: -# -# @CODE -# Variables: -# EANT_GENTOO_CLASSPATH - calls java-pkg_getjars for the value and adds to the -# gentoo.classpath property. Be sure to call java-ant_rewrite-classpath in src_unpack. -# EANT_NEEDS_TOOLS - add tools.jar to the gentoo.classpath. Should only be used -# for build-time purposes, the dependency is not recorded to -# package.env! -# ANT_TASKS - used to determine ANT_TASKS before calling Ant. -# @CODE -eant() { - debug-print-function ${FUNCNAME} $* - - if [[ ${EBUILD_PHASE} = compile ]]; then - java-ant-2_src_configure - fi - - if ! has java-ant-2 ${INHERITED}; then - local msg="You should inherit java-ant-2 when using eant" - java-pkg_announce-qa-violation "${msg}" - fi - - local antflags="-Dnoget=true -Dmaven.mode.offline=true -Dbuild.sysclasspath=ignore" - - java-pkg_init-compiler_ - local compiler="${GENTOO_COMPILER}" - - local compiler_env="${JAVA_PKG_COMPILER_DIR}/${compiler}" - local build_compiler="$(source ${compiler_env} 1>/dev/null 2>&1; echo ${ANT_BUILD_COMPILER})" - if [[ "${compiler}" != "javac" && -z "${build_compiler}" ]]; then - die "ANT_BUILD_COMPILER undefined in ${compiler_env}" - fi - - if [[ ${compiler} != "javac" ]]; then - antflags="${antflags} -Dbuild.compiler=${build_compiler}" - # Figure out any extra stuff to put on the classpath for compilers aside - # from javac - # ANT_BUILD_COMPILER_DEPS should be something that could be passed to - # java-config -p - local build_compiler_deps="$(source ${JAVA_PKG_COMPILER_DIR}/${compiler} 1>/dev/null 2>&1; echo ${ANT_BUILD_COMPILER_DEPS})" - if [[ -n ${build_compiler_deps} ]]; then - antflags="${antflags} -lib $(java-config -p ${build_compiler_deps})" - fi - fi - - for arg in "${@}"; do - if [[ ${arg} = -lib ]]; then - if is-java-strict; then - eerror "You should not use the -lib argument to eant because it will fail" - eerror "with JAVA_PKG_STRICT. Please use for example java-pkg_jar-from" - eerror "or ant properties to make dependencies available." - eerror "For ant tasks use WANT_ANT_TASKS or ANT_TASKS from." - eerror "split ant (>=dev-java/ant-core-1.7)." - die "eant -lib is deprecated/forbidden" - else - echo "eant -lib is deprecated. Turn JAVA_PKG_STRICT on for" - echo "more info." - fi - fi - done - - # parse WANT_ANT_TASKS for atoms - local want_ant_tasks - for i in ${WANT_ANT_TASKS}; do - if [[ ${i} = */*:* ]]; then - i=${i#*/} - i=${i%:0} - want_ant_tasks+="${i/:/-} " - else - want_ant_tasks+="${i} " - fi - done - # default ANT_TASKS to WANT_ANT_TASKS, if ANT_TASKS is not set explicitly - ANT_TASKS="${ANT_TASKS:-${want_ant_tasks% }}" - - # override ANT_TASKS with JAVA_PKG_FORCE_ANT_TASKS if it's set - ANT_TASKS="${JAVA_PKG_FORCE_ANT_TASKS:-${ANT_TASKS}}" - - # if ant-tasks is not set by ebuild or forced, use none - ANT_TASKS="${ANT_TASKS:-none}" - - # at this point, ANT_TASKS should be "all", "none" or explicit list - if [[ "${ANT_TASKS}" == "all" ]]; then - einfo "Using all available ANT_TASKS" - elif [[ "${ANT_TASKS}" == "none" ]]; then - einfo "Disabling all optional ANT_TASKS" - else - einfo "Using following ANT_TASKS: ${ANT_TASKS}" - fi - - export ANT_TASKS - - [[ -n ${JAVA_PKG_DEBUG} ]] && antflags="${antflags} --execdebug -debug" - [[ -n ${PORTAGE_QUIET} ]] && antflags="${antflags} -q" - - local gcp="${EANT_GENTOO_CLASSPATH}" - local getjarsarg="" - - if [[ ${EBUILD_PHASE} = "test" ]]; then - antflags="${antflags} -DJunit.present=true" - getjarsarg="--with-dependencies" - - local re="\bant-junit4?([-:]\S+)?\b" - [[ ${ANT_TASKS} =~ ${re} ]] && gcp+=" ${BASH_REMATCH[0]}" - else - antflags="${antflags} -Dmaven.test.skip=true" - fi - - local cp - - for atom in ${gcp}; do - cp+=":$(java-pkg_getjars ${getjarsarg} ${atom})" - done - - [[ ${EANT_NEEDS_TOOLS} ]] && cp+=":$(java-config --tools)" - [[ ${EANT_GENTOO_CLASSPATH_EXTRA} ]] && cp+=":${EANT_GENTOO_CLASSPATH_EXTRA}" - - if [[ ${cp#:} ]]; then - # It seems ant does not like single quotes around ${cp} - antflags="${antflags} -Dgentoo.classpath=\"${cp#:}\"" - fi - - [[ -n ${JAVA_PKG_DEBUG} ]] && echo ant ${antflags} "${@}" - debug-print "Calling ant (GENTOO_VM: ${GENTOO_VM}): ${antflags} ${@}" - ant ${antflags} "${@}" || die "eant failed" -} - -# @FUNCTION: ejavac -# @USAGE: <javac_arguments> -# @DESCRIPTION: -# Javac wrapper function. Will use the appropriate compiler, based on -# /etc/java-config/compilers.conf -ejavac() { - debug-print-function ${FUNCNAME} $* - - local compiler_executable - compiler_executable=$(java-pkg_get-javac) - - local javac_args - javac_args="$(java-pkg_javac-args)" - - if [[ -n ${JAVA_PKG_DEBUG} ]]; then - einfo "Verbose logging for \"${FUNCNAME}\" function" - einfo "Compiler executable: ${compiler_executable}" - einfo "Extra arguments: ${javac_args}" - einfo "Complete command:" - einfo "${compiler_executable} ${javac_args} ${@}" - fi - - ebegin "Compiling" - ${compiler_executable} ${javac_args} "${@}" || die "ejavac failed" -} - -# @FUNCTION: ejavadoc -# @USAGE: <javadoc_arguments> -# @DESCRIPTION: -# javadoc wrapper function. Will set some flags based on the VM version -# due to strict javadoc rules in 1.8. -ejavadoc() { - debug-print-function ${FUNCNAME} $* - - local javadoc_args="" - - if java-pkg_is-vm-version-ge "1.8" ; then - javadoc_args="-Xdoclint:none" - fi - - if [[ -n ${JAVA_PKG_DEBUG} ]]; then - einfo "Verbose logging for \"${FUNCNAME}\" function" - einfo "Javadoc executable: javadoc" - einfo "Extra arguments: ${javadoc_args}" - einfo "Complete command:" - einfo "javadoc ${javadoc_args} ${@}" - fi - - ebegin "Generating JavaDoc" - javadoc ${javadoc_args} "${@}" || die "ejavadoc failed" -} - -# @FUNCTION: java-pkg_filter-compiler -# @USAGE: <compiler(s)_to_filter> -# @DESCRIPTION: -# Used to prevent the use of some compilers. Should be used in src_compile. -# Basically, it just appends onto JAVA_PKG_FILTER_COMPILER -java-pkg_filter-compiler() { - JAVA_PKG_FILTER_COMPILER="${JAVA_PKG_FILTER_COMPILER} $@" -} - -# @FUNCTION: java-pkg_force-compiler -# @USAGE: <compiler(s)_to_force> -# @DESCRIPTION: -# Used to force the use of particular compilers. Should be used in src_compile. -# A common use of this would be to force ecj-3.1 to be used on amd64, to avoid -# OutOfMemoryErrors that may come up. -java-pkg_force-compiler() { - JAVA_PKG_FORCE_COMPILER="$@" -} - -# @FUNCTION: use_doc -# @DESCRIPTION: -# -# Helper function for getting ant to build javadocs. If the user has USE=doc, -# then 'javadoc' or the argument are returned. Otherwise, there is no return. -# -# The output of this should be passed to ant. -# @CODE -# Parameters: -# $@ - Option value to return. Defaults to 'javadoc' -# -# Examples: -# build javadocs by calling 'javadoc' target -# eant $(use_doc) -# -# build javadocs by calling 'apidoc' target -# eant $(use_doc apidoc) -# @CODE -# @RETURN string - Name of the target to create javadocs -use_doc() { - use doc && echo ${@:-javadoc} -} - - -# @FUNCTION: java-pkg_init -# @INTERNAL -# @DESCRIPTION: -# The purpose of this function, as the name might imply, is to initialize the -# Java environment. It ensures that that there aren't any environment variables -# that'll muss things up. It initializes some variables, which are used -# internally. And most importantly, it'll switch the VM if necessary. -# -# This shouldn't be used directly. Instead, java-pkg and java-pkg-opt will -# call it during each of the phases of the merge process. -java-pkg_init() { - debug-print-function ${FUNCNAME} $* - - # Don't set up build environment if installing from binary. #206024 #258423 - [[ "${MERGE_TYPE}" == "binary" ]] && return - # Also try Portage's nonstandard EMERGE_FROM for old EAPIs, if it doesn't - # work nothing is lost. - has ${EAPI:-0} 0 1 2 3 && [[ "${EMERGE_FROM}" == "binary" ]] && return - - unset JAVAC - unset JAVA_HOME - - java-config --help >/dev/null || { - eerror "" - eerror "Can't run java-config --help" - eerror "Have you upgraded python recently but haven't" - eerror "run python-updater yet?" - die "Can't run java-config --help" - } - - # People do all kinds of weird things. - # https://forums.gentoo.org/viewtopic-p-3943166.html - local silence="${SILENCE_JAVA_OPTIONS_WARNING}" - local accept="${I_WANT_GLOBAL_JAVA_OPTIONS}" - if [[ -n ${_JAVA_OPTIONS} && -z ${accept} && -z ${silence} ]]; then - ewarn "_JAVA_OPTIONS changes what java -version outputs at least for" - ewarn "sun-jdk vms and and as such break configure scripts that" - ewarn "use it (for example app-office/openoffice) so we filter it out." - ewarn "Use SILENCE_JAVA_OPTIONS_WARNING=true in the environment (use" - ewarn "make.conf for example) to silence this warning or" - ewarn "I_WANT_GLOBAL_JAVA_OPTIONS to not filter it." - fi - - if [[ -z ${accept} ]]; then - # export _JAVA_OPTIONS= doesn't work because it will show up in java - # -version output - unset _JAVA_OPTIONS - # phase hooks make this run many times without this - I_WANT_GLOBAL_JAVA_OPTIONS="true" - fi - - if java-pkg_func-exists ant_src_unpack; then - java-pkg_announce-qa-violation "Using old ant_src_unpack. Should be src_unpack" - fi - - java-pkg_switch-vm - PATH=${JAVA_HOME}/bin:${PATH} - - # TODO we will probably want to set JAVAC and JAVACFLAGS - - # Do some QA checks - java-pkg_check-jikes - - # Can't use unset here because Portage does not save the unset - # see https://bugs.gentoo.org/show_bug.cgi?id=189417#c11 - - # When users have crazy classpaths some packages can fail to compile. - # and everything should work with empty CLASSPATH. - # This also helps prevent unexpected dependencies on random things - # from the CLASSPATH. - export CLASSPATH= - - # Unset external ANT_ stuff - export ANT_TASKS= - export ANT_OPTS= - export ANT_RESPECT_JAVA_HOME= -} - -# @FUNCTION: java-pkg-init-compiler_ -# @INTERNAL -# @DESCRIPTION: -# This function attempts to figure out what compiler should be used. It does -# this by reading the file at JAVA_PKG_COMPILERS_CONF, and checking the -# COMPILERS variable defined there. -# This can be overridden by a list in JAVA_PKG_FORCE_COMPILER -# -# It will go through the list of compilers, and verify that it supports the -# target and source that are needed. If it is not suitable, then the next -# compiler is checked. When JAVA_PKG_FORCE_COMPILER is defined, this checking -# isn't done. -# -# Once the which compiler to use has been figured out, it is set to -# GENTOO_COMPILER. -# -# If you hadn't guessed, JAVA_PKG_FORCE_COMPILER is for testing only. -# -# If the user doesn't defined anything in JAVA_PKG_COMPILERS_CONF, or no -# suitable compiler was found there, then the default is to use javac provided -# by the current VM. -# -# -# @RETURN name of the compiler to use -java-pkg_init-compiler_() { - debug-print-function ${FUNCNAME} $* - - if [[ -n ${GENTOO_COMPILER} ]]; then - debug-print "GENTOO_COMPILER already set" - return - fi - - local compilers; - if [[ -z ${JAVA_PKG_FORCE_COMPILER} ]]; then - compilers="$(source ${JAVA_PKG_COMPILERS_CONF} 1>/dev/null 2>&1; echo ${COMPILERS})" - else - compilers=${JAVA_PKG_FORCE_COMPILER} - fi - - debug-print "Read \"${compilers}\" from ${JAVA_PKG_COMPILERS_CONF}" - - # Figure out if we should announce what compiler we're using - local compiler - for compiler in ${compilers}; do - debug-print "Checking ${compiler}..." - # javac should always be alright - if [[ ${compiler} = "javac" ]]; then - debug-print "Found javac... breaking" - export GENTOO_COMPILER="javac" - break - fi - - if has ${compiler} ${JAVA_PKG_FILTER_COMPILER}; then - if [[ -z ${JAVA_PKG_FORCE_COMPILER} ]]; then - einfo "Filtering ${compiler}" >&2 - continue - fi - fi - - # for non-javac, we need to make sure it supports the right target and - # source - local compiler_env="${JAVA_PKG_COMPILER_DIR}/${compiler}" - if [[ -f ${compiler_env} ]]; then - local desired_target="$(java-pkg_get-target)" - local desired_source="$(java-pkg_get-source)" - - - # Verify that the compiler supports target - local supported_target=$(source ${compiler_env} 1>/dev/null 2>&1; echo ${SUPPORTED_TARGET}) - if ! has ${desired_target} ${supported_target}; then - ewarn "${compiler} does not support -target ${desired_target}, skipping" - continue - fi - - # Verify that the compiler supports source - local supported_source=$(source ${compiler_env} 1>/dev/null 2>&1; echo ${SUPPORTED_SOURCE}) - if ! has ${desired_source} ${supported_source}; then - ewarn "${compiler} does not support -source ${desired_source}, skipping" - continue - fi - - # if you get here, then the compiler should be good to go - export GENTOO_COMPILER="${compiler}" - break - else - ewarn "Could not find configuration for ${compiler}, skipping" - ewarn "Perhaps it is not installed?" - continue - fi - done - - # If it hasn't been defined already, default to javac - if [[ -z ${GENTOO_COMPILER} ]]; then - if [[ -n ${compilers} ]]; then - einfo "No suitable compiler found: defaulting to JDK default for compilation" >&2 - else - # probably don't need to notify users about the default. - :;#einfo "Defaulting to javac for compilation" >&2 - fi - if java-config -g GENTOO_COMPILER 2> /dev/null; then - export GENTOO_COMPILER=$(java-config -g GENTOO_COMPILER) - else - export GENTOO_COMPILER=javac - fi - else - einfo "Using ${GENTOO_COMPILER} for compilation" >&2 - fi - -} - -# @FUNCTION: init_paths_ -# @INTERNAL -# @DESCRIPTION: -# Initializes some variables that will be used. These variables are mostly used -# to determine where things will eventually get installed. -java-pkg_init_paths_() { - debug-print-function ${FUNCNAME} $* - - local pkg_name - if [[ "${SLOT%/*}" == "0" ]] ; then - JAVA_PKG_NAME="${PN}" - else - JAVA_PKG_NAME="${PN}-${SLOT%/*}" - fi - - JAVA_PKG_SHAREPATH="/usr/share/${JAVA_PKG_NAME}" - JAVA_PKG_SOURCESPATH="${JAVA_PKG_SHAREPATH}/sources/" - JAVA_PKG_ENV="${ED}${JAVA_PKG_SHAREPATH}/package.env" - JAVA_PKG_VIRTUALS_PATH="/usr/share/java-config-2/virtuals" - JAVA_PKG_VIRTUAL_PROVIDER="${ED}${JAVA_PKG_VIRTUALS_PATH}/${JAVA_PKG_NAME}" - - [[ -z "${JAVA_PKG_JARDEST}" ]] && JAVA_PKG_JARDEST="${JAVA_PKG_SHAREPATH}/lib" - [[ -z "${JAVA_PKG_LIBDEST}" ]] && JAVA_PKG_LIBDEST="/usr/$(get_libdir)/${JAVA_PKG_NAME}" - [[ -z "${JAVA_PKG_WARDEST}" ]] && JAVA_PKG_WARDEST="${JAVA_PKG_SHAREPATH}/webapps" - - # TODO maybe only print once? - debug-print "JAVA_PKG_SHAREPATH: ${JAVA_PKG_SHAREPATH}" - debug-print "JAVA_PKG_ENV: ${JAVA_PKG_ENV}" - debug-print "JAVA_PKG_JARDEST: ${JAVA_PKG_JARDEST}" - debug-print "JAVA_PKG_LIBDEST: ${JAVA_PKG_LIBDEST}" - debug-print "JAVA_PKG_WARDEST: ${JAVA_PKG_WARDEST}" -} - -# @FUNCTION: java-pkg_do_write_ -# @INTERNAL -# @DESCRIPTION: -# Writes the package.env out to disk. -# -# TODO change to do-write, to match everything else -java-pkg_do_write_() { - debug-print-function ${FUNCNAME} $* - java-pkg_init_paths_ - # Create directory for package.env - dodir "${JAVA_PKG_SHAREPATH}" - - # Create package.env - ( - echo "DESCRIPTION=\"${DESCRIPTION}\"" - echo "GENERATION=\"2\"" - echo "SLOT=\"${SLOT}\"" - echo "CATEGORY=\"${CATEGORY}\"" - echo "PVR=\"${PVR}\"" - - [[ -n "${JAVA_PKG_CLASSPATH}" ]] && echo "CLASSPATH=\"${JAVA_PKG_CLASSPATH}\"" - [[ -n "${JAVA_PKG_LIBRARY}" ]] && echo "LIBRARY_PATH=\"${JAVA_PKG_LIBRARY}\"" - [[ -n "${JAVA_PROVIDE}" ]] && echo "PROVIDES=\"${JAVA_PROVIDE}\"" - [[ -f "${JAVA_PKG_DEPEND_FILE}" ]] \ - && echo "DEPEND=\"$(sort -u "${JAVA_PKG_DEPEND_FILE}" | tr '\n' ':')\"" - [[ -f "${JAVA_PKG_OPTIONAL_DEPEND_FILE}" ]] \ - && echo "OPTIONAL_DEPEND=\"$(sort -u "${JAVA_PKG_OPTIONAL_DEPEND_FILE}" | tr '\n' ':')\"" - echo "VM=\"$(echo ${RDEPEND} ${DEPEND} | sed -e 's/ /\n/g' | sed -n -e '/virtual\/\(jre\|jdk\)/ { p;q }')\"" # TODO cleanup ! - [[ -f "${JAVA_PKG_BUILD_DEPEND_FILE}" ]] \ - && echo "BUILD_DEPEND=\"$(sort -u "${JAVA_PKG_BUILD_DEPEND_FILE}" | tr '\n' ':')\"" - ) > "${JAVA_PKG_ENV}" - - # register target/source - local target="$(java-pkg_get-target)" - local source="$(java-pkg_get-source)" - [[ -n ${target} ]] && echo "TARGET=\"${target}\"" >> "${JAVA_PKG_ENV}" - [[ -n ${source} ]] && echo "SOURCE=\"${source}\"" >> "${JAVA_PKG_ENV}" - - # register javadoc info - [[ -n ${JAVADOC_PATH} ]] && echo "JAVADOC_PATH=\"${JAVADOC_PATH}\"" \ - >> ${JAVA_PKG_ENV} - # register source archives - [[ -n ${JAVA_SOURCES} ]] && echo "JAVA_SOURCES=\"${JAVA_SOURCES}\"" \ - >> ${JAVA_PKG_ENV} - - echo "MERGE_VM=\"${GENTOO_VM}\"" >> "${JAVA_PKG_ENV}" - [[ -n ${GENTOO_COMPILER} ]] && echo "MERGE_COMPILER=\"${GENTOO_COMPILER}\"" >> "${JAVA_PKG_ENV}" - - # extra env variables - if [[ -n "${JAVA_PKG_EXTRA_ENV_VARS}" ]]; then - cat "${JAVA_PKG_EXTRA_ENV}" >> "${JAVA_PKG_ENV}" || die - # nested echo to remove leading/trailing spaces - echo "ENV_VARS=\"$(echo ${JAVA_PKG_EXTRA_ENV_VARS})\"" \ - >> "${JAVA_PKG_ENV}" || die - fi - - # Strip unnecessary leading and trailing colons - # TODO try to cleanup if possible - sed -e "s/=\":/=\"/" -e "s/:\"$/\"/" -i "${JAVA_PKG_ENV}" || die "Did you forget to call java_init ?" -} - -# @FUNCTION: java-pkg_record-jar_ -# @INTERNAL -# @DESCRIPTION: -# Record an (optional) dependency to the package.env -# @CODE -# Parameters: -# --optional - record dependency as optional -# --build - record dependency as build_only -# $1 - package to record -# $2 - (optional) jar of package to record -# @CODE -JAVA_PKG_DEPEND_FILE="${T}/java-pkg-depend" -JAVA_PKG_OPTIONAL_DEPEND_FILE="${T}/java-pkg-optional-depend" -JAVA_PKG_BUILD_DEPEND_FILE="${T}/java-pkg-build-depend" - -java-pkg_record-jar_() { - debug-print-function ${FUNCNAME} $* - - local depend_file="${JAVA_PKG_DEPEND_FILE}" - case "${1}" in - "--optional") depend_file="${JAVA_PKG_OPTIONAL_DEPEND_FILE}"; shift;; - "--build-only") depend_file="${JAVA_PKG_BUILD_DEPEND_FILE}"; shift;; - esac - - local pkg=${1} jar=${2} append - if [[ -z "${jar}" ]]; then - append="${pkg}" - else - append="$(basename ${jar})@${pkg}" - fi - - echo "${append}" >> "${depend_file}" -} - -# @FUNCTION: java-pkg_append_ -# @INTERNAL -# @DESCRIPTION: -# Appends a value to a variable -# -# @CODE -# Parameters: -# $1 variable name to modify -# $2 value to append -# -# Examples: -# java-pkg_append_ CLASSPATH foo.jar -# @CODE -java-pkg_append_() { - debug-print-function ${FUNCNAME} $* - - local var="${1}" value="${2}" - if [[ -z "${!var}" ]] ; then - export ${var}="${value}" - else - local oldIFS=${IFS} cur haveit - IFS=':' - for cur in ${!var}; do - if [[ ${cur} == ${value} ]]; then - haveit="yes" - break - fi - done - [[ -z ${haveit} ]] && export ${var}="${!var}:${value}" - IFS=${oldIFS} - fi -} - -# @FUNCTION: java-pkg_expand_dir_ -# @INTERNAL -# @DESCRIPTION: -# Gets the full path of the file/directory's parent. -# @CODE -# Parameters: -# $1 - file/directory to find parent directory for -# @CODE -# @RETURN: path to $1's parent directory -java-pkg_expand_dir_() { - pushd "$(dirname "${1}")" >/dev/null 2>&1 || die - pwd - popd >/dev/null 2>&1 || die -} - -# @FUNCTION: java-pkg_func-exists -# @INTERNAL -# @DESCRIPTION: -# Does the indicated function exist? -# @RETURN: 0 - function is declared, 1 - function is undeclared -java-pkg_func-exists() { - declare -F ${1} > /dev/null -} - -# @FUNCTION: java-pkg_setup-vm -# @INTERNAL -# @DESCRIPTION: -# Sets up the environment for a specific VM -java-pkg_setup-vm() { - debug-print-function ${FUNCNAME} $* - - local vendor="$(java-pkg_get-vm-vendor)" - if [[ "${vendor}" == "sun" ]] && java-pkg_is-vm-version-ge "1.5" ; then - addpredict "/dev/random" - elif [[ "${vendor}" == "ibm" ]]; then - addpredict "/proc/self/maps" - addpredict "/proc/cpuinfo" - addpredict "/proc/self/coredump_filter" - elif [[ "${vendor}" == "oracle" ]]; then - addpredict "/dev/random" - addpredict "/proc/self/coredump_filter" - elif [[ "${vendor}" == icedtea* ]] && java-pkg_is-vm-version-ge "1.7" ; then - addpredict "/dev/random" - addpredict "/proc/self/coredump_filter" - elif [[ "${vendor}" == "jrockit" ]]; then - addpredict "/proc/cpuinfo" - fi -} - -# @FUNCTION: java-pkg_needs-vm -# @INTERNAL -# @DESCRIPTION: -# Does the current package depend on virtual/jdk or does it set -# JAVA_PKG_WANT_BUILD_VM? -# -# @RETURN: 0 - Package depends on virtual/jdk; 1 - Package does not depend on virtual/jdk -java-pkg_needs-vm() { - debug-print-function ${FUNCNAME} $* - - if [[ -n "$(echo ${JAVA_PKG_NV_DEPEND:-${DEPEND}} | sed -e '\:virtual/jdk:!d')" ]]; then - return 0 - fi - - [[ -n "${JAVA_PKG_WANT_BUILD_VM}" ]] && return 0 - - return 1 -} - -# @FUNCTION: java-pkg_get-current-vm -# @INTERNAL -# @RETURN - The current VM being used -java-pkg_get-current-vm() { - java-config -f -} - -# @FUNCTION: java-pkg_get-vm-vendor -# @INTERNAL -# @RETURN - The vendor of the current VM -java-pkg_get-vm-vendor() { - debug-print-function ${FUNCNAME} $* - - local vm="$(java-pkg_get-current-vm)" - vm="${vm/-*/}" - echo "${vm}" -} - -# @FUNCTION: java-pkg_get-vm-version -# @INTERNAL -# @RETURN - The version of the current VM -java-pkg_get-vm-version() { - debug-print-function ${FUNCNAME} $* - - java-config -g PROVIDES_VERSION -} - -# @FUNCTION: java-pkg_build-vm-from-handle -# @INTERNAL -# @DESCRIPTION: -# Selects a build vm from a list of vm handles. First checks for the system-vm -# beeing usable, then steps through the listed handles till a suitable vm is -# found. -# -# @RETURN - VM handle of an available JDK -java-pkg_build-vm-from-handle() { - debug-print-function ${FUNCNAME} "$*" - - local vm - vm=$(java-pkg_get-current-vm 2>/dev/null) - if [[ $? -eq 0 ]]; then - if has ${vm} ${JAVA_PKG_WANT_BUILD_VM}; then - echo ${vm} - return 0 - fi - fi - - for vm in ${JAVA_PKG_WANT_BUILD_VM}; do - if java-config-2 --select-vm=${vm} 2>/dev/null; then - echo ${vm} - return 0 - fi - done - - eerror "${FUNCNAME}: No vm found for handles: ${JAVA_PKG_WANT_BUILD_VM}" - return 1 -} - -# @FUNCTION: java-pkg_switch-vm -# @INTERNAL -# @DESCRIPTION: -# Switch VM if we're allowed to (controlled by JAVA_PKG_ALLOW_VM_CHANGE), and -# verify that the current VM is sufficient. -# Setup the environment for the VM being used. -java-pkg_switch-vm() { - debug-print-function ${FUNCNAME} $* - - if java-pkg_needs-vm; then - # Use the VM specified by JAVA_PKG_FORCE_VM - if [[ -n "${JAVA_PKG_FORCE_VM}" ]]; then - # If you're forcing the VM, I hope you know what your doing... - debug-print "JAVA_PKG_FORCE_VM used: ${JAVA_PKG_FORCE_VM}" - export GENTOO_VM="${JAVA_PKG_FORCE_VM}" - # if we're allowed to switch the vm... - elif [[ "${JAVA_PKG_ALLOW_VM_CHANGE}" == "yes" ]]; then - # if there is an explicit list of handles to choose from - if [[ -n "${JAVA_PKG_WANT_BUILD_VM}" ]]; then - debug-print "JAVA_PKG_WANT_BUILD_VM used: ${JAVA_PKG_WANT_BUILD_VM}" - GENTOO_VM=$(java-pkg_build-vm-from-handle) - if [[ $? != 0 ]]; then - eerror "${FUNCNAME}: No VM found for handles: ${JAVA_PKG_WANT_BUILD_VM}" - die "${FUNCNAME}: Failed to determine VM for building" - fi - # JAVA_PKG_WANT_SOURCE and JAVA_PKG_WANT_TARGET are required as - # they can't be deduced from handles. - if [[ -z "${JAVA_PKG_WANT_SOURCE}" ]]; then - eerror "JAVA_PKG_WANT_BUILD_VM specified but not JAVA_PKG_WANT_SOURCE" - die "Specify JAVA_PKG_WANT_SOURCE" - fi - if [[ -z "${JAVA_PKG_WANT_TARGET}" ]]; then - eerror "JAVA_PKG_WANT_BUILD_VM specified but not JAVA_PKG_WANT_TARGET" - die "Specify JAVA_PKG_WANT_TARGET" - fi - # otherwise determine a vm from dep string - else - debug-print "depend-java-query: NV_DEPEND: ${JAVA_PKG_NV_DEPEND:-${DEPEND}}" - GENTOO_VM="$(depend-java-query --get-vm "${JAVA_PKG_NV_DEPEND:-${DEPEND}}")" - if [[ -z "${GENTOO_VM}" || "${GENTOO_VM}" == "None" ]]; then - eerror "Unable to determine VM for building from dependencies:" - echo "NV_DEPEND: ${JAVA_PKG_NV_DEPEND:-${DEPEND}}" - die "Failed to determine VM for building." - fi - fi - export GENTOO_VM - # otherwise just make sure the current VM is sufficient - else - java-pkg_ensure-vm-version-sufficient - fi - debug-print "Using: $(java-config -f)" - - java-pkg_setup-vm - - export JAVA=$(java-config --java) - export JAVAC=$(java-config --javac) - JAVACFLAGS="$(java-pkg_javac-args)" - [[ -n ${JAVACFLAGS_EXTRA} ]] && JAVACFLAGS="${JAVACFLAGS_EXTRA} ${JAVACFLAGS}" - export JAVACFLAGS - - export JAVA_HOME="$(java-config -g JAVA_HOME)" - export JDK_HOME=${JAVA_HOME} - - #TODO If you know a better solution let us know. - java-pkg_append_ LD_LIBRARY_PATH "$(java-config -g LDPATH)" - - local tann="${T}/announced-vm" - # With the hooks we should only get here once from pkg_setup but better safe than sorry - # if people have for example modified eclasses some where - if [[ -n "${JAVA_PKG_DEBUG}" ]] || [[ ! -f "${tann}" ]] ; then - einfo "Using: $(java-config -f)" - [[ ! -f "${tann}" ]] && touch "${tann}" - fi - - else - [[ -n "${JAVA_PKG_DEBUG}" ]] && ewarn "!!! This package inherits java-pkg but doesn't depend on a JDK. -bin or broken dependency!!!" - fi -} - -# @FUNCTION: java-pkg_die -# @INTERNAL -# @DESCRIPTION: -# Enhanced die for Java packages, which displays some information that may be -# useful for debugging bugs on bugzilla. -#register_die_hook java-pkg_die -if ! has java-pkg_die ${EBUILD_DEATH_HOOKS}; then - EBUILD_DEATH_HOOKS="${EBUILD_DEATH_HOOKS} java-pkg_die" -fi - -java-pkg_die() { - echo "!!! When you file a bug report, please include the following information:" >&2 - echo "GENTOO_VM=${GENTOO_VM} CLASSPATH=\"${CLASSPATH}\" JAVA_HOME=\"${JAVA_HOME}\"" >&2 - echo "JAVACFLAGS=\"${JAVACFLAGS}\" COMPILER=\"${GENTOO_COMPILER}\"" >&2 - echo "and of course, the output of emerge --info =${P}" >&2 -} - - -# TODO document -# List jars in the source directory, ${S} -java-pkg_jar-list() { - if [[ -n "${JAVA_PKG_DEBUG}" ]]; then - einfo "Linked Jars" - find "${S}" -type l -name '*.jar' -print0 | xargs -0 -r -n 500 ls -ald | sed -e "s,${WORKDIR},\${WORKDIR}," - einfo "Jars" - find "${S}" -type f -name '*.jar' -print0 | xargs -0 -r -n 500 ls -ald | sed -e "s,${WORKDIR},\${WORKDIR}," - einfo "Classes" - find "${S}" -type f -name '*.class' -print0 | xargs -0 -r -n 500 ls -ald | sed -e "s,${WORKDIR},\${WORKDIR}," - fi -} - -# @FUNCTION: java-pkg_verify-classes -# @INTERNAL -# @DESCRIPTION: -# Verify that the classes were compiled for the right source / target. Dies if -# not. -# @CODE -# $1 (optional) - the file to check, otherwise checks whole ${D} -# @CODE -java-pkg_verify-classes() { - #$(find ${ED} -type f -name '*.jar' -o -name '*.class') - - local version_verify="/usr/bin/class-version-verify.py" - - if [[ ! -x "${version_verify}" ]]; then - version_verify="/usr/$(get_libdir)/javatoolkit/bin/class-version-verify.py" - fi - - if [[ ! -x "${version_verify}" ]]; then - ewarn "Unable to perform class version checks as" - ewarn "class-version-verify.py is unavailable" - ewarn "Please install dev-java/javatoolkit." - return - fi - - local target=$(java-pkg_get-target) - local result - local log="${T}/class-version-verify.log" - if [[ -n "${1}" ]]; then - ${version_verify} -v -t ${target} "${1}" > "${log}" - result=$? - else - ebegin "Verifying java class versions (target: ${target})" - ${version_verify} -v -t ${target} -r "${ED}" > "${log}" - result=$? - eend ${result} - fi - [[ -n ${JAVA_PKG_DEBUG} ]] && cat "${log}" - if [[ ${result} != 0 ]]; then - eerror "Incorrect bytecode version found" - [[ -n "${1}" ]] && eerror "in file: ${1}" - eerror "See ${log} for more details." - die "Incorrect bytecode found" - fi -} - -# @FUNCTION: java-pkg_ensure-dep -# @INTERNAL -# @DESCRIPTION: -# Check that a package being used in jarfrom, getjars and getjar is contained -# within DEPEND or RDEPEND with the correct SLOT. See this mail for details: -# https://archives.gentoo.org/gentoo-dev/message/dcb644f89520f4bbb61cc7bbe45fdf6e -# @CODE -# Parameters: -# $1 - empty - check both vars; "runtime" or "build" - check only -# RDEPEND, resp. DEPEND -# $2 - Package name and slot. -# @CODE -java-pkg_ensure-dep() { - debug-print-function ${FUNCNAME} $* - - local limit_to="${1}" - local target_pkg="${2}" - local dev_error="" - - # Transform into a regular expression to look for a matching package - # and SLOT. SLOTs don't have to be numeric so foo-bar could either - # mean foo-bar:0 or foo:bar. So you want to get your head around the - # line below? - # - # * The target package first has any dots escaped, e.g. foo-1.2 - # becomes foo-1\.2. - # - # * sed then looks at the component following the last - or : - # character, or the whole string if there is no - or : - # character. It uses this to build a new regexp with two - # significant branches. - # - # * The first checks for the whole target package string, optionally - # followed by a version number, and then :0. - # - # * The second checks for the first part of the target package - # string, optionally followed by a version number, followed by the - # aforementioned component, treating that as a SLOT. - # - local stripped_pkg=/$(sed -r 's/[-:]?([^-:]+)$/(\0(-[^:]+)?:0|(-[^:]+)?:\1)/' <<< "${target_pkg//./\\.}")\\b - - debug-print "Matching against: ${stripped_pkg}" - - # Uncomment the lines below once we've dealt with more of these - # otherwise we'll be tempted to turn JAVA_PKG_STRICT off while - # getting hit with a wave of bug reports. :( - - if [[ ${limit_to} != runtime && ! ( "${DEPEND}" =~ $stripped_pkg ) ]]; then - dev_error="The ebuild is attempting to use ${target_pkg}, which is not " - dev_error+="declared with a SLOT in DEPEND." -# if is-java-strict; then -# die "${dev_error}" -# else - eqawarn "java-pkg_ensure-dep: ${dev_error}" -# eerror "Because you have ${target_pkg} installed," -# eerror "the package will build without problems, but please" -# eerror "report this to https://bugs.gentoo.org." -# fi - elif [[ ${limit_to} != build && ! ( "${RDEPEND}${PDEPEND}" =~ ${stripped_pkg} ) ]]; then - dev_error="The ebuild is attempting to use ${target_pkg}, which is not " - dev_error+="declared with a SLOT in [RP]DEPEND and --build-only wasn't given." -# if is-java-strict; then -# die "${dev_error}" -# else - eqawarn "java-pkg_ensure-dep: ${dev_error}" -# eerror "The package will build without problems, but may fail to run" -# eerror "if you don't have ${target_pkg} installed," -# eerror "so please report this to https://bugs.gentoo.org." -# fi - fi -} - -java-pkg_check-phase() { - local phase=${1} - local funcname=${FUNCNAME[1]} - if [[ ${EBUILD_PHASE} != ${phase} ]]; then - local msg="${funcname} used outside of src_${phase}" - java-pkg_announce-qa-violation "${msg}" - fi -} - -java-pkg_check-versioned-jar() { - local jar=${1} - - if [[ ${jar} =~ ${PV} ]]; then - java-pkg_announce-qa-violation "installing versioned jar '${jar}'" - fi -} - -java-pkg_check-jikes() { - if has jikes ${IUSE}; then - java-pkg_announce-qa-violation "deprecated USE flag 'jikes' in IUSE" - fi -} - -java-pkg_announce-qa-violation() { - local nodie - if [[ ${1} == "--nodie" ]]; then - nodie="true" - shift - fi - echo "Java QA Notice: $@" >&2 - increment-qa-violations - [[ -z "${nodie}" ]] && is-java-strict && die "${@}" -} - -increment-qa-violations() { - let "JAVA_PKG_QA_VIOLATIONS+=1" - export JAVA_PKG_QA_VIOLATIONS -} - -is-java-strict() { - [[ -n ${JAVA_PKG_STRICT} ]] - return $? -} - -# @FUNCTION: java-pkg_clean -# @DESCRIPTION: -# Java package cleaner function. This will remove all *.class and *.jar -# files, removing any bundled dependencies. -java-pkg_clean() { - if [[ -z "${JAVA_PKG_NO_CLEAN}" ]]; then - find "${@}" '(' -name '*.class' -o -name '*.jar' ')' -type f -delete -print || die - fi -}