Gentoo Archives: gentoo-dev

From: Florian Schmaus <flow@g.o>
To: gentoo-dev@l.g.o
Cc: Florian Schmaus <flow@g.o>
Subject: [gentoo-dev] [PATCH] gradle.eclass: add new eclass
Date: Fri, 06 Jan 2023 17:21:22
Message-Id: 20230106172051.274199-2-flow@gentoo.org
In Reply to: [gentoo-dev] RFC: new gradle.eclass by Florian Schmaus
1 Signed-off-by: Florian Schmaus <flow@g.o>
2 ---
3 eclass/gradle.eclass | 149 +++++++++++++++++++++++++++++++++++++++++
4 eclass/tests/gradle.sh | 62 +++++++++++++++++
5 2 files changed, 211 insertions(+)
6 create mode 100644 eclass/gradle.eclass
7 create mode 100755 eclass/tests/gradle.sh
8
9 diff --git a/eclass/gradle.eclass b/eclass/gradle.eclass
10 new file mode 100644
11 index 000000000000..a321262612d0
12 --- /dev/null
13 +++ b/eclass/gradle.eclass
14 @@ -0,0 +1,149 @@
15 +# Copyright 2021-2023 Gentoo Authors
16 +# Distributed under the terms of the GNU General Public License v2
17 +
18 +# @ECLASS: gradle.eclass
19 +# @MAINTAINER:
20 +# Gentoo Java Project <java@g.o>
21 +# @AUTHOR:
22 +# Florian Schmaus <flow@g.o>
23 +# @BLURB: Utility functions for the gradle build system.
24 +# @DESCRIPTION:
25 +# Utility functions for the gradle build system.
26 +
27 +case ${EAPI} in
28 + 7|8) ;;
29 + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
30 +esac
31 +
32 +if [[ -z ${_GRADLE_ECLASS} ]] ; then
33 +_GRADLE_ECLASS=1
34 +
35 +inherit edo
36 +
37 +# @ECLASS_VARIABLE: EGRADLE_MIN
38 +# @DEFAULT_UNSET
39 +# @DESCRIPTION:
40 +# Minimum required gradle version.
41 +
42 +# @ECLASS_VARIABLE: EGRADLE_MAX_EXCLUSIVE
43 +# @DEFAULT_UNSET
44 +# @DESCRIPTION:
45 +# First gradle version that is not supported.
46 +
47 +# @ECLASS_VARIABLE: EGRADLE_EXACT_VER
48 +# @DEFAULT_UNSET
49 +# @DESCRIPTION:
50 +# The exact required gradle version.
51 +
52 +# @ECLASS_VARIABLE: EGRADLE_PARALLEL
53 +# @DESCRIPTION:
54 +# Set to the 'true', the default, to invoke gradle with --parallel. Set
55 +# to 'false' to disable parallel gradle builds.
56 +: "${EGRADLE_PARALLEL=true}"
57 +
58 +# @ECLASS_VARIABLE: EGRADLE_USER_HOME
59 +# @DESCRIPTION:
60 +# Directroy used as the user's home directory by gradle. Defaults to
61 +# ${T}/gradle_user_home
62 +: "${EGRADLE_USER_HOME="${T}/gradle_user_home"}"
63 +
64 +# @ECLASS_VARIABLE: EGRADLE_OVERWRITE
65 +# @USER_VARIABLE
66 +# @DEFAULT_UNSET
67 +# @DESCRIPTION:
68 +# User-specified overwrite of the used gradle binary.
69 +
70 +# @FUNCTION: gradle-set_EGRADLE
71 +# @DESCRIPTION:
72 +# Set the EGRADLE environment variable.
73 +gradle-set_EGRADLE() {
74 + [[ -n ${EGRADLE} ]] && return
75 +
76 + if [[ -n ${EGRADLE_OVERWRITE} ]]; then
77 + export EGRADLE="${EGRADLE_OVERWRITE}"
78 + return
79 + fi
80 +
81 + local candidates candidate selected selected_ver
82 +
83 + candidates=$(compgen -c gradle-)
84 + for candidate in ${candidates}; do
85 + if [[ ! ${candidate} =~ gradle(-bin)?-([.0-9]+) ]]; then
86 + continue
87 + fi
88 +
89 + local ver
90 + if (( ${#BASH_REMATCH[@]} == 3 )); then
91 + ver="${BASH_REMATCH[2]}"
92 + else
93 + ver="${BASH_REMATCH[1]}"
94 + fi
95 +
96 + if [[ -n ${EGRADLE_EXACT_VER} ]]; then
97 + ver_test "${ver}" -ne "${EGRADLE_EXACT_VER}" && continue
98 +
99 + selected="${candidate}"
100 + selected_ver="${ver}"
101 + break
102 + fi
103 +
104 + if [[ -n ${EGRADLE_MIN} ]] \
105 + && ver_test "${ver}" -lt "${EGRADLE_MIN}"; then
106 + # Candidate does not satisfy EGRADLE_MIN condition.
107 + continue
108 + fi
109 +
110 + if [[ -n ${EGRADLE_MAX_EXCLUSIVE} ]] \
111 + && ver_test "${ver}" -ge "${EGRADLE_MAX_EXCLUSIVE}"; then
112 + # Candidate does not satisfy EGRADLE_MAX_EXCLUSIVE condition.
113 + continue
114 + fi
115 +
116 + if [[ -n ${selected_ver} ]] \
117 + && ver_test "${selected_ver}" -gt "${ver}"; then
118 + # Candidate is older than the currently selected candidate.
119 + continue
120 + fi
121 +
122 + selected="${candidate}"
123 + selected_ver="${ver}"
124 + done
125 +
126 + if [[ -z ${selected} ]]; then
127 + die "Could not find (suitable) gradle installation in PATH"
128 + fi
129 +
130 + export EGRADLE="${selected}"
131 + export EGRADLE_VER="${ver}"
132 +}
133 +
134 +# @FUNCTION: egradle
135 +# @USAGE: [gradle-args]
136 +# @DESCRIPTION:
137 +# Invoke gradle with the optionally provided arguments.
138 +egradle() {
139 + gradle-set_EGRADLE
140 +
141 + local gradle_args=(
142 + --console=plain
143 + --info
144 + --stacktrace
145 + --no-daemon
146 + --offline
147 + --no-build-cache
148 + --gradle-user-home "${EGRADLE_USER_HOME}"
149 + --project-cache-dir "${T}/gradle_project_cache"
150 + )
151 +
152 + if $EGRADLE_PARALLEL; then
153 + gradle_args+=( --parallel )
154 + fi
155 +
156 + local -x JAVA_TOOL_OPTIONS="-Duser.home=\"$T\""
157 + # TERM needed, otherwise gradle may fail on terms it does not know about
158 + TERM=xterm \
159 + edo \
160 + "${EGRADLE}" "${gradle_args[@]}" "${@}"
161 +}
162 +
163 +fi
164 diff --git a/eclass/tests/gradle.sh b/eclass/tests/gradle.sh
165 new file mode 100755
166 index 000000000000..61666c1bc60e
167 --- /dev/null
168 +++ b/eclass/tests/gradle.sh
169 @@ -0,0 +1,62 @@
170 +#!/usr/bin/env bash
171 +# Copyright 2022-2023 Gentoo Authors
172 +# Distributed under the terms of the GNU General Public License v2
173 +
174 +EAPI=8
175 +
176 +SCRIPT_DIR=$(cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd)
177 +cd "${SCRIPT_DIR}"
178 +
179 +source tests-common.sh || exit
180 +
181 +inherit gradle
182 +
183 +# TODO: hack because tests-common don't implement ver_cut
184 +EAPI=6 inherit eapi7-ver
185 +
186 +test_set_EGRADLE() {
187 + local expected_EGRADLE="${1}"
188 +
189 + shift
190 +
191 + local tmpdir
192 + tmpdir=$(mktemp -d || die)
193 + for pseudo_gradle in "${@}"; do
194 + local pseudo_gradle_path="${tmpdir}/${pseudo_gradle}"
195 + touch "${pseudo_gradle_path}"
196 + chmod 755 "${pseudo_gradle_path}"
197 + done
198 +
199 + local saved_PATH="${PATH}"
200 + PATH="${tmpdir}"
201 +
202 + local test_desc=(
203 + test_set_EGRADLE
204 + )
205 + [[ -v EGRADLE_MIN ]] && test_desc+=( "EGRADLE_MIN=${EGRADLE_MIN}" )
206 + [[ -v EGRADLE_MAX_EXCLUSIVE ]] && test_desc+=( "EGRADLE_MAX_EXCLUSIVE=${EGRADLE_MAX_EXCLUSIVE}" )
207 + test_desc+=( $@ )
208 +
209 + tbegin "${test_desc[@]}"
210 + gradle-set_EGRADLE
211 +
212 + local saved_EGRADLE="${EGRADLE}"
213 + unset EGRADLE
214 +
215 + PATH="${saved_PATH}"
216 + rm -rf "${tmpdir}"
217 +
218 + [[ "${saved_EGRADLE}" == "${expected_EGRADLE}" ]]
219 + tend $?
220 +
221 + if (( $? > 0 )); then
222 + >&2 echo -e "\t expected=${expected_EGRADLE} actual=${saved_EGRADLE}"
223 + fi
224 +}
225 +
226 +test_set_EGRADLE gradle-2.0 gradle-1.0 gradle-2.0
227 +EGRADLE_MIN=2.0 test_set_EGRADLE gradle-2.2.3 gradle-1.0 gradle-2.0 gradle-2.2.3
228 +EGRADLE_MAX_EXCLUSIVE=2.2 test_set_EGRADLE gradle-2.0 gradle-1.0 gradle-2.0 gradle-2.2.3
229 +
230 +
231 +texit
232 --
233 2.38.2

Replies

Subject Author
Re: [gentoo-dev] [PATCH] gradle.eclass: add new eclass Sam James <sam@g.o>
Re: [gentoo-dev] [PATCH] gradle.eclass: add new eclass Anna <cyber+gentoo@×××××.in>