* [gentoo-dev] [PATCH v2 1/4] java-pkg-simple.eclass: support Multi-Release JAR Files (JEP 238)
@ 2025-03-17 21:59 Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 2/4] dev-java/asm-jdk-bridge: new package, add 0.0.2 Volkmar W. Pogatzki
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Volkmar W. Pogatzki @ 2025-03-17 21:59 UTC (permalink / raw
To: gentoo-dev
See https://openjdk.org/jeps/238
This commit adds basic support for building multi-release jar files.
A multi-release jar file has release-specific classes in directories
under META-INF/versions/ and its MANIFEST.MF contains a line with
'Multi-Release: true'.
The probably most common case of a multi-release jar file has only one
single such class which is 'META-INF/versions/9/module-info.class'.
To do so, we add JAVA_RELEASE_SRC_DIRS as a new eclass variable which
is also used as the condition to trigger the new functionality. A new
local variable 'multi_release' is added to the packaging section (the
part using the 'jar -create' command). Only when JAVA_RELEASE_SRC_DIRS
is set, additional actions take place:
- Compilation (those are the parts with 'ejavac') will additionally loop
over the release-specific directories listed in JAVA_RELEASE_SRC_DIRS
and compile the release-specific classes into corresponding directories
under target/versions/.
- Packaging (the part using the 'jar -create' command) will add the
details to the 'multi_release' variable so that the release-specific
directories under target/versions/ can be packaged into the jar file.
This commit also adds funtionality to generate 'module-info.java' files.
It is useful for packages where module-info.java is not provided in the
sources but needs to be generated by the build system. We use the built-in
jdeps function with the --generate-module-info option which became available
with Java 11.
It generates the module-info.java file based on an intermediate jar file
and places it in the "${JAVA_MODULE_INFO_OUT}/${JAVA_INTERMEDIATE_JAR_NAME}/"
directory.
For this purpose we add three new eclass variables:
- JAVA_INTERMEDIATE_JAR_NAME
- JAVA_MODULE_INFO_OUT
- JAVA_MODULE_INFO_RELEASE
When both JAVA_MODULE_INFO_OUT and JAVA_INTERMEDIATE_JAR_NAME are defined in the
ebuild we
- compile the sources still without module-info
- package them as an intermediate {JAVA_INTERMEDIATE_JAR_NAME}.jar
- let java-pkg-simple_generate-module-info generate the module-info
- compile module-info.java with the --patch-module option
- package the final jar file including the module-info.class
When the JAVA_MODULE_INFO_RELEASE variable is set, module-info.java is
generated into a release specific directory
"${JAVA_MODULE_INFO_OUT}/${JAVA_INTERMEDIATE_JAR_NAME}/versions/{JAVA_MODULE_INFO_RELEASE}".
Bug: https://bugs.gentoo.org/900433
Signed-off-by: Volkmar W. Pogatzki <gentoo@pogatzki.net>
---
eclass/java-pkg-simple.eclass | 269 +++++++++++++++++++++++++++++++++-
1 file changed, 264 insertions(+), 5 deletions(-)
diff --git a/eclass/java-pkg-simple.eclass b/eclass/java-pkg-simple.eclass
index ce4a62f048da..84384116af99 100644
--- a/eclass/java-pkg-simple.eclass
+++ b/eclass/java-pkg-simple.eclass
@@ -1,4 +1,4 @@
-# Copyright 2004-2024 Gentoo Authors
+# Copyright 2004-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: java-pkg-simple.eclass
@@ -11,7 +11,9 @@
# @DESCRIPTION:
# This class is intended to build pure Java packages from Java sources
# without the use of any build instructions shipped with the sources.
-# There is no support for generating source files, or for controlling
+# It can generate module-info.java files and supports adding the Main-Class
+# and the Automatic-Module-Name attributes to MANIFEST.MF. There is no
+# further support for generating source files, or for controlling
# the META-INF of the resulting jar, although these issues may be
# addressed by an ebuild by putting corresponding files into the target
# directory before calling the src_compile function of this eclass.
@@ -111,7 +113,6 @@ fi
# )
# @CODE
-# @DESCRIPTION:
# @ECLASS_VARIABLE: JAVA_RESOURCE_DIRS
# @DEFAULT_UNSET
# @DESCRIPTION:
@@ -225,6 +226,50 @@ fi
# @DESCRIPTION:
# It is almost equivalent to ${JAVA_RESOURCE_DIRS} in src_test.
+# @ECLASS_VARIABLE: JAVA_INTERMEDIATE_JAR_NAME
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Name of the intermediate jar file excluding the '.jar' suffix and also name of the
+# ejavac output directory which are needed by 'jdeps --generate-module-info'.
+# @CODE
+# Examples:
+# JAVA_INTERMEDIATE_JAR_NAME="org.apache.${PN/-/.}"
+# JAVA_INTERMEDIATE_JAR_NAME="com.github.marschall.memoryfilesystem"
+# @CODE
+
+# @ECLASS_VARIABLE: JAVA_MODULE_INFO_OUT
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Used by java-pkg-simple_generate-module-info.
+# It is the directory where module-info.java will be created.
+# Only when this variable is set, module-info.java will be created.
+# @CODE
+# Example:
+# JAVA_MODULE_INFO_OUT="src/main"
+# @CODE
+
+# @ECLASS_VARIABLE: JAVA_MODULE_INFO_RELEASE
+# @DESCRIPTION:
+# Used by java-pkg-simple_generate-module-info.
+# Correlates to JAVA_RELEASE_SRC_DIRS.
+# When this variable is set, module-info.java will be placed in
+# ${JAVA_MODULE_INFO_OUT}/${JAVA_INTERMEDIATE_JAR_NAME}/versions/${JAVA_MODULE_INFO_RELEASE}
+
+# @ECLASS_VARIABLE: JAVA_RELEASE_SRC_DIRS
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# An associative array of directories with release-specific sources which are
+# used for building multi-release jar files.
+# @CODE
+# Example:
+# JAVA_RELEASE_SRC_DIRS=(
+# ["9"]="prov/src/main/jdk1.9"
+# ["11"]="prov/src/main/jdk1.11"
+# ["15"]="prov/src/main/jdk1.15"
+# ["21"]="prov/src/main/jdk21"
+# )
+# @CODE
+
# @FUNCTION: java-pkg-simple_getclasspath
# @USAGE: java-pkg-simple_getclasspath
# @INTERNAL
@@ -276,6 +321,88 @@ java-pkg-simple_getclasspath() {
debug-print "CLASSPATH=${classpath}"
}
+# @FUNCTION: java-pkg-simple_getmodulepath
+# @USAGE: java-pkg-simple_getmodulepath
+# @INTERNAL
+# @DESCRIPTION:
+# Cloned from java-pkg-simple_getclasspath, dropped 'deep_jars'
+# and replaced s/classpath/modulepath/g.
+#
+# It is needed for java-pkg-simple_generate-module-info where using classpath
+# would cause problems with '--with-dependencies'.
+# And it is also used for compilation.
+#
+# Note that the variable "modulepath" needs to be defined before
+# calling this function.
+java-pkg-simple_getmodulepath() {
+ debug-print-function ${FUNCNAME} $*
+
+ local dependency
+ local buildonly_jars="--build-only"
+
+ # the extra classes that are not installed by portage
+ modulepath+=":${JAVA_GENTOO_CLASSPATH_EXTRA}"
+
+ # the extra classes that are installed by portage
+ for dependency in ${JAVA_CLASSPATH_EXTRA}; do
+ modulepath="${modulepath}:$(java-pkg_getjars ${buildonly_jars} \
+ ${dependency})"
+ done
+
+ # add test dependencies if USE FLAG 'test' is set
+ if has test ${JAVA_PKG_IUSE} && use test; then
+ for dependency in ${JAVA_TEST_GENTOO_CLASSPATH}; do
+ modulepath="${modulepath}:$(java-pkg_getjars ${buildonly_jars} \
+ ${dependency})"
+ done
+ fi
+
+ # add the RUNTIME dependencies
+ for dependency in ${JAVA_GENTOO_CLASSPATH}; do
+ modulepath="${modulepath}:$(java-pkg_getjars ${dependency})"
+ done
+
+ # purify modulepath
+ while [[ $modulepath = *::* ]]; do modulepath="${modulepath//::/:}"; done
+ modulepath=${modulepath%:}
+ modulepath=${modulepath#:}
+
+ debug-print "modulepath=${modulepath}"
+}
+
+# @FUNCTION: java-pkg-simple_generate-module-info
+# @USAGE: java-pkg-simple_generate-module-info
+# @INTERNAL
+# @DESCRIPTION:
+# Calls jdeps --generate-module-info which generates module-info.java.
+# Requires an intermediate jar file to be named as "${JAVA_INTERMEDIATE_JAR_NAME}.jar".
+java-pkg-simple_generate-module-info() {
+ debug-print-function ${FUNCNAME} $*
+
+ local modulepath="" jdeps_args=""
+ java-pkg-simple_getmodulepath
+
+ # Default to release 9 in order to avoid having to set it in the ebuild.
+ : "${JAVA_MODULE_INFO_RELEASE:=9}"
+
+ if [[ ${JAVA_MODULE_INFO_RELEASE} ]]; then
+ jdeps_args="${jdeps_args} --multi-release ${JAVA_MODULE_INFO_RELEASE}"
+ fi
+
+ if [[ ${modulepath} ]]; then
+ jdeps_args="${jdeps_args} --module-path ${modulepath}"
+ jdeps_args="${jdeps_args} --add-modules=ALL-MODULE-PATH"
+ fi
+ debug-print "jdeps_args is ${jdeps_args}"
+
+ jdeps \
+ --generate-module-info "${JAVA_MODULE_INFO_OUT}" \
+ ${jdeps_args} \
+ "${JAVA_INTERMEDIATE_JAR_NAME}.jar" || die
+
+ moduleinfo=$(find -type f -name module-info.java)
+}
+
# @FUNCTION: java-pkg-simple_test_with_pkgdiff_
# @INTERNAL
# @DESCRIPTION:
@@ -374,6 +501,117 @@ java-pkg-simple_src_compile() {
java-pkg_gen-cp JAVA_GENTOO_CLASSPATH
fi
+ # generate module-info.java only if JAVA_MODULE_INFO_OUT is defined in the ebuild
+ if [[ ${JAVA_MODULE_INFO_OUT} && ${JAVA_INTERMEDIATE_JAR_NAME} ]]; then
+
+ local jdk="$(depend-java-query --get-lowest "${DEPEND}")"
+ if [[ "${jdk#1.}" -lt 9 ]]; then
+ die "Wrong DEPEND, needs at least virtual/jdk-9"
+ fi
+
+ local classpath=""
+ java-pkg-simple_getclasspath
+
+ # gather sources and compile classes for the intermediate jar file
+ find "${JAVA_SRC_DIR[@]}" -name \*.java ! -name module-info.java > ${sources}
+ ejavac -d ${classes} -encoding ${JAVA_ENCODING}\
+ ${classpath:+-classpath ${classpath}} ${JAVAC_ARGS} @${sources}
+
+ java-pkg-simple_prepend_resources ${classes} "${JAVA_RESOURCE_DIRS[@]}"
+
+ # package the intermediate jar file
+ # The intermediate jar file is a precondition for jdeps to generate
+ # a module-info.java file.
+ jar cvf "${JAVA_INTERMEDIATE_JAR_NAME}.jar" \
+ -C target/classes . || die
+
+ # now, generate module-info.java
+ java-pkg-simple_generate-module-info
+ debug-print "generated moduleinfo is ${moduleinfo}"
+
+ # If JAVA_RELEASE_SRC_DIRS was not set in the ebuild, set it now:
+ if [[ ${JAVA_MODULE_INFO_RELEASE} && -z ${JAVA_RELEASE_SRC_DIRS[@]} ]]; then
+ # TODO: use JAVA_MODULE_INFO_RELEASE instead of fixed value.
+ JAVA_RELEASE_SRC_DIRS=( ["9"]=${JAVA_MODULE_INFO_OUT}/${JAVA_INTERMEDIATE_JAR_NAME}"/versions/9" )
+ fi
+ fi
+
+ # JEP 238 multi-release support, https://openjdk.org/jeps/238 #900433
+ #
+ # Basic support for building multi-release jar files according to JEP 238.
+ # A multi-release jar file has release-specific classes in directories
+ # under META-INF/versions/.
+ # Its META-INF/MANIFEST.MF contains the line: 'Multi-Release: true'.
+ if [[ -n ${JAVA_RELEASE_SRC_DIRS[@]} ]]; then
+ # Ensure correct virtual/jdk version
+ # Initialize a variable to track the highest key
+ local highest_version=-1
+
+ # Loop through the keys of the associative array
+ for key in "${!JAVA_RELEASE_SRC_DIRS[@]}"; do
+ # Compare the numeric value of the key
+ if [[ key > highest_version ]]; then
+ highest_version="$key"
+ fi
+ done
+
+ local jdk="$(depend-java-query --get-lowest "${DEPEND}")"
+ if [[ "${jdk#1.}" -lt "${highest_version}" ]]; then
+ die "Wrong DEPEND, needs at least virtual/jdk-${highest_version}"
+ fi
+
+ local classpath=""
+ java-pkg-simple_getclasspath
+
+ # An intermediate jar file might already exist from generation of the
+ # module-info.java file
+ if [[ ! $(find . -name ${JAVA_INTERMEDIATE_JAR_NAME}.jar) ]]; then
+ einfo "generating intermediate for multi-release"
+ # gather sources and compile classes for the intermediate jar file
+ find "${JAVA_SRC_DIR[@]}" -name \*.java ! -name module-info.java > ${sources}
+ ejavac -d ${classes} -encoding ${JAVA_ENCODING}\
+ ${classpath:+-classpath ${classpath}} ${JAVAC_ARGS} @${sources}
+
+ java-pkg-simple_prepend_resources ${classes} "${JAVA_RESOURCE_DIRS[@]}"
+
+ # package the intermediate jar file
+ # The intermediate jar file is a precondition for jdeps to generate
+ # a module-info.java file.
+ jar cvf "${JAVA_INTERMEDIATE_JAR_NAME}.jar" \
+ -C target/classes . || die
+ fi
+
+ local tmp_source=${JAVA_PKG_WANT_SOURCE} tmp_target=${JAVA_PKG_WANT_TARGET}
+
+ # compile content of release-specific source directories
+ local version
+ for version in "${!JAVA_RELEASE_SRC_DIRS[@]}"; do
+ local release="${version}"
+ local reldir="${JAVA_RELEASE_SRC_DIRS[${version}]}"
+ debug-print "Release is ${release}, directory is ${reldir}"
+
+ JAVA_PKG_WANT_SOURCE="${release}"
+ JAVA_PKG_WANT_TARGET="${release}"
+
+ local modulepath=""
+ java-pkg-simple_getmodulepath
+
+ # compile sources in ${reldir}
+ ejavac \
+ -d target/versions/${release} \
+ -encoding ${JAVA_ENCODING} \
+ -classpath "${modulepath}:${JAVA_INTERMEDIATE_JAR_NAME}.jar" \
+ --module-path "${modulepath}:${JAVA_INTERMEDIATE_JAR_NAME}.jar" \
+ --module-version ${PV} \
+ --patch-module "${JAVA_INTERMEDIATE_JAR_NAME}"="${JAVA_INTERMEDIATE_JAR_NAME}.jar" \
+ ${JAVAC_ARGS} $(find ${reldir} -type f -name '*.java')
+
+ JAVA_GENTOO_CLASSPATH_EXTRA+=":target/versions/${release}"
+ done
+
+ JAVA_PKG_WANT_SOURCE=${tmp_source}
+ JAVA_PKG_WANT_TARGET=${tmp_target}
+ else
# gather sources
# if target < 9, we need to compile module-info.java separately
# as this feature is not supported before Java 9
@@ -420,6 +658,7 @@ java-pkg-simple_src_compile() {
eqawarn "Please adjust DEPEND accordingly. See https://bugs.gentoo.org/796875#c3"
fi
fi
+ fi
# javadoc
if has doc ${JAVA_PKG_IUSE} && use doc; then
@@ -442,14 +681,29 @@ java-pkg-simple_src_compile() {
fi
# package
- local jar_args
+ local jar_args multi_release=""
+ if [[ -n ${JAVA_RELEASE_SRC_DIRS[@]} ]]; then
+ # Preparing the multi_release variable. From multi-release compilation
+ # the release-specific classes are sorted in target/versions/${release}
+ # directories.
+
+ # TODO:
+ # Could this possibly be simplified with printf?
+ pushd target/versions >> /dev/null || die
+ for version in $(ls -d * | sort -g); do
+ debug-print "Version is ${version}"
+ multi_release="${multi_release} --release ${version} -C target/versions/${version} . "
+ done
+ popd >> /dev/null || die
+ fi
+
if [[ -e ${classes}/META-INF/MANIFEST.MF ]]; then
sed '/Created-By: /Id' -i ${classes}/META-INF/MANIFEST.MF
jar_args="cfm ${JAVA_JAR_FILENAME} ${classes}/META-INF/MANIFEST.MF"
else
jar_args="cf ${JAVA_JAR_FILENAME}"
fi
- jar ${jar_args} -C ${classes} . || die "jar failed"
+ jar ${jar_args} -C ${classes} . ${multi_release} || die "jar failed"
if [[ -n "${JAVA_AUTOMATIC_MODULE_NAME}" ]]; then
echo "Automatic-Module-Name: ${JAVA_AUTOMATIC_MODULE_NAME}" \
>> "${T}/add-to-MANIFEST.MF" || die "adding module name failed"
@@ -463,6 +717,11 @@ java-pkg-simple_src_compile() {
|| die "updating MANIFEST.MF failed"
rm -f "${T}/add-to-MANIFEST.MF" || die "cannot remove"
fi
+
+ unset JAVA_INTERMEDIATE_JAR_NAME
+ unset JAVA_MODULE_INFO_OUT
+ unset JAVA_MODULE_INFO_RELEASE
+ unset JAVA_RELEASE_SRC_DIRS
}
# @FUNCTION: java-pkg-simple_src_install
--
2.41.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-dev] [PATCH v2 2/4] dev-java/asm-jdk-bridge: new package, add 0.0.2
2025-03-17 21:59 [gentoo-dev] [PATCH v2 1/4] java-pkg-simple.eclass: support Multi-Release JAR Files (JEP 238) Volkmar W. Pogatzki
@ 2025-03-17 21:59 ` Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 3/4] dev-java/jna: add 5.17.0 multi-release with generated module-info Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 4/4] dev-java/byte-buddy: add 1.17.2 Volkmar W. Pogatzki
2 siblings, 0 replies; 4+ messages in thread
From: Volkmar W. Pogatzki @ 2025-03-17 21:59 UTC (permalink / raw
To: gentoo-dev
Dependency of newer dev-java/byte-buddy versions.
Signed-off-by: Volkmar W. Pogatzki <gentoo@pogatzki.net>
---
dev-java/asm-jdk-bridge/Manifest | 1 +
.../asm-jdk-bridge-0.0.2.ebuild | 56 +++++++++++++++++++
dev-java/asm-jdk-bridge/metadata.xml | 10 ++++
3 files changed, 67 insertions(+)
create mode 100644 dev-java/asm-jdk-bridge/Manifest
create mode 100644 dev-java/asm-jdk-bridge/asm-jdk-bridge-0.0.2.ebuild
create mode 100644 dev-java/asm-jdk-bridge/metadata.xml
diff --git a/dev-java/asm-jdk-bridge/Manifest b/dev-java/asm-jdk-bridge/Manifest
new file mode 100644
index 000000000000..d7c66a5676f0
--- /dev/null
+++ b/dev-java/asm-jdk-bridge/Manifest
@@ -0,0 +1 @@
+DIST asm-jdk-bridge-parent-0.0.2.tar.gz 32261 BLAKE2B 64960baff0876e8b036dfc499b154844b996364410689207ee6371e7038e445a9ad9539830ff782c28116730144c469363e37c0b99fc41b375264a9b97e33205 SHA512 0dbc3aaa2e18cf75e9390fb91ef4cb5beb66694a8cdf7fbe427198c1cca3e850a5ffe63fa8159176c010308bfe19cbe8710dfd921e924e68502f18cd69e7ac19
diff --git a/dev-java/asm-jdk-bridge/asm-jdk-bridge-0.0.2.ebuild b/dev-java/asm-jdk-bridge/asm-jdk-bridge-0.0.2.ebuild
new file mode 100644
index 000000000000..75da72f8ee00
--- /dev/null
+++ b/dev-java/asm-jdk-bridge/asm-jdk-bridge-0.0.2.ebuild
@@ -0,0 +1,56 @@
+# Copyright 2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+JAVA_PKG_IUSE="doc source test"
+MAVEN_ID="codes.rafael.asmjdkbridge:asm-jdk-bridge:${PV}"
+JAVA_TESTING_FRAMEWORKS="junit-4"
+
+inherit java-pkg-2 java-pkg-simple
+
+DESCRIPTION="A Bridge to Translate ASM From and to The OpenJDK Class File API"
+HOMEPAGE="https://github.com/raphw/asm-jdk-bridge"
+SRC_URI="https://github.com/raphw/asm-jdk-bridge/archive/asm-jdk-bridge-parent-${PV}.tar.gz"
+S="${WORKDIR}/${PN}-${PN}-parent-${PV}"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+
+CP_DEPEND="
+ dev-java/asm:0
+ dev-java/junit:4
+"
+
+# >=virtual/jdk-24:*
+DEPEND="
+ ${CP_DEPEND}
+ >=virtual/jdk-9:*
+"
+
+# >=virtual/jre-24:*
+RDEPEND="
+ ${CP_DEPEND}
+ >=virtual/jre-1.8:*
+"
+
+JAVA_INTERMEDIATE_JAR_NAME="codes.rafael.asmjdkbridge"
+
+# We don't build release-specific classes for Java 24 because it is
+# non-LTS and Java 25 is expected to be released only in September 2025.
+
+# And also there is a validation problem with one of those classes
+# which can also be seen with the Jar file created by maven:
+# $ jar --validate -f asm-jdk-bridge/target/asm-jdk-bridge-0.0.2.jar
+# entry: META-INF/versions/24/codes/rafael/asmjdkbridge/JdkClassWriter.class,
+# contains a class with different api from earlier version
+# invalid multi-release jar file asm-jdk-bridge.jar deleted
+
+# JAVA_PACKAGER_ZIP="24" # Here we use app-arch/zip instead of java pacvkager
+JAVA_RELEASE_SRC_DIRS=(
+ ["9"]="asm-jdk-bridge/src/main/java-9"
+# ["24"]="asm-jdk-bridge/src/main/java-24"
+)
+
+JAVA_SRC_DIR="asm-jdk-bridge/src/main/java"
diff --git a/dev-java/asm-jdk-bridge/metadata.xml b/dev-java/asm-jdk-bridge/metadata.xml
new file mode 100644
index 000000000000..3be367d5e6a6
--- /dev/null
+++ b/dev-java/asm-jdk-bridge/metadata.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="project">
+ <email>java@gentoo.org</email>
+ </maintainer>
+ <upstream>
+ <remote-id type="github">raphw/asm-jdk-bridge</remote-id>
+ </upstream>
+</pkgmetadata>
--
2.41.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-dev] [PATCH v2 3/4] dev-java/jna: add 5.17.0 multi-release with generated module-info
2025-03-17 21:59 [gentoo-dev] [PATCH v2 1/4] java-pkg-simple.eclass: support Multi-Release JAR Files (JEP 238) Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 2/4] dev-java/asm-jdk-bridge: new package, add 0.0.2 Volkmar W. Pogatzki
@ 2025-03-17 21:59 ` Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 4/4] dev-java/byte-buddy: add 1.17.2 Volkmar W. Pogatzki
2 siblings, 0 replies; 4+ messages in thread
From: Volkmar W. Pogatzki @ 2025-03-17 21:59 UTC (permalink / raw
To: gentoo-dev
- switches to default slot (SLOT=0)
- consumers should be switched on version bumps
Signed-off-by: Volkmar W. Pogatzki <gentoo@pogatzki.net>
---
dev-java/jna/Manifest | 1 +
dev-java/jna/jna-5.17.0.ebuild | 193 +++++++++++++++++++++++++++++++++
2 files changed, 194 insertions(+)
create mode 100644 dev-java/jna/jna-5.17.0.ebuild
diff --git a/dev-java/jna/Manifest b/dev-java/jna/Manifest
index 7b0e3833bb1a..b002df3f1916 100644
--- a/dev-java/jna/Manifest
+++ b/dev-java/jna/Manifest
@@ -1,2 +1,3 @@
DIST jna-5.13.0.tar.gz 116027625 BLAKE2B 1f2bc7ab28adefa0bbad122957ed2c6ef55ab88e79b30c05f0d2d88e0e05152f7bb5e28097906a7e24f78304dfa2b225587adb0ada205ca3c2ceac1cdbab3f04 SHA512 aefd0becc03bb7fd753e8c5cdcbcb20f6d590125a5fb03048bef0024e826ab0254b750e22a8bb26bea38cc89262ad45e5030b666cb2c857b01b15a6a55379a0f
DIST jna-5.16.0.tar.gz 117007067 BLAKE2B 805cc1b9a23a0bddad77900b7158d00dde3827dd577f68bdbc4d7de8a1d6d368826accee92bc76b3ea3188d1f9e3655776141136c04238c51bcedcb587937109 SHA512 76124b4c885e81f68f7724a04508a76f9b366867faede11d9b75c1c56e46f904825f4d05ce94e7e3c0e4b759007c589d4fbdb90f93864a51044b5baa6b9ca21a
+DIST jna-5.17.0.tar.gz 117280491 BLAKE2B 4eb919b4a1f21e7674f334a26c7a63a3e8ec98cbfa114bc22e0a34c70f151f32f252a7c21467cf138dad6fa9bcb538a61da95450384353821d20588f99658c5f SHA512 9ed24af21a5e0470733c0836b8d7e892de8d0307d32460925b5457052de4a9c3b5f20466afd14059d686ea4af23670b002f78e3027dcc0dfc07e790942236bcb
diff --git a/dev-java/jna/jna-5.17.0.ebuild b/dev-java/jna/jna-5.17.0.ebuild
new file mode 100644
index 000000000000..860332ec5136
--- /dev/null
+++ b/dev-java/jna/jna-5.17.0.ebuild
@@ -0,0 +1,193 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+JAVA_PKG_IUSE="doc source test"
+MAVEN_PROVIDES="
+ net.java.dev.jna:jna:${PV}
+ net.java.dev.jna:jna-platform:${PV}
+"
+JAVA_TESTING_FRAMEWORKS="junit-4"
+
+inherit java-pkg-2 java-pkg-simple toolchain-funcs
+
+DESCRIPTION="Java Native Access"
+HOMEPAGE="https://github.com/java-native-access/jna"
+SRC_URI="https://github.com/java-native-access/jna/archive/${PV}.tar.gz -> ${P}.tar.gz"
+S="${WORKDIR}/${P}"
+
+LICENSE="|| ( Apache-2.0 LGPL-2.1+ )"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~ppc64"
+
+BDEPEND="virtual/pkgconfig"
+
+CDEPEND=">=dev-libs/libffi-3.4:="
+
+DEPEND="
+ ${CDEPEND}
+ >=virtual/jdk-11:*
+ x11-base/xorg-proto:0
+ x11-libs/libXt
+ test? ( dev-java/reflections:0 )
+"
+
+RDEPEND="
+ ${CDEPEND}
+ >=virtual/jre-1.8:*
+"
+
+DOCS=( README.md CHANGES.md OTHERS TODO )
+
+JAVADOC_SRC_DIRS=( {contrib/platform/,}src )
+
+PATCHES=(
+ "${FILESDIR}/5.11.0-makefile-flags.patch"
+ "${FILESDIR}/jna-5.11.0-no-Werror.patch"
+ "${FILESDIR}/jna-5.13.0-testpath.patch"
+ "${FILESDIR}/jna-5.13.0-LibCTest.patch"
+)
+
+src_prepare() {
+ default #780585
+ java-pkg-2_src_prepare
+ java-pkg_clean
+
+ # https://github.com/java-native-access/jna/blob/5.13.0/build.xml#L402-L407
+ sed \
+ -e "/VERSION =/s:TEMPLATE:${PV}:" \
+ -e '/VERSION_NATIVE =/s:TEMPLATE:5.1.0:' \
+ -i src/com/sun/jna/Version.java || die
+}
+
+src_compile() {
+ einfo "Compiling jna.jar"
+ JAVA_INTERMEDIATE_JAR_NAME="com.sun.jna"
+ JAVA_JAR_FILENAME="jna.jar"
+ JAVA_MAIN_CLASS="com.sun.jna.Native"
+ JAVA_MODULE_INFO_OUT="src"
+ JAVA_SRC_DIR="src"
+ java-pkg-simple_src_compile
+ JAVA_GENTOO_CLASSPATH_EXTRA+=":jna.jar"
+ rm -r target || die
+
+ einfo "Compiling jna-platform.jar"
+ JAVA_INTERMEDIATE_JAR_NAME="com.sun.jna.platform"
+ JAVA_JAR_FILENAME="jna-platform.jar"
+ JAVA_MAIN_CLASS="" # Did the eclass forget to unset this variable?
+ JAVA_MODULE_INFO_OUT="contrib/platform/src"
+ JAVA_SRC_DIR="contrib/platform/src"
+ java-pkg-simple_src_compile
+ JAVA_GENTOO_CLASSPATH_EXTRA+=":jna-platform.jar"
+ rm -r target || die
+
+ use doc && ejavadoc
+
+ einfo "Generating headers com_sun_jna_Native.h com_sun_jna_Function.h"
+ ejavac -h native -classpath "src" \
+ "src/com/sun/jna/Function.java" \
+ "src/com/sun/jna/Native.java" || die
+
+ einfo "Building native library"
+ cd native || die
+ local args=(
+ CC="$(tc-getCC)"
+ STRIP=true
+ DYNAMIC_LIBFFI=true
+ )
+ # Using -j1 since otherwise fails to build:
+ # cannot find ../build/native/libtestlib.so: No such file or directory
+ # [Makefile:505: ../build/native/libtestlib2.so] Error 1
+ emake -j1 "${args[@]}"
+}
+
+src_test() {
+ rm -r contrib/platform/test/com/sun/jna/platform/{mac,unix,win32} || die
+ rm -r test/com/sun/jna/wince || die
+ rm -r test/com/sun/jna/win32 || die
+
+ # 1) testLoadFromJarAbsolute(com.sun.jna.LibraryLoadTest)
+ # java.lang.UnsatisfiedLinkError: Unable to load library '/libtestlib-jar.so':
+ # /libtestlib-jar.so: cannot open shared object file: No such file or directory
+ jar cvf build/jna-test.jar \
+ -C build/native libtestlib-jar.so \
+ -C test com/sun/jna/data || die
+ JAVA_GENTOO_CLASSPATH_EXTRA+=":build/jna-test.jar"
+
+ JAVA_TEST_EXTRA_ARGS=(
+ -Djna.nosys=true
+ -Djna.boot.library.path=build/native
+ -Djna.library.path=build/native
+ )
+
+ JAVA_TEST_GENTOO_CLASSPATH="junit-4,reflections"
+
+ einfo "Testing jna-platform"
+ JAVA_TEST_RUN_ONLY=( com.sun.jna.platform.linux.XAttrUtilTest ) # If not run first, it would fail.
+ JAVA_TEST_SRC_DIR="contrib/platform/test"
+ pushd "${JAVA_TEST_SRC_DIR}" > /dev/null || die
+ local JAVA_TEST_RUN_LATER=$(find * -name '*Test.java' ! -name 'XAttrUtilTest.java' )
+ popd
+ JAVA_TEST_RUN_LATER="${JAVA_TEST_RUN_LATER//.java}"
+ JAVA_TEST_RUN_ONLY+=( ${JAVA_TEST_RUN_LATER//\//.} )
+ java-pkg-simple_src_test
+
+ einfo "Testing jna"
+ JAVA_TEST_SRC_DIR="test"
+
+ # Some tests need to run first, otherwise they would fail.
+ JAVA_TEST_RUN_ONLY=(
+ com.sun.jna.CallbacksTest
+ com.sun.jna.DirectTest
+ com.sun.jna.UnionTest
+ )
+ JAVA_TEST_RUN_ONLY+=( com.sun.jna.TypeMapperTest )
+ JAVA_TEST_RUN_ONLY+=( com.sun.jna.NativeTest )
+
+ pushd "${JAVA_TEST_SRC_DIR}" > /dev/null || die
+ # Here, those tests which were moved to top of the array are excluded.
+ # Also exclude 2 tests which must not run before the others.
+ local JAVA_TEST_RUN_LATER=$(find * \
+ -name "*Test.java" \
+ ! -name 'CallbacksTest.java' \
+ ! -name 'DirectTest.java' \
+ ! -name 'UnionTest.java' \
+ ! -name 'TypeMapperTest.java' \
+ ! -name 'NativeTest.java' \
+ ! -name 'DirectCallbacksTest.java' \
+ ! -name 'VMCrashProtectionTest.java' \
+ )
+ popd
+ JAVA_TEST_RUN_LATER="${JAVA_TEST_RUN_LATER//.java}"
+ JAVA_TEST_RUN_ONLY+=( ${JAVA_TEST_RUN_LATER//\//.} )
+
+ # This one makes trouble if run before some others.
+ JAVA_TEST_RUN_ONLY+=( com.sun.jna.VMCrashProtectionTest )
+ java-pkg-simple_src_test
+
+ # There was 1 failure:
+ # 1) testDefaultCallbackExceptionHandler(com.sun.jna.CallbacksTest)
+ # junit.framework.AssertionFailedError: Default handler not called
+ # at junit.framework.Assert.fail(Assert.java:57)
+ # at junit.framework.Assert.assertTrue(Assert.java:22)
+ # at junit.framework.TestCase.assertTrue(TestCase.java:192)
+ # at com.sun.jna.CallbacksTest.testDefaultCallbackExceptionHandler(CallbacksTest.java:865)
+ # Cannot run in same batch as 'com.sun.jna.CallbacksTest'.
+ # It would break other tests if run before and segmentation fault if run after.
+ JAVA_TEST_RUN_ONLY=( com.sun.jna.DirectCallbacksTest )
+ java-pkg-simple_src_test
+}
+
+src_install() {
+ default
+ java-pkg_dojar jna.jar jna-platform.jar
+ java-pkg_doso build/native/libjnidispatch.so
+
+ use doc && java-pkg_dojavadoc target/api
+
+ if use source; then
+ java-pkg_dosrc "src/*"
+ java-pkg_dosrc "contrib/platform/src/*"
+ fi
+}
--
2.41.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-dev] [PATCH v2 4/4] dev-java/byte-buddy: add 1.17.2
2025-03-17 21:59 [gentoo-dev] [PATCH v2 1/4] java-pkg-simple.eclass: support Multi-Release JAR Files (JEP 238) Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 2/4] dev-java/asm-jdk-bridge: new package, add 0.0.2 Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 3/4] dev-java/jna: add 5.17.0 multi-release with generated module-info Volkmar W. Pogatzki
@ 2025-03-17 21:59 ` Volkmar W. Pogatzki
2 siblings, 0 replies; 4+ messages in thread
From: Volkmar W. Pogatzki @ 2025-03-17 21:59 UTC (permalink / raw
To: gentoo-dev
Simplifies ebuild by generating module-info with eclass functionality.
Switches to dev-java/jna:0 (from dev-java/jna:4)
Restricted to asm-9 since bytecode 69 starts from Java 25. Also
restricted to presently stable Java versions because with Java 25,
there are still too many test failures.
Closes: https://bugs.gentoo.org/837233
Signed-off-by: Volkmar W. Pogatzki <gentoo@pogatzki.net>
---
dev-java/byte-buddy/Manifest | 1 +
dev-java/byte-buddy/byte-buddy-1.17.2.ebuild | 123 +++++++++++++++++++
2 files changed, 124 insertions(+)
create mode 100644 dev-java/byte-buddy/byte-buddy-1.17.2.ebuild
diff --git a/dev-java/byte-buddy/Manifest b/dev-java/byte-buddy/Manifest
index 450d00e8c659..0ea20d1905ec 100644
--- a/dev-java/byte-buddy/Manifest
+++ b/dev-java/byte-buddy/Manifest
@@ -1 +1,2 @@
DIST byte-buddy-1.15.11.tar.gz 2059994 BLAKE2B b5b11de938d2b96518c01cf1bcebb0f34ca6ccdb81e519e0177fa371f438da9ca5aba5749d1a7af0f42a2359c55228f3cbfbfe32f158d4a18fe7f02a5d5bf4f2 SHA512 9e663dfee80e6ae9e4983a39177a94f160e52e3ef1dec54b8f6a90e32c18ae5b36c9e791fd605b43754b2667f6efd7e15a1f7b0ce6c5034945567aef8a6b8aa8
+DIST byte-buddy-1.17.2.tar.gz 2084935 BLAKE2B b705464bdf1f4b07af21a143729e9098ce398103a0168a4d9146b3fe75671699684f6fdd1203ed48d7dddd5e1c29a2c3b01a6c779c81498a66c30c603c892088 SHA512 77f53a6829be905d7abaaef1628ed05425be301b3f8762556f1d37ac358a59f0c3a3422bac8729608d9e1270970a780bdd11eb0518c3a8dda9349b18ab25b464
diff --git a/dev-java/byte-buddy/byte-buddy-1.17.2.ebuild b/dev-java/byte-buddy/byte-buddy-1.17.2.ebuild
new file mode 100644
index 000000000000..ee4c9fda7804
--- /dev/null
+++ b/dev-java/byte-buddy/byte-buddy-1.17.2.ebuild
@@ -0,0 +1,123 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+JAVA_PKG_IUSE="doc source test"
+MAVEN_PROVIDES="net.bytebuddy:byte-buddy-agent:${PV} net.bytebuddy:byte-buddy:${PV}"
+JAVA_TESTING_FRAMEWORKS="junit-4"
+
+inherit java-pkg-2 java-pkg-simple
+
+DESCRIPTION="Offers convenience for attaching an agent to the local or a remote VM"
+HOMEPAGE="https://bytebuddy.net"
+SRC_URI="https://github.com/raphw/byte-buddy/archive/${P}.tar.gz"
+S="${WORKDIR}/byte-buddy-${P}"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+
+# This version seems not ready for Java 25. It would cause too many test failures like:
+# 1) testEqualsParameter(net.bytebuddy.pool.TypePoolDefaultMethodDescriptionTest)
+# java.lang.IllegalStateException:
+# Could not invoke proxy: Type not available on current VM: codes.rafael.asmjdkbridge.JdkClassReader
+# Also restricting to asm-9 since bytecode 69 starts from Java 25.
+# Otherwise testLatestVersion(net.bytebuddy.ClassFileVersionOtherTest) would fail.
+DEPEND="
+ >=dev-java/asm-9.7.1:9
+ dev-java/asm-jdk-bridge:0
+ dev-java/findbugs-annotations:0
+ >=dev-java/jna-5.17.0:0
+ dev-java/jsr305:0
+ || ( virtual/jdk:11 virtual/jdk:17 virtual/jdk:21 )
+ test? (
+ dev-java/asm-jdk-bridge:0
+ >=dev-java/mockito-2.28.2-r1:2
+ )
+"
+
+RDEPEND=">=virtual/jre-1.8:*"
+
+PATCHES=( "${FILESDIR}/byte-buddy-1.15.10-Skip-testIgnoreExistingField.patch" )
+
+JAVA_CLASSPATH_EXTRA="
+ asm-9
+ asm-jdk-bridge
+ findbugs-annotations
+ jna
+ jsr305
+"
+JAVADOC_CLASSPATH="${JAVA_CLASSPATH_EXTRA}"
+JAVADOC_SRC_DIRS=(
+ "byte-buddy-agent/src/main/java"
+ "byte-buddy/src/main/java"
+)
+
+src_prepare() {
+ default #780585
+ java-pkg_clean ! -path "./byte-buddy-dep/src/test/*" # Keep test-classes
+ java-pkg-2_src_prepare
+
+ # instead of shading byte-buddy-dep we move it into byte-buddy.
+ mv byte-buddy{-dep,}/src/main/java || die "cannot move sources"
+}
+
+src_compile() {
+ einfo "Compiling byte-buddy-agent.jar"
+ JAVA_INTERMEDIATE_JAR_NAME="net.bytebuddy.agent"
+ JAVA_JAR_FILENAME="byte-buddy-agent.jar"
+ JAVA_MODULE_INFO_OUT="byte-buddy-agent/src/main"
+ JAVA_RESOURCE_DIRS="byte-buddy-agent/src/main/resources"
+ JAVA_SRC_DIR="byte-buddy-agent/src/main/java"
+ java-pkg-simple_src_compile
+ JAVA_GENTOO_CLASSPATH_EXTRA+=":byte-buddy-agent.jar"
+ rm -r target || die
+
+ einfo "Compiling byte-buddy.jar"
+ JAVA_INTERMEDIATE_JAR_NAME="net.bytebuddy"
+ JAVA_JAR_FILENAME="byte-buddy.jar"
+ JAVA_MODULE_INFO_OUT="byte-buddy/src/main"
+ JAVA_MAIN_CLASS="net.bytebuddy.build.Plugin\$Engine\$Default"
+ JAVA_RESOURCE_DIRS=()
+ JAVA_SRC_DIR="byte-buddy/src/main/java"
+ java-pkg-simple_src_compile
+ JAVA_GENTOO_CLASSPATH_EXTRA+=":byte-buddy.jar"
+ rm -r target || die
+
+ use doc && ejavadoc
+}
+
+src_test() {
+ # instead of shading byte-buddy-dep we move it into byte-buddy.
+ mv byte-buddy{-dep,}/src/test || die "cannot move tests"
+
+ JAVAC_ARGS="-g"
+ JAVA_TEST_GENTOO_CLASSPATH="asm-jdk-bridge,junit-4,mockito-2"
+
+ einfo "Testing byte-buddy-agent"
+ # https://github.com/raphw/byte-buddy/issues/1321#issuecomment-1252776459
+ JAVA_TEST_EXTRA_ARGS=( -Dnet.bytebuddy.test.jnapath="${EPREFIX}/usr/$(get_libdir)/jna/" )
+ JAVA_TEST_SRC_DIR="byte-buddy-agent/src/test/java"
+ java-pkg-simple_src_test
+
+ einfo "Testing byte-buddy"
+ JAVA_TEST_RESOURCE_DIRS=( byte-buddy/src/test/{resources,precompiled*} )
+ JAVA_TEST_SRC_DIR="byte-buddy/src/test/java"
+
+ JAVA_TEST_EXCLUDES=(
+ # all tests in this class fail, https://bugs.gentoo.org/863386
+ net.bytebuddy.build.CachedReturnPluginTest
+ )
+ java-pkg-simple_src_test
+}
+
+src_install() {
+ java-pkg_dojar "byte-buddy-agent.jar"
+ java-pkg-simple_src_install
+
+ if use source; then
+ java-pkg_dosrc "byte-buddy-agent/src/main/java/*"
+ java-pkg_dosrc "byte-buddy/src/main/java/*"
+ fi
+}
--
2.41.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-03-17 22:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-17 21:59 [gentoo-dev] [PATCH v2 1/4] java-pkg-simple.eclass: support Multi-Release JAR Files (JEP 238) Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 2/4] dev-java/asm-jdk-bridge: new package, add 0.0.2 Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 3/4] dev-java/jna: add 5.17.0 multi-release with generated module-info Volkmar W. Pogatzki
2025-03-17 21:59 ` [gentoo-dev] [PATCH v2 4/4] dev-java/byte-buddy: add 1.17.2 Volkmar W. Pogatzki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox