public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [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