/[gentoo-x86]/eclass/autotools.eclass
Gentoo

Contents of /eclass/autotools.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.86 - (show annotations) (download)
Mon May 18 11:24:30 2009 UTC (5 years, 4 months ago) by flameeyes
Branch: MAIN
Changes since 1.85: +8 -3 lines
Replace the “latest” string with the correct version during the autotools_run_tool.

Instead of doing that during the main evaluation, wait for it, so that
it's done at the very last moment; this solves bug #270010 properly,
without forcing an older automake version.

It should also be possible to move the latest handling into the
wrappers and use them if the new version is present, but that's
another problem.

1 # Copyright 1999-2008 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/autotools.eclass,v 1.85 2009/05/04 22:27:05 vapier Exp $
4
5 # @ECLASS: autotools.eclass
6 # @MAINTAINER:
7 # base-system@gentoo.org
8 # @BLURB: Regenerates auto* build scripts
9 # @DESCRIPTION:
10 # This eclass is for safely handling autotooled software packages that need to
11 # regenerate their build scripts. All functions will abort in case of errors.
12 #
13 # NB: If you add anything, please comment it!
14
15 inherit eutils libtool
16
17 # @ECLASS-VARIABLE: WANT_AUTOCONF
18 # @DESCRIPTION:
19 # The major version of autoconf your package needs
20 [[ -z ${WANT_AUTOCONF} ]] && WANT_AUTOCONF="latest"
21
22 # @ECLASS-VARIABLE: WANT_AUTOMAKE
23 # @DESCRIPTION:
24 # The major version of automake your package needs
25 [[ -z ${WANT_AUTOMAKE} ]] && WANT_AUTOMAKE="latest"
26
27 _automake_atom="sys-devel/automake"
28 _autoconf_atom="sys-devel/autoconf"
29 if [[ -n ${WANT_AUTOMAKE} ]]; then
30 case ${WANT_AUTOMAKE} in
31 none) _automake_atom="" ;; # some packages don't require automake at all
32 # if you change the “latest” version here, change also autotools_run_tool
33 latest) _automake_atom="=sys-devel/automake-1.10*" ;;
34 *) _automake_atom="=sys-devel/automake-${WANT_AUTOMAKE}*" ;;
35 esac
36 export WANT_AUTOMAKE
37 fi
38
39 if [[ -n ${WANT_AUTOCONF} ]] ; then
40 case ${WANT_AUTOCONF} in
41 none) _autoconf_atom="" ;; # some packages don't require autoconf at all
42 2.1) _autoconf_atom="=sys-devel/autoconf-${WANT_AUTOCONF}*" ;;
43 # if you change the “latest” version here, change also autotools_run_tool
44 latest|2.5) _autoconf_atom=">=sys-devel/autoconf-2.61" ;;
45 *) _autoconf_atom="INCORRECT-WANT_AUTOCONF-SETTING-IN-EBUILD" ;;
46 esac
47 export WANT_AUTOCONF
48 fi
49 DEPEND="${_automake_atom}
50 ${_autoconf_atom}"
51 [[ ${CATEGORY}/${PN} != "sys-devel/libtool" ]] && DEPEND="${DEPEND} sys-devel/libtool"
52 RDEPEND=""
53 unset _automake_atom _autoconf_atom
54
55 # @ECLASS-VARIABLE: AM_OPTS
56 # @DESCRIPTION:
57 # Additional options to pass to automake during
58 # eautoreconf call.
59
60 # @ECLASS-VARIABLE: AT_NOELIBTOOLIZE
61 # @DESCRIPTION:
62 # Don't run elibtoolize command if set to 'yes',
63 # useful when elibtoolize needs to be ran with
64 # particular options
65
66 # XXX: M4DIR should be deprecated
67 # @ECLASS-VARIABLE: AT_M4DIR
68 # @DESCRIPTION:
69 # Additional director(y|ies) aclocal should search
70 AT_M4DIR=${AT_M4DIR:-${M4DIR}}
71 AT_GNUCONF_UPDATE="no"
72
73
74 # @FUNCTION: eautoreconf
75 # @DESCRIPTION:
76 # This function mimes the behavior of autoreconf, but uses the different
77 # eauto* functions to run the tools. It doesn't accept parameters, but
78 # the directory with include files can be specified with AT_M4DIR variable.
79 #
80 # Should do a full autoreconf - normally what most people will be interested in.
81 # Also should handle additional directories specified by AC_CONFIG_SUBDIRS.
82 eautoreconf() {
83 local pwd=$(pwd) x auxdir g=
84
85 if [[ -z ${AT_NO_RECURSIVE} ]]; then
86 # Take care of subdirs
87 for x in $(autotools_get_subdirs); do
88 if [[ -d ${x} ]] ; then
89 cd "${x}"
90 AT_NOELIBTOOLIZE="yes" eautoreconf
91 cd "${pwd}"
92 fi
93 done
94 fi
95
96 auxdir=$(autotools_get_auxdir)
97
98 einfo "Running eautoreconf in '$(pwd)' ..."
99 [[ -n ${auxdir} ]] && mkdir -p ${auxdir}
100 eaclocal
101 [[ ${CHOST} == *-darwin* ]] && g=g
102 if ${LIBTOOLIZE:-${g}libtoolize} -n --install >& /dev/null ; then
103 _elibtoolize --copy --force --install
104 else
105 _elibtoolize --copy --force
106 fi
107 eautoconf
108 eautoheader
109 FROM_EAUTORECONF="yes" eautomake ${AM_OPTS}
110
111 [[ ${AT_NOELIBTOOLIZE} == "yes" ]] && return 0
112
113 # Call it here to prevent failures due to elibtoolize called _before_
114 # eautoreconf. We set $S because elibtoolize runs on that #265319
115 S=${pwd} elibtoolize
116
117 return 0
118 }
119
120 # @FUNCTION: eaclocal
121 # @DESCRIPTION:
122 # These functions runs the autotools using autotools_run_tool with the
123 # specified parametes. The name of the tool run is the same of the function
124 # without e prefix.
125 # They also force installing the support files for safety.
126 # Respects AT_M4DIR for additional directories to search for macro's.
127 eaclocal() {
128 local aclocal_opts
129
130 local amflags_file
131 for amflags_file in GNUmakefile.am Makefile.am GNUmakefile.in Makefile.in ; do
132 [[ -e ${amflags_file} ]] || continue
133 aclocal_opts=$(sed -n '/^ACLOCAL_AMFLAGS[[:space:]]*=/s:[^=]*=::p' ${amflags_file})
134 eval aclocal_opts=\"${aclocal_opts}\"
135 break
136 done
137
138 if [[ -n ${AT_M4DIR} ]] ; then
139 for x in ${AT_M4DIR} ; do
140 case "${x}" in
141 "-I")
142 # We handle it below
143 ;;
144 *)
145 [[ ! -d ${x} ]] && ewarn "eaclocal: '${x}' does not exist"
146 aclocal_opts="${aclocal_opts} -I ${x}"
147 ;;
148 esac
149 done
150 fi
151
152 [[ ! -f aclocal.m4 || -n $(grep -e 'generated.*by aclocal' aclocal.m4) ]] && \
153 autotools_run_tool aclocal "$@" ${aclocal_opts}
154 }
155
156 # @FUNCTION: _elibtoolize
157 # @DESCRIPTION:
158 # Runs libtoolize. Note the '_' prefix .. to not collide with elibtoolize() from
159 # libtool.eclass.
160 _elibtoolize() {
161 local opts g=
162
163 # Check if we should run libtoolize (AM_PROG_LIBTOOL is an older macro,
164 # check for both it and the current AC_PROG_LIBTOOL)
165 [[ -n $(autotools_check_macro AC_PROG_LIBTOOL AM_PROG_LIBTOOL LT_INIT) ]] || return 0
166
167 [[ -f GNUmakefile.am || -f Makefile.am ]] && opts="--automake"
168
169 [[ ${CHOST} == *-darwin* ]] && g=g
170 autotools_run_tool ${LIBTOOLIZE:-${g}libtoolize} "$@" ${opts}
171
172 # Need to rerun aclocal
173 eaclocal
174 }
175
176 # @FUNCTION: eautoheader
177 # @DESCRIPTION:
178 # Runs autoheader.
179 eautoheader() {
180 # Check if we should run autoheader
181 [[ -n $(autotools_check_macro "AC_CONFIG_HEADERS") ]] || return 0
182 NO_FAIL=1 autotools_run_tool autoheader "$@"
183 }
184
185 # @FUNCTION: eautoconf
186 # @DESCRIPTION:
187 # Runs autoconf.
188 eautoconf() {
189 if [[ ! -f configure.ac && ! -f configure.in ]] ; then
190 echo
191 eerror "No configure.{ac,in} present in '$(pwd | sed -e 's:.*/::')'!"
192 echo
193 die "No configure.{ac,in} present!"
194 fi
195
196 autotools_run_tool autoconf "$@"
197 }
198
199 # @FUNCTION: eautomake
200 # @DESCRIPTION:
201 # Runs automake.
202 eautomake() {
203 local extra_opts
204 local makefile_name
205
206 if [[ -f GNUmakefile.am ]]; then
207 makefile_name="GNUmakefile"
208 elif [[ -f Makefile.am ]]; then
209 makefile_name="Makefile"
210 else
211 return 0
212 fi
213
214 if [[ -z ${FROM_EAUTORECONF} && -f ${makefile_name}.in ]]; then
215 local used_automake
216 local installed_automake
217
218 installed_automake=$(automake --version | head -n 1 | \
219 sed -e 's:.*(GNU automake) ::')
220 used_automake=$(head -n 1 < ${makefile_name}.in | \
221 sed -e 's:.*by automake \(.*\) from .*:\1:')
222
223 if [[ ${installed_automake} != ${used_automake} ]]; then
224 einfo "Automake used for the package (${used_automake}) differs from"
225 einfo "the installed version (${installed_automake})."
226 eautoreconf
227 return 0
228 fi
229 fi
230
231 [[ -f INSTALL && -f AUTHORS && -f ChangeLog && -f NEWS ]] \
232 || extra_opts="${extra_opts} --foreign"
233
234 # --force-missing seems not to be recognized by some flavours of automake
235 autotools_run_tool automake --add-missing --copy ${extra_opts} "$@"
236 }
237
238 # Internal function to run an autotools' tool
239 autotools_run_tool() {
240 if [[ ${EBUILD_PHASE} != "unpack" && ${EBUILD_PHASE} != "prepare" ]]; then
241 ewarn "QA Warning: running $1 in ${EBUILD_PHASE} phase"
242 fi
243
244 # We do the “latest” → version switch here because it solves
245 # possible order problems, see bug #270010 as an example.
246 [[ ${WANT_AUTOMAKE} == "latest" ]] && export WANT_AUTOMAKE=1.10
247 [[ ${WANT_AUTOCONF} == "latest" ]] && export WANT_AUTOCONF=2.5
248
249 local STDERR_TARGET="${T}/$1.out"
250 # most of the time, there will only be one run, but if there are
251 # more, make sure we get unique log filenames
252 if [[ -e ${STDERR_TARGET} ]] ; then
253 STDERR_TARGET="${T}/$1-$$.out"
254 fi
255
256 printf "***** $1 *****\n***** PWD: ${PWD}\n***** $*\n\n" > "${STDERR_TARGET}"
257
258 ebegin "Running $@"
259 "$@" >> "${STDERR_TARGET}" 2>&1
260 eend $?
261
262 if [[ $? != 0 && ${NO_FAIL} != 1 ]] ; then
263 echo
264 eerror "Failed Running $1 !"
265 eerror
266 eerror "Include in your bugreport the contents of:"
267 eerror
268 eerror " ${STDERR_TARGET}"
269 echo
270 die "Failed Running $1 !"
271 fi
272 }
273
274 # Internal function to check for support
275 autotools_check_macro() {
276 [[ -f configure.ac || -f configure.in ]] || return 0
277 local macro
278 for macro ; do
279 WANT_AUTOCONF="2.5" autoconf --trace="${macro}" 2>/dev/null
280 done
281 return 0
282 }
283
284 # Internal function to get additional subdirs to configure
285 autotools_get_subdirs() {
286 local subdirs_scan_out
287
288 subdirs_scan_out=$(autotools_check_macro "AC_CONFIG_SUBDIRS")
289 [[ -n ${subdirs_scan_out} ]] || return 0
290
291 echo "${subdirs_scan_out}" | gawk \
292 '($0 !~ /^[[:space:]]*(#|dnl)/) {
293 if (match($0, /AC_CONFIG_SUBDIRS:(.*)$/, res))
294 print res[1]
295 }' | uniq
296
297 return 0
298 }
299
300 autotools_get_auxdir() {
301 local auxdir_scan_out
302
303 auxdir_scan_out=$(autotools_check_macro "AC_CONFIG_AUX_DIR")
304 [[ -n ${auxdir_scan_out} ]] || return 0
305
306 echo ${auxdir_scan_out} | gawk \
307 '($0 !~ /^[[:space:]]*(#|dnl)/) {
308 if (match($0, /AC_CONFIG_AUX_DIR:(.*)$/, res))
309 print res[1]
310 }' | uniq
311
312 return 0
313 }

  ViewVC Help
Powered by ViewVC 1.1.20