summaryrefslogtreecommitdiff
blob: d1d0486dd712aa50084c90259e85e425c6740d41 (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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

JAVA_PKG_IUSE="doc source test"
MAVEN_PROVIDES="
	org.apache.ant:ant:${PV}
	org.apache.ant:ant-launcher:${PV}
"
JAVA_TESTING_FRAMEWORKS="junit-4"

inherit java-pkg-2 java-pkg-simple verify-sig prefix

DESCRIPTION="Java-based build tool similar to 'make' that uses XML configuration files"
HOMEPAGE="https://ant.apache.org/"
SRC_URI="mirror://apache/ant/source/apache-${P}-src.tar.gz
	verify-sig? ( https://downloads.apache.org/ant/source/apache-${P}-src.tar.gz.asc )"
S="${WORKDIR}/apache-${P}"

LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="amd64 ~arm arm64 ppc64 x86 ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x64-solaris"
IUSE="antlr bcel bsf commonslogging commonsnet imageio jai jakartamail javamail jdepend
	jmf jsch junit junit4 junitlauncher log4j oro regexp resolver swing testutil xalan xz"

# At least 10 test cases would fail without network
PROPERTIES="test_network"
RESTRICT="test"

REQUIRED_USE="
	junit4? ( junit )
	test? ( bsf )
	testutil? ( junit )
"

VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/ant.apache.org.asc"
BDEPEND="verify-sig? ( sec-keys/openpgp-keys-apache-ant )"
# jdk-11:* because it needs java/util/spi/ToolProvider, available since Java 9.
DEPEND="
	>=virtual/jdk-11:*
	bcel? ( dev-java/bcel:0 )
	bsf? ( dev-java/bsf:2.3 )
	commonslogging? ( dev-java/commons-logging:0 )
	commonsnet? ( dev-java/commons-net:0 )
	jai? ( dev-java/sun-jai-bin:0 )
	jakartamail? ( dev-java/jakarta-mail:0 )
	javamail? (
		dev-java/jakarta-activation-api:1
		dev-java/javax-mail:0
	)
	jdepend? ( >=dev-java/jdepend-2.10-r1:0 )
	jsch? ( dev-java/jsch:0 )
	junit4? ( dev-java/junit:4 )
	junit? ( dev-java/junit:4 )
	junitlauncher? ( dev-java/junit:5[vintage] )
	log4j? ( dev-java/log4j-12-api:2 )
	oro? ( dev-java/jakarta-oro:2.0 )
	regexp? ( dev-java/jakarta-regexp:1.4 )
	resolver? ( dev-java/xml-commons-resolver:0 )
	test? (
		dev-java/antunit:0
		dev-java/bsf:2.3[javascript]
		dev-java/bsh:0
		dev-java/hamcrest-library:1.3
		dev-java/xerces:2
	)
	xalan? (
		dev-java/xalan:0
		dev-java/xalan-serializer:0
	)
	xz? ( dev-java/xz-java:0 )
"
RDEPEND="
	!dev-java/ant-apache-regexp
	!dev-java/ant-apache-log4j
	!dev-java/ant-apache-xalan2
	!dev-java/ant-commons-logging
	!dev-java/ant-swing
	!dev-java/ant-junit4
	!dev-java/ant-testutil
	!dev-java/ant-junitlauncher
	!dev-java/ant-jai
	!dev-java/ant-commons-net
	!dev-java/ant-apache-bsf
	!dev-java/ant-jmf
	!dev-java/ant-apache-oro
	!dev-java/ant-javamail
	!dev-java/ant-junit
	!dev-java/ant-jdepend
	!dev-java/ant-antlr
	!dev-java/ant-apache-bcel
	!dev-java/ant-apache-resolver
	!dev-java/ant-jsch
	!dev-java/ant-xz
	>=virtual/jre-1.8:*
"

DOCS=( CONTRIBUTORS INSTALL NOTICE README WHATSNEW )
PATCHES=(
	"${FILESDIR}/1.10.9-launch.patch"	# reusing this patch since the script has not changed
	"${FILESDIR}/ant-1.10.14-AntlibTest.patch"	# skips  1 of  6 tests
	"${FILESDIR}/ant-1.10.14-AntTest.patch"		# skips  1 of 32 tests
	"${FILESDIR}/ant-1.10.14-JavaTest.patch"	# skips 12 of 38 tests
	"${FILESDIR}/ant-1.10.14-LinkTest.patch"	# skips  4 of 67 tests
	"${FILESDIR}/ant-1.10.14-PathTest.patch"	# skips  1 of 33 tests
)

JAVADOC_SRC_DIRS=(
	ant
	ant-launcher/src/main
)
JAVA_TEST_GENTOO_CLASSPATH="
	bsh
	hamcrest-library-1.3
	junit-4
	xerces-2
"
JAVA_TEST_RESOURCE_DIRS=(
	"src/etc/testcases"
	"src/main"
)
JAVA_TEST_SRC_DIR="src/tests/junit"

# $1 ant-apache-bsf (source directory)
# $2 bsf-2.3  (classpath of external dependency)
taskdeps() {
	if [[ ${task} == $1 ]]; then
		JAVA_CLASSPATH_EXTRA="${2}"
		JAVADOC_CLASSPATH+=" ${2}"
		JAVADOC_SRC_DIRS+=( "${task}/src/main" )
		JAVA_RESOURCE_DIRS="${3}"
	fi
}

src_prepare() {
	default #780585
	java-pkg-2_src_prepare
	java-pkg_clean ! -path "./src/etc/*" # keep test resources

	eprefixify "src/script/ant"

	ANT_TASKS=(
		$(use antlr && echo ant-antlr) # no dependencies
		$(use bcel && echo ant-apache-bcel)
		$(use bsf && echo ant-apache-bsf) # REQUIRED_USE for tests
		$(use log4j && echo ant-apache-log4j)
		$(use oro && echo ant-apache-oro)	# ORO is retired - replace with java.util.regex?
		$(use regexp && echo ant-apache-regexp)
		$(use resolver && echo ant-apache-resolver)
		$(use xalan && echo ant-apache-xalan2)
		$(use commonslogging && echo ant-commons-logging)
		$(use commonsnet && echo ant-commons-net)
		$(use imageio && echo ant-imageio)	# no dependencies
		$(use jai && echo ant-jai)
		$(use jakartamail && echo ant-jakartamail)
		$(use javamail && echo ant-javamail)
		$(use jdepend && echo ant-jdepend)
		$(use jmf && echo ant-jmf)	# no dependencies
		$(use jsch && echo ant-jsch)
		$(use junit && echo ant-junit)	# REQUIRED_USE for junit4 and for testutil
		$(use junit4 && echo ant-junit4)
		$(use junitlauncher && echo ant-junitlauncher)
		# depends on "com.ibm.netrexx:netrexx:2.0.5" which is
		# available on https://www.netrexx.org/downloads.nsp and states:
		# "IBM's last NetRexx release, suitable for JVM versions 1.5 and below [...]"
		# $(use netrexx && echo ant-netrexx) # src/etc/poms/ant-netrexx/pom.xml
		$(use swing && echo ant-swing) # no dependencies
		$(use testutil && echo ant-testutil)
		$(use xz && echo ant-xz)
	)

	# defaultManifest.mf
	sed -e "s:\${project.version}:${PV}:" \
		-i src/main/org/apache/tools/ant/defaultManifest.mf || die

	# version.txt
	local mydate="$(date '+%B %d %Y')"
	echo "VERSION=${PV}" > src/main/org/apache/tools/ant/version.txt || die
	echo "DATE=${mydate}" >> src/main/org/apache/tools/ant/version.txt || die

	# src directory for ant.jar
	mkdir ant || die "cannot create src directory for ant"
	cp -r {src/main/,ant}/org || die "cannot copy ant sources"

	# resources directory for ant.jar according to lines 317-325 src/etc/poms/ant/pom.xml
	local INCLUDES=( $(
		sed -n '/<resources>/,/<\/resources>/p' \
			src/etc/poms/ant/pom.xml \
		| grep org \
		| sed -e 's:.*<include>\(.*\)</include>:\1:' || die
	))
	cp -r {src/,ant}/resources || die "cannot copy ant resources"
	pushd src/main > /dev/null || die "pushd src/main"
		cp --parents -v "${INCLUDES[@]}" ../../ant/resources || die "CANNOT"
	popd > /dev/null || die "popd"

	# Remove sources according to lines 158-187 src/etc/poms/ant/pom.xml
	# We don't remove anything from src/main/org
	local EXCLUDES=$(
		sed -n '/<excludes>/,/<\/excludes/p' \
			src/etc/poms/ant/pom.xml \
		| grep org \
		| sed -e 's:<exclude>\(.*\)</exclude>:ant/\1:' || die
	)
	rm -r ${EXCLUDES} || die
	# Remove one more file directly, could not get it with sed.
	rm ant/org/apache/tools/ant/taskdefs/optional/ANTLR.java || die

	# Same handling for everything between <testExcludes> </testExcludes>
	# Removing non-existing files is not possible: We ignore them ( grep -v ).
	local TEST_EXCLUDES=$(
		sed -n '/<testExcludes>/,/<\/testExcludes/p' \
			src/etc/poms/ant/pom.xml \
		| grep org \
		| grep -v CommonsLoggingListener \
		| grep -v Log4jListener \
		| sed -e 's:<exclude>\(.*\)</exclude>:src/tests/junit/\1:' || die
	)
	rm -r ${TEST_EXCLUDES} || die

	# Prepare a separate JAVA_SRC_DIR directory for each jar file to be created.
	einfo "Copy source files of ant-tasks"
	local task
	for task in ant-launcher "${ANT_TASKS[@]}"; do
		# "${task}/src/main" will be JAVA_SRC_DIR
		mkdir -p "${task}/src/main" || die "mkdir ${task}"
		# Read from pom.xml the file names which can still contain wildcards
		local INCLUDES=( $(
			sed -n '/<includes>/,/<\/includes>/p' "src/etc/poms/${task}/pom.xml" \
			| grep org \
			| sed -e 's:.*<include>\(.*\)</include>:\1:' || die
		))
		local sourcefile
		# Resolve wildcards in file names using find and copy the files to the corresponding
		# "${task}"/src/main directory
	#	echo "${INCLUDES[@]}"
		for sourcefile in "${INCLUDES[@]}"; do
	#		einfo "${task}: ${sourcefile}"
			# Parameter substitution % to remove trailing slash from ${sourcefile}.
			# Applies to ant-jdepend and ant-junitlauncher where find would otherwise fail.
			find  \
				-path "./src/*/${sourcefile%/}" \
				-exec cp -r --parents "{}" \
				"${task}/src/main" \;
		done
	#	tree "${task}"
	done

	# JAVA_RESOURCE_DIRS for ant-junit
	mkdir -p ant-junit/src/resources/org/apache/tools/ant/taskdefs/optional/junit/xsl \
		|| die "junit resource dir"
	cp src/etc/{junit-frames,junit-noframes,junit-frames-saxon,junit-noframes-saxon}.xsl \
		ant-junit/src/resources/org/apache/tools/ant/taskdefs/optional/junit/xsl \
		|| die "junit resources"
}

src_compile() {
	einfo "Compiling ant-launcher.jar"
	JAVA_JAR_FILENAME="ant-launcher.jar"
	JAVA_MAIN_CLASS="org.apache.tools.ant.launch.Launcher"
	JAVA_SRC_DIR="ant-launcher/src/main"
	java-pkg-simple_src_compile
	JAVA_GENTOO_CLASSPATH_EXTRA+=":ant-launcher.jar"
	rm -r target || die

	einfo "Compiling ant.jar"
	JAVA_JAR_FILENAME="ant.jar"
	JAVA_LAUNCHER_FILENAME="ant"
	JAVA_MAIN_CLASS="org.apache.tools.ant.Main"
	JAVA_RESOURCE_DIRS="ant/resources"
	JAVA_SRC_DIR="ant"
	java-pkg-simple_src_compile
	JAVA_GENTOO_CLASSPATH_EXTRA+=":ant.jar"
	rm -r target || die

	local task
	for task in "${ANT_TASKS[@]}"; do
		einfo "Compiling ${task}"
		JAVA_JAR_FILENAME="${task}.jar"
		JAVA_MAIN_CLASS=""
		JAVA_RESOURCE_DIRS=""
		JAVA_SRC_DIR=""

		JAVA_SRC_DIR="${task}/src/main"
		taskdeps ant-apache-bcel bcel
		taskdeps ant-apache-bsf bsf-2.3
		taskdeps ant-apache-log4j log4j-12-api-2
		taskdeps ant-apache-oro jakarta-oro-2.0
		taskdeps ant-apache-regexp jakarta-regexp-1.4
		taskdeps ant-apache-resolver xml-commons-resolver
		taskdeps ant-apache-xalan2 xalan
		taskdeps ant-commons-logging commons-logging
		taskdeps ant-commons-net commons-net
		taskdeps ant-jai sun-jai-bin
		taskdeps ant-jakartamail jakarta-mail
		taskdeps ant-javamail 'javax-mail jakarta-activation-api-1'
		taskdeps ant-jdepend jdepend
		taskdeps ant-jsch jsch
		taskdeps ant-junit junit-4 ant-junit/src/resources
		taskdeps ant-junit4 junit-4
		taskdeps ant-junitlauncher junit-5
		# $(use netrexx && echo ant-netrexx)
		taskdeps ant-xz xz-java

		java-pkg-simple_src_compile
		JAVA_GENTOO_CLASSPATH_EXTRA+=":${task}.jar"
		rm -fr target || die
	done
	use doc && ejavadoc
}

src_test() {
	# Avoid "--with-dependencies" as used by JAVA_TEST_GENTOO_CLASSPATH.
	# dev-java/antunit has a circular dependency with dev-java/ant[test]
	JAVA_GENTOO_CLASSPATH_EXTRA+=":$(java-pkg_getjars --build-only antunit)"
	# according to line 115 src/etc/poms/ant/pom.xml
	jar -cvf src/etc/testcases/org/apache/tools/ant/taskdefs/test2-antlib.jar \
		-C src/etc/testcases taskdefs/test.antlib.xml || die "cannot test2-antlib.jar"

	JAVA_TEST_EXCLUDES=(
		# according to lines 1956-1964 build.xml (abstract classes, not testcases)
		org.apache.tools.ant.taskdefs.TaskdefsTest
		org.apache.tools.ant.BuildFileTest
		org.apache.tools.ant.util.regexp.RegexpMatcherTest
		org.apache.tools.ant.util.regexp.RegexpTest
		org.apache.tools.ant.types.selectors.BaseSelectorTest
		# according to line 1970 build.xml (helper classes, not testcases)
		org.apache.tools.ant.TestHelper
		# lines 2097-2102 build.xml (interactive tests)
		org.apache.tools.ant.taskdefs.TestProcess			# 1. No runnable methods
		# 1) testAll(org.apache.tools.ant.taskdefs.InitializeClassTest)
		# /var/tmp/portage/dev-java/ant-1.10.14/work/apache-ant-1.10.14/
		# src/etc/testcases/taskdefs/initializeclass.xml:24: Java returned: 1
		# 	<pathelement path="${build.tests.value}"/>
		# 	<pathelement location="${java.home}/lib/classes.zip"/>
		org.apache.tools.ant.taskdefs.InitializeClassTest	# Tests run: 1,  Failures: 1
	)

#	tests with patches to be revisited
#	JAVA_TEST_RUN_ONLY=(
#		org.apache.tools.ant.taskdefs.AntlibTest			# Tests run: 6,  Failures: 1 test2-antlib.jar?
#		org.apache.tools.ant.taskdefs.AntTest				# Tests run: 32,  Failures: 1
#		org.apache.tools.ant.taskdefs.JavaTest				# Tests run: 38,  Failures: 12
#		org.apache.tools.ant.taskdefs.modules.LinkTest		# Tests run: 67,  Failures: 4
#		org.apache.tools.ant.types.PathTest					# Tests run: 33,  Failures: 1
#	)

	# according to lines 276-297 src/etc/poms/ant/pom.xml
	JAVA_TEST_EXTRA_ARGS=(
		-Dant.home="${ANT_HOME}"
		-Dbuild.classes.value=../../../target/test-classes	# needed for org.apache.tools.ant.taskdefs.SignJarTest
		-Dbuild.tests.value=target/test-classes
		-Doffline=true
		-Dant.test.basedir.ignore=true
	)
	java-pkg-simple_src_test
}

src_install() {
	java-pkg_dojar ant.jar ant-launcher.jar

	# Compatibility symlink, should be removed after transition period.
	dosym -r /usr/share/ant{,-core}/lib/ant.jar

	for task in "${ANT_TASKS[@]}"; do
		java-pkg_dojar "${task}.jar"
		java-pkg_register-ant-task --version "${PV}" "${task}"
	done

	dobin src/script/ant

	dodir /usr/share/ant/bin
	for each in antRun antRun.pl runant.pl runant.py ; do
		dobin "${S}/src/script/${each}"
	done

	insinto /usr/share/ant/etc
	doins -r src/etc/*.xsl
	insinto /usr/share/ant/etc/checkstyle
	doins -r src/etc/checkstyle/*.xsl

	echo "ANT_HOME=\"${EPREFIX}/usr/share/ant\"" > "${T}/20ant"
	doenvd "${T}/20ant"

	einstalldocs
	if use doc; then
		java-pkg_dojavadoc target/api
		docinto html
		dodoc -r manual
	fi

	use source && java-pkg_dosrc src/main/*
}