summaryrefslogtreecommitdiff
path: root/dev-java/antlr-runtime/antlr-runtime-4.9.3.ebuild
blob: cf26c16eb71e240a2511bd9820049a23075e1686 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

JAVA_PKG_IUSE="doc source test"
MAVEN_ID="org.antlr:antlr4-runtime:4.9.3"
JAVA_TESTING_FRAMEWORKS="junit-4"

inherit java-pkg-2 java-pkg-simple

MY_PN="${PN%-runtime}"
MY_P="${MY_PN}-${PV}"

DESCRIPTION="ANTLR 4 Runtime"
HOMEPAGE="https://www.antlr.org/"
SRC_URI="https://github.com/antlr/antlr4/archive/${PV}.tar.gz -> ${MY_P}.tar.gz"

LICENSE="BSD"
SLOT="4"
KEYWORDS="amd64 ~arm arm64 ppc64 x86"

DEPEND="
	>=virtual/jdk-1.8:*
	test? (
		~dev-java/antlr-tool-${PV}:${SLOT}
		dev-java/jol-core:0
	)
"

RDEPEND="
	>=virtual/jre-1.8:*
"

S="${WORKDIR}/${MY_PN}4-${PV}"

JAVA_SRC_DIR="runtime/Java/src"

JAVA_TEST_GENTOO_CLASSPATH="
	junit-4
	antlr-tool-${SLOT}
	jol-core
"
JAVA_TEST_SRC_DIR=(
	runtime-testsuite/test
	runtime-testsuite/annotations
)
JAVA_TEST_RESOURCE_DIRS=(
	runtime-testsuite/resources
)

src_prepare() {
	java-pkg_clean
	eapply "${FILESDIR}/${PV}-test-fixes.patch"
	java-pkg-2_src_prepare
}

src_test() {
	# Build classpath for tests
	# The JAR created during src_compile must appear in the classpath *before*
	# any dependencies to ensure that *it* is the JAR being tested; otherwise,
	# because the test suite depends on antlr-tool, which depends on this
	# package, the copy of this package's JAR installed on the system would be
	# tested instead when it appears earlier in the classpath, which might
	# cause test failures when the version being built differs from the version
	# already installed on the system, like https://bugs.gentoo.org/834138
	local CP="${S}/${JAVA_JAR_FILENAME}"
	local test_dep res_dir
	for test_dep in ${JAVA_TEST_GENTOO_CLASSPATH}; do
		CP+=":$(java-pkg_getjars --with-dependencies "${test_dep}")"
	done
	for res_dir in "${JAVA_TEST_RESOURCE_DIRS[@]}"; do
		CP+=":${res_dir}"
	done

	pushd "${JAVA_TEST_SRC_DIR[0]}" > /dev/null ||
		die "Failed to enter test source directory for ${PN}"

	einfo "Removing tests for non-Java runtimes ..."
	find org/antlr/v4/test/runtime/* -maxdepth 0 -type d \
		-not -name category -not -name descriptors -not -name java \
		-exec einfo "  {}" \; -exec rm -r "{}" + ||
		die "Failed to remove tests for non-Java runtimes"

	einfo "Generating ANTLR 4 parsers for tests ..."
	local java_exe="$(java-config -J)"
	local g4_files=( $(find * -name "*.g4") )
	local file
	for file in "${g4_files[@]}"; do
		local java_pkg="${file%/*.g4}"
		java_pkg="${java_pkg//\//.}"
		"${java_exe}" -cp "${CP}" org.antlr.v4.Tool \
			-visitor -package "${java_pkg}" "${file}" ||
			die "Failed to generate ANTLR 4 parser from ${file}"
	done

	# Create a list of tests to run
	# https://github.com/antlr/antlr4/blob/4.9.3/runtime-testsuite/pom.xml#L100
	# Excluding classes with "No runnable methods"
	local TESTS=$(find * -type f -name "Test*.java" \
		-not -name "TestContext.java" \
		-not -name "TestOutputReading.java"
	)
	TESTS="${TESTS//.java}"
	TESTS="${TESTS//\//.}"

	popd > /dev/null || die "Failed to leave test source directory for ${PN}"

	local classes="target/classes"

	# Compile the annotation processor of @CommentHasStringValue
	# before the test sources (requires tools.jar)
	ejavac -d "${classes}" -cp "${CP}:$(java-config -t)" \
		$(find runtime-testsuite/{annotations,processors} -name "*.java")
	local processor_cp="${classes}:runtime-testsuite/processors/resources"

	# Compile Java test sources, and process @CommentHasStringValue
	# annotations at the same time
	local javac_extra_args=()
	if ver_test "$(java-config -g PROVIDES_VERSION)" -ge 17; then
		javac_extra_args+=(
			-J--add-opens=jdk.compiler/com.sun.tools.javac.{main,model,tree,util}=ALL-UNNAMED
		)
	fi
	ejavac -d "${classes}" -cp "${CP}:${processor_cp}" \
		"${javac_extra_args[@]}" \
		$(find "${JAVA_TEST_SRC_DIR[@]}" -name "*.java")

	ejunit4 -classpath "${classes}:${CP}" ${TESTS}
}