1 |
# Copyright 1999-2005 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.60 2006/12/18 13:41:12 flameeyes Exp $ |
4 |
# |
5 |
# Author: Diego Pettenò <flameeyes@gentoo.org> |
6 |
# Enhancements: Martin Schlemmer <azarah@gentoo.org> |
7 |
# |
8 |
# This eclass is for handling autotooled software packages that |
9 |
# needs to regenerate their build scripts. |
10 |
# |
11 |
# NB: If you add anything, please comment it! |
12 |
|
13 |
inherit eutils libtool |
14 |
|
15 |
_automake_atom="sys-devel/automake" |
16 |
_autoconf_atom="sys-devel/autoconf" |
17 |
if [[ -n ${WANT_AUTOMAKE} ]]; then |
18 |
case ${WANT_AUTOMAKE} in |
19 |
# workaround while we have different versions of automake in arch and ~arch |
20 |
latest) _automake_atom="|| ( =sys-devel/automake-1.10* =sys-devel/automake-1.9* )" ;; |
21 |
*) _automake_atom="=sys-devel/automake-${WANT_AUTOMAKE}*" ;; |
22 |
esac |
23 |
fi |
24 |
|
25 |
if [[ -n ${WANT_AUTOCONF} ]] ; then |
26 |
case ${WANT_AUTOCONF} in |
27 |
2.1) _autoconf_atom="=sys-devel/autoconf-${WANT_AUTOCONF}*" ;; |
28 |
latest | 2.5) _autoconf_atom=">=sys-devel/autoconf-2.59" ;; |
29 |
esac |
30 |
fi |
31 |
DEPEND="${_automake_atom} |
32 |
${_autoconf_atom} |
33 |
sys-devel/libtool" |
34 |
RDEPEND="" |
35 |
unset _automake_atom _autoconf_atom |
36 |
|
37 |
# Variables: |
38 |
# |
39 |
# AT_M4DIR - Additional director(y|ies) aclocal should search |
40 |
# AM_OPTS - Additional options to pass to automake during |
41 |
# eautoreconf call. |
42 |
# AT_NOELIBTOOLIZE - Don't run elibtoolize command if set to 'yes', |
43 |
# useful when elibtoolize needs to be ran with |
44 |
# particular options |
45 |
|
46 |
# Functions: |
47 |
# |
48 |
# eautoreconf() - Should do a full autoreconf - normally what most people |
49 |
# will be interested in. Also should handle additional |
50 |
# directories specified by AC_CONFIG_SUBDIRS. |
51 |
# eaclocal() - Runs aclocal. Respects AT_M4DIR for additional directories |
52 |
# to search for macro's. |
53 |
# _elibtoolize() - Runs libtoolize. Note the '_' prefix .. to not collide |
54 |
# with elibtoolize() from libtool.eclass |
55 |
# eautoconf - Runs autoconf. |
56 |
# eautoheader - Runs autoheader. |
57 |
# eautomake - Runs automake |
58 |
# |
59 |
|
60 |
# XXX: M4DIR should be depreciated |
61 |
AT_M4DIR=${AT_M4DIR:-${M4DIR}} |
62 |
AT_GNUCONF_UPDATE="no" |
63 |
|
64 |
|
65 |
# This function mimes the behavior of autoreconf, but uses the different |
66 |
# eauto* functions to run the tools. It doesn't accept parameters, but |
67 |
# the directory with include files can be specified with AT_M4DIR variable. |
68 |
eautoreconf() { |
69 |
local pwd=$(pwd) x auxdir |
70 |
|
71 |
if [[ -z ${AT_NO_RECURSIVE} ]]; then |
72 |
# Take care of subdirs |
73 |
for x in $(autotools_get_subdirs); do |
74 |
if [[ -d ${x} ]] ; then |
75 |
cd "${x}" |
76 |
AT_NOELIBTOOLIZE="yes" eautoreconf |
77 |
cd "${pwd}" |
78 |
fi |
79 |
done |
80 |
fi |
81 |
|
82 |
auxdir=$(autotools_get_auxdir) |
83 |
|
84 |
einfo "Running eautoreconf in '$(pwd)' ..." |
85 |
[[ -n ${auxdir} ]] && mkdir -p ${auxdir} |
86 |
eaclocal |
87 |
_elibtoolize --copy --force |
88 |
eautoconf |
89 |
eautoheader |
90 |
FROM_EAUTORECONF="yes" eautomake ${AM_OPTS} |
91 |
|
92 |
[[ ${AT_NOELIBTOOLIZE} == "yes" ]] && return 0 |
93 |
|
94 |
# Call it here to prevent failures due to elibtoolize called _before_ |
95 |
# eautoreconf. |
96 |
elibtoolize |
97 |
|
98 |
return 0 |
99 |
} |
100 |
|
101 |
# These functions runs the autotools using autotools_run_tool with the |
102 |
# specified parametes. The name of the tool run is the same of the function |
103 |
# without e prefix. |
104 |
# They also force installing the support files for safety. |
105 |
eaclocal() { |
106 |
local aclocal_opts |
107 |
|
108 |
if [[ -n ${AT_M4DIR} ]] ; then |
109 |
for x in ${AT_M4DIR} ; do |
110 |
case "${x}" in |
111 |
"-I") |
112 |
# We handle it below |
113 |
;; |
114 |
*) |
115 |
[[ ! -d ${x} ]] && ewarn "eaclocal: '${x}' does not exist" |
116 |
aclocal_opts="${aclocal_opts} -I ${x}" |
117 |
;; |
118 |
esac |
119 |
done |
120 |
fi |
121 |
|
122 |
autotools_set_versions |
123 |
[[ ! -f aclocal.m4 || -n $(grep -e 'generated.*by aclocal' aclocal.m4) ]] && \ |
124 |
autotools_run_tool aclocal "$@" ${aclocal_opts} |
125 |
} |
126 |
|
127 |
_elibtoolize() { |
128 |
local opts |
129 |
local lttest |
130 |
|
131 |
# Check if we should run libtoolize (AM_PROG_LIBTOOL is an older macro, |
132 |
# check for both it and the current AC_PROG_LIBTOOL) |
133 |
lttest="$(autotools_check_macro "AC_PROG_LIBTOOL")$(autotools_check_macro "AM_PROG_LIBTOOL")" |
134 |
[[ -n $lttest ]] || return 0 |
135 |
|
136 |
[[ -f Makefile.am ]] && opts="--automake" |
137 |
|
138 |
[[ "${USERLAND}" == "Darwin" ]] && LIBTOOLIZE="glibtoolize" |
139 |
autotools_run_tool ${LIBTOOLIZE:-libtoolize} "$@" ${opts} |
140 |
|
141 |
# Need to rerun aclocal |
142 |
eaclocal |
143 |
} |
144 |
|
145 |
eautoheader() { |
146 |
# Check if we should run autoheader |
147 |
[[ -n $(autotools_check_macro "AC_CONFIG_HEADERS") ]] || return 0 |
148 |
autotools_set_versions |
149 |
NO_FAIL=1 autotools_run_tool autoheader "$@" |
150 |
} |
151 |
|
152 |
eautoconf() { |
153 |
if [[ ! -f configure.ac && ! -f configure.in ]] ; then |
154 |
echo |
155 |
eerror "No configure.{ac,in} present in '$(pwd | sed -e 's:.*/::')'!" |
156 |
echo |
157 |
die "No configure.{ac,in} present!" |
158 |
fi |
159 |
|
160 |
autotools_set_versions |
161 |
autotools_run_tool autoconf "$@" |
162 |
} |
163 |
|
164 |
eautomake() { |
165 |
local extra_opts |
166 |
|
167 |
[[ -f Makefile.am ]] || return 0 |
168 |
|
169 |
autotools_set_versions |
170 |
if [[ -z ${FROM_EAUTORECONF} && -f Makefile.in ]]; then |
171 |
local used_automake |
172 |
local installed_automake |
173 |
|
174 |
installed_automake=$(automake --version | head -n 1 | \ |
175 |
sed -e 's:.*(GNU automake) ::') |
176 |
used_automake=$(head -n 1 < Makefile.in | \ |
177 |
sed -e 's:.*by automake \(.*\) from .*:\1:') |
178 |
|
179 |
if [[ ${installed_automake} != ${used_automake} ]]; then |
180 |
einfo "Automake used for the package (${used_automake}) differs from" |
181 |
einfo "the installed version (${installed_automake})." |
182 |
eautoreconf |
183 |
return 0 |
184 |
fi |
185 |
fi |
186 |
|
187 |
[[ -f INSTALL && -f AUTHORS && -f ChangeLog && -f NEWS ]] \ |
188 |
|| extra_opts="${extra_opts} --foreign" |
189 |
|
190 |
# --force-missing seems not to be recognized by some flavours of automake |
191 |
autotools_run_tool automake --add-missing --copy ${extra_opts} "$@" |
192 |
} |
193 |
|
194 |
autotools_set_versions() { |
195 |
[[ -n ${autotools_version_sets} ]] && return 0 |
196 |
|
197 |
if [[ -n ${WANT_AUTOCONF} ]]; then |
198 |
[[ ${WANT_AUTOCONF} == "latest" ]] && WANT_AUTOCONF="2.5" |
199 |
export WANT_AUTOCONF |
200 |
einfo "Requested autoconf ${WANT_AUTOCONF}" |
201 |
einfo "Using $(autoconf --version 2>/dev/null | head -n 1)" |
202 |
einfo "Using $(autoheader --version 2>/dev/null | head -n 1)" |
203 |
else |
204 |
ewarn "QA Notice: \${WANT_AUTOCONF} variable unset. Please report on http://bugs.gentoo.org/" |
205 |
fi |
206 |
|
207 |
if [[ -n ${WANT_AUTOMAKE} ]]; then |
208 |
local latest_automake |
209 |
if [[ ${WANT_AUTOMAKE} == "latest" ]]; then |
210 |
latest_automake="latest: " |
211 |
for amver in 1.10 1.9 1.8 1.7 1.6; do |
212 |
WANT_AUTOMAKE="${amver}" |
213 |
ROOT=/ has_version =sys-devel/automake-${amver}* && break |
214 |
done |
215 |
fi |
216 |
export WANT_AUTOMAKE |
217 |
einfo "Requested automake ${latest_automake}${WANT_AUTOMAKE}" |
218 |
einfo "Using $(automake --version 2>/dev/null | head -n 1)" |
219 |
einfo "Using $(aclocal --version 2>/dev/null | head -n 1)" |
220 |
else |
221 |
ewarn "QA Notice: \${WANT_AUTOMAKE} variable unset. Please report on http://bugs.gentoo.org/" |
222 |
fi |
223 |
|
224 |
autotools_version_sets="yes" |
225 |
} |
226 |
|
227 |
# Internal function to run an autotools' tool |
228 |
autotools_run_tool() { |
229 |
local STDERR_TARGET="${T}/$$.out" |
230 |
local ris |
231 |
|
232 |
echo "***** $1 *****" > ${STDERR_TARGET%/*}/$1-${STDERR_TARGET##*/} |
233 |
echo >> ${STDERR_TARGET%/*}/$1-${STDERR_TARGET##*/} |
234 |
|
235 |
ebegin "Running $@" |
236 |
$@ >> ${STDERR_TARGET%/*}/$1-${STDERR_TARGET##*/} 2>&1 |
237 |
ris=$? |
238 |
eend ${ris} |
239 |
|
240 |
if [[ ${ris} != 0 && ${NO_FAIL} != 1 ]]; then |
241 |
echo |
242 |
eerror "Failed Running $1 !" |
243 |
eerror |
244 |
eerror "Include in your bugreport the contents of:" |
245 |
eerror |
246 |
eerror " ${STDERR_TARGET%/*}/$1-${STDERR_TARGET##*/}" |
247 |
echo |
248 |
die "Failed Running $1 !" |
249 |
fi |
250 |
} |
251 |
|
252 |
# Internal function to check for support |
253 |
autotools_check_macro() { |
254 |
[[ -f configure.ac || -f configure.in ]] && \ |
255 |
WANT_AUTOCONF="2.5" autoconf --trace=$1 2>/dev/null |
256 |
return 0 |
257 |
} |
258 |
|
259 |
# Internal function to get additional subdirs to configure |
260 |
autotools_get_subdirs() { |
261 |
local subdirs_scan_out |
262 |
|
263 |
subdirs_scan_out=$(autotools_check_macro "AC_CONFIG_SUBDIRS") |
264 |
[[ -n ${subdirs_scan_out} ]] || return 0 |
265 |
|
266 |
echo "${subdirs_scan_out}" | gawk \ |
267 |
'($0 !~ /^[[:space:]]*(#|dnl)/) { |
268 |
if (match($0, /AC_CONFIG_SUBDIRS:(.*)$/, res)) |
269 |
print res[1] |
270 |
}' | uniq |
271 |
|
272 |
return 0 |
273 |
} |
274 |
|
275 |
autotools_get_auxdir() { |
276 |
local auxdir_scan_out |
277 |
|
278 |
auxdir_scan_out=$(autotools_check_macro "AC_CONFIG_AUX_DIR") |
279 |
[[ -n ${auxdir_scan_out} ]] || return 0 |
280 |
|
281 |
echo ${auxdir_scan_out} | gawk \ |
282 |
'($0 !~ /^[[:space:]]*(#|dnl)/) { |
283 |
if (match($0, /AC_CONFIG_AUX_DIR:(.*)$/, res)) |
284 |
print res[1] |
285 |
}' | uniq |
286 |
|
287 |
return 0 |
288 |
} |