1 # Copyright 1999-2015 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
4 # @ECLASS: autotools.eclass
6 # base-system@gentoo.org
7 # @BLURB: Regenerates auto* build scripts
9 # This eclass is for safely handling autotooled software packages that need to
10 # regenerate their build scripts. All functions will abort in case of errors.
12 # Note: We require GNU m4, as does autoconf. So feel free to use any features
13 # from the GNU version of m4 without worrying about other variants (i.e. BSD).
15 if [[ ${__AUTOTOOLS_AUTO_DEPEND+set} == "set" ]] ; then
16 # See if we were included already, but someone changed the value
17 # of AUTOTOOLS_AUTO_DEPEND on us. We could reload the entire
18 # eclass at that point, but that adds overhead, and it's trivial
19 # to re-order inherit in eclasses/ebuilds instead. #409611
20 if [[ ${__AUTOTOOLS_AUTO_DEPEND} != ${AUTOTOOLS_AUTO_DEPEND} ]] ; then
21 die "AUTOTOOLS_AUTO_DEPEND changed value between inherits; please inherit autotools.eclass first! ${__AUTOTOOLS_AUTO_DEPEND} -> ${AUTOTOOLS_AUTO_DEPEND}"
25 if [[ -z ${_AUTOTOOLS_ECLASS} ]]; then
30 # @ECLASS-VARIABLE: WANT_AUTOCONF
32 # The major version of autoconf your package needs
33 : ${WANT_AUTOCONF:=latest}
35 # @ECLASS-VARIABLE: WANT_AUTOMAKE
37 # The major version of automake your package needs
38 : ${WANT_AUTOMAKE:=latest}
40 # @ECLASS-VARIABLE: WANT_LIBTOOL
42 # Do you want libtool? Valid values here are "latest" and "none".
43 : ${WANT_LIBTOOL:=latest}
45 # @ECLASS-VARIABLE: _LATEST_AUTOMAKE
49 # The latest major version/slot of automake available on each arch. #312315
50 # We should list both the latest stable, and the latest unstable. #465732
51 # This way the stable builds will still work, but the unstable are allowed
52 # to build & test things for us ahead of time (if they have it installed).
53 # If a newer slot is stable on any arch, and is NOT reflected in this list,
54 # then circular dependencies may arise during emerge @system bootstraps.
55 # Do NOT change this variable in your ebuilds!
56 # If you want to force a newer minor version, you can specify the correct
57 # WANT value by using a colon: <PV>:<WANT_AUTOMAKE>
58 _LATEST_AUTOMAKE=( 1.15:1.15 )
60 _automake_atom="sys-devel/automake"
61 _autoconf_atom="sys-devel/autoconf"
62 if [[ -n ${WANT_AUTOMAKE} ]]; then
63 case ${WANT_AUTOMAKE} in
64 # Even if the package doesn't use automake, we still need to depend
65 # on it because we run aclocal to process m4 macros. This matches
66 # the autoreconf tool, so this requirement is correct. #401605
69 # Use SLOT deps if we can. For EAPI=0, we get pretty close.
70 if [[ ${EAPI:-0} != 0 ]] ; then
71 _automake_atom="|| ( `printf '>=sys-devel/automake-%s:%s ' ${_LATEST_AUTOMAKE[@]/:/ }` )"
73 _automake_atom="|| ( `printf '>=sys-devel/automake-%s ' ${_LATEST_AUTOMAKE[@]/%:*}` )"
76 *) _automake_atom="=sys-devel/automake-${WANT_AUTOMAKE}*" ;;
81 if [[ -n ${WANT_AUTOCONF} ]] ; then
82 case ${WANT_AUTOCONF} in
83 none) _autoconf_atom="" ;; # some packages don't require autoconf at all
84 2.1) _autoconf_atom="~sys-devel/autoconf-2.13" ;;
85 # if you change the "latest" version here, change also autotools_env_setup
86 latest|2.5) _autoconf_atom=">=sys-devel/autoconf-2.69" ;;
87 *) die "Invalid WANT_AUTOCONF value '${WANT_AUTOCONF}'" ;;
92 _libtool_atom=">=sys-devel/libtool-2.4"
93 if [[ -n ${WANT_LIBTOOL} ]] ; then
94 case ${WANT_LIBTOOL} in
95 none) _libtool_atom="" ;;
97 *) die "Invalid WANT_LIBTOOL value '${WANT_LIBTOOL}'" ;;
102 # Force people (nicely) to upgrade to a newer version of gettext as
103 # older ones are known to be crappy. #496454
104 AUTOTOOLS_DEPEND="!<sys-devel/gettext-0.18.1.1-r3
110 # @ECLASS-VARIABLE: AUTOTOOLS_AUTO_DEPEND
112 # Set to 'no' to disable automatically adding to DEPEND. This lets
113 # ebuilds former conditional depends by using ${AUTOTOOLS_DEPEND} in
114 # their own DEPEND string.
115 : ${AUTOTOOLS_AUTO_DEPEND:=yes}
116 if [[ ${AUTOTOOLS_AUTO_DEPEND} != "no" ]] ; then
117 DEPEND=${AUTOTOOLS_DEPEND}
119 __AUTOTOOLS_AUTO_DEPEND=${AUTOTOOLS_AUTO_DEPEND} # See top of eclass
121 unset _automake_atom _autoconf_atom
123 # @ECLASS-VARIABLE: AM_OPTS
126 # Additional options to pass to automake during
129 # @ECLASS-VARIABLE: AT_NOEAUTOMAKE
132 # Don't run eautomake command if set to 'yes'; only used to workaround
133 # broken packages. Generally you should, instead, fix the package to
134 # not call AM_INIT_AUTOMAKE if it doesn't actually use automake.
136 # @ECLASS-VARIABLE: AT_NOELIBTOOLIZE
139 # Don't run elibtoolize command if set to 'yes',
140 # useful when elibtoolize needs to be ran with
143 # @ECLASS-VARIABLE: AT_M4DIR
145 # Additional director(y|ies) aclocal should search
148 # @ECLASS-VARIABLE: AT_SYS_M4DIR
151 # For system integrators, a list of additional aclocal search paths.
152 # This variable gets eval-ed, so you can use variables in the definition
153 # that may not be valid until eautoreconf & friends are run.
156 # @FUNCTION: eautoreconf
158 # This function mimes the behavior of autoreconf, but uses the different
159 # eauto* functions to run the tools. It doesn't accept parameters, but
160 # the directory with include files can be specified with AT_M4DIR variable.
162 # Should do a full autoreconf - normally what most people will be interested in.
163 # Also should handle additional directories specified by AC_CONFIG_SUBDIRS.
167 # Subdirs often share a common build dir #529404. If so, we can't safely
168 # run in parallel because many tools clobber the content in there. Libtool
169 # and automake both `rm && cp` while aclocal reads the output. We might be
170 # able to handle this if we split the steps and grab locks on the dirs the
171 # tools actually write to. Then we'd run all the common tools that use
172 # those inputs. Doing this in bash does not scale easily.
173 # If we do re-enable parallel support, make sure #426512 is handled.
174 if [[ -z ${AT_NO_RECURSIVE} ]] ; then
175 # Take care of subdirs
176 for x in $(autotools_check_macro_val AC_CONFIG_SUBDIRS) ; do
177 if [[ -d ${x} ]] ; then
178 pushd "${x}" >/dev/null
179 # Avoid unsafe nested multijob_finish_one for bug #426512.
180 AT_NOELIBTOOLIZE="yes" eautoreconf || die
186 einfo "Running eautoreconf in '${PWD}' ..."
188 local m4dirs=$(autotools_check_macro_val AC_CONFIG_{AUX,MACRO}_DIR)
189 [[ -n ${m4dirs} ]] && mkdir -p ${m4dirs}
191 # Run all the tools before aclocal so we can gather the .m4 files.
193 # <tool> <was run> <command>
194 glibgettext false "autotools_run_tool glib-gettextize --copy --force"
195 gettext false "autotools_run_tool --at-missing autopoint --force"
196 # intltool must come after autopoint.
197 intltool false "autotools_run_tool intltoolize --automake --copy --force"
198 gtkdoc false "autotools_run_tool --at-missing gtkdocize --copy"
199 gnomedoc false "autotools_run_tool --at-missing gnome-doc-prepare --copy --force"
200 libtool false "_elibtoolize --auto-ltdl --install --copy --force"
202 for (( i = 0; i < ${#tools[@]}; i += 3 )) ; do
203 if _at_uses_${tools[i]} ; then
209 # Generate aclocal.m4 with our up-to-date m4 files.
210 local rerun_aclocal=false
213 # Check to see if we had macros expanded by other macros or in other
214 # m4 files that we couldn't detect early. This is uncommon, but some
215 # packages do this, so we have to handle it correctly.
216 for (( i = 0; i < ${#tools[@]}; i += 3 )) ; do
217 if ! ${tools[i+1]} && _at_uses_${tools[i]} ; then
222 ${rerun_aclocal} && eaclocal
224 if [[ ${WANT_AUTOCONF} = 2.1 ]] ; then
230 [[ ${AT_NOEAUTOMAKE} != "yes" ]] && FROM_EAUTORECONF="yes" eautomake ${AM_OPTS}
232 if [[ ${AT_NOELIBTOOLIZE} != "yes" ]] ; then
233 # Call it here to prevent failures due to elibtoolize called _before_
235 elibtoolize --force "${PWD}"
241 # @FUNCTION: _at_uses_pkg
244 # See if the specified macros are enabled.
246 if [[ -n $(autotools_check_macro "$@") ]] ; then
249 # If the trace didn't find it (perhaps because aclocal.m4 hasn't
250 # been generated yet), cheat, but be conservative.
253 args+=( -e "^[[:space:]]*${macro}\>" )
255 egrep -q "${args[@]}" configure.??
258 _at_uses_autoheader() { _at_uses_pkg A{C,M}_CONFIG_HEADER{S,}; }
259 _at_uses_automake() { _at_uses_pkg AM_INIT_AUTOMAKE; }
260 _at_uses_gettext() { _at_uses_pkg AM_GNU_GETTEXT_{,REQUIRE_}VERSION; }
261 _at_uses_glibgettext() { _at_uses_pkg AM_GLIB_GNU_GETTEXT; }
262 _at_uses_intltool() { _at_uses_pkg {AC,IT}_PROG_INTLTOOL; }
263 _at_uses_gtkdoc() { _at_uses_pkg GTK_DOC_CHECK; }
264 _at_uses_gnomedoc() { _at_uses_pkg GNOME_DOC_INIT; }
265 _at_uses_libtool() { _at_uses_pkg A{C,M}_PROG_LIBTOOL LT_INIT; }
266 _at_uses_libltdl() { _at_uses_pkg LT_CONFIG_LTDL_DIR; }
268 # @FUNCTION: eaclocal_amflags
270 # Extract the ACLOCAL_AMFLAGS value from the Makefile.am and try to handle
271 # (most) of the crazy crap that people throw at us.
273 local aclocal_opts amflags_file
275 for amflags_file in GNUmakefile.am Makefile.am GNUmakefile.in Makefile.in ; do
276 [[ -e ${amflags_file} ]] || continue
277 # setup the env in case the pkg does something crazy
278 # in their ACLOCAL_AMFLAGS. like run a shell script
279 # which turns around and runs autotools. #365401
280 # or split across multiple lines. #383525
282 aclocal_opts=$(sed -n \
283 "/^ACLOCAL_AMFLAGS[[:space:]]*=/{ \
284 # match the first line
286 # then gobble up all escaped lines
287 : nextline /\\\\$/{ n; p; b nextline; } \
289 eval aclocal_opts=\""${aclocal_opts}"\"
296 # @FUNCTION: eaclocal
298 # These functions runs the autotools using autotools_run_tool with the
299 # specified parametes. The name of the tool run is the same of the function
301 # They also force installing the support files for safety.
302 # Respects AT_M4DIR for additional directories to search for macro's.
304 [[ ! -f aclocal.m4 || -n $(grep -e 'generated.*by aclocal' aclocal.m4) ]] && \
305 autotools_run_tool --at-m4flags aclocal "$@" $(eaclocal_amflags)
308 # @FUNCTION: _elibtoolize
312 # Note the '_' prefix: avoid collision with elibtoolize() from libtool.eclass.
314 local LIBTOOLIZE=${LIBTOOLIZE:-$(type -P glibtoolize > /dev/null && echo glibtoolize || echo libtoolize)}
316 if [[ $1 == "--auto-ltdl" ]] ; then
318 _at_uses_libltdl && set -- "$@" --ltdl
321 [[ -f GNUmakefile.am || -f Makefile.am ]] && set -- "$@" --automake
323 autotools_run_tool ${LIBTOOLIZE} "$@"
326 # @FUNCTION: eautoheader
330 _at_uses_autoheader || return 0
331 autotools_run_tool --at-no-fail --at-m4flags autoheader "$@"
334 # @FUNCTION: eautoconf
338 if [[ ! -f configure.ac && ! -f configure.in ]] ; then
340 eerror "No configure.{ac,in} present in '${PWD}'!"
342 die "No configure.{ac,in} present!"
344 if [[ ${WANT_AUTOCONF} != "2.1" && -e configure.in ]] ; then
345 eqawarn "This package has a configure.in file which has long been deprecated. Please"
346 eqawarn "update it to use configure.ac instead as newer versions of autotools will die"
347 eqawarn "when it finds this file. See https://bugs.gentoo.org/426262 for details."
350 autotools_run_tool --at-m4flags autoconf "$@"
353 # @FUNCTION: eautomake
361 # - a Makefile.am type file exists
362 # - the configure script is using the AM_INIT_AUTOMAKE directive
363 for makefile_name in {GNUmakefile,{M,m}akefile}.am "" ; do
364 [[ -f ${makefile_name} ]] && break
367 _automake_version() {
368 autotools_run_tool --at-output automake --version 2>/dev/null |
369 sed -n -e '1{s:.*(GNU automake) ::p;q}'
372 if [[ -z ${makefile_name} ]] ; then
373 _at_uses_automake || return 0
375 elif [[ -z ${FROM_EAUTORECONF} && -f ${makefile_name%.am}.in ]]; then
377 local installed_automake
379 installed_automake=$(WANT_AUTOMAKE= _automake_version)
380 used_automake=$(head -n 1 < ${makefile_name%.am}.in | \
381 sed -e 's:.*by automake \(.*\) from .*:\1:')
383 if [[ ${installed_automake} != ${used_automake} ]]; then
384 ewarn "Automake used for the package (${used_automake}) differs from" \
385 "the installed version (${installed_automake})."
386 ewarn "Forcing a full rebuild of the autotools to workaround."
392 [[ -f INSTALL && -f AUTHORS && -f ChangeLog && -f NEWS && -f README ]] \
393 || extra_opts+=( --foreign )
395 # Older versions of automake do not support --force-missing. But we want
396 # to use this whenever possible to update random bundled files #133489.
397 case $(_automake_version) in
399 *) extra_opts+=( --force-missing ) ;;
402 autotools_run_tool automake --add-missing --copy "${extra_opts[@]}" "$@"
405 # @FUNCTION: eautopoint
407 # Runs autopoint (from the gettext package).
409 autotools_run_tool autopoint "$@"
412 # @FUNCTION: config_rpath_update
413 # @USAGE: [destination]
415 # Some packages utilize the config.rpath helper script, but don't
416 # use gettext directly. So we have to copy it in manually since
417 # we can't let `autopoint` do it for us.
418 config_rpath_update() {
419 local dst src=$(type -P gettext | sed 's:bin/gettext:share/gettext/config.rpath:')
421 [[ $# -eq 0 ]] && set -- $(find -name config.rpath)
422 [[ $# -eq 0 ]] && return 0
424 einfo "Updating all config.rpath files"
427 cp "${src}" "${dst}" || die
431 # @FUNCTION: autotools_env_setup
434 # Process the WANT_AUTO{CONF,MAKE} flags.
435 autotools_env_setup() {
436 # We do the "latest" → version switch here because it solves
437 # possible order problems, see bug #270010 as an example.
438 if [[ ${WANT_AUTOMAKE} == "latest" ]]; then
440 for pv in ${_LATEST_AUTOMAKE[@]/#*:} ; do
441 # has_version respects ROOT, but in this case, we don't want it to,
442 # thus "ROOT=/" prefix:
443 ROOT=/ has_version "=sys-devel/automake-${pv}*" && export WANT_AUTOMAKE="${pv}"
445 [[ ${WANT_AUTOMAKE} == "latest" ]] && \
446 die "Cannot find the latest automake! Tried ${_LATEST_AUTOMAKE[*]}"
448 [[ ${WANT_AUTOCONF} == "latest" ]] && export WANT_AUTOCONF=2.5
451 # @FUNCTION: autotools_run_tool
452 # @USAGE: [--at-no-fail] [--at-m4flags] [--at-missing] [--at-output] <autotool> [tool-specific flags]
455 # Run the specified autotool helper, but do logging and error checking
456 # around it in the process.
457 autotools_run_tool() {
458 # Process our own internal flags first
459 local autofail=true m4flags=false missing_ok=false return_output=false
460 while [[ -n $1 ]] ; do
462 --at-no-fail) autofail=false;;
463 --at-m4flags) m4flags=true;;
464 --at-missing) missing_ok=true;;
465 --at-output) return_output=true;;
466 # whatever is left goes to the actual tool
472 if [[ ${EBUILD_PHASE} != "unpack" && ${EBUILD_PHASE} != "prepare" ]]; then
473 ewarn "QA Warning: running $1 in ${EBUILD_PHASE} phase"
476 if ${missing_ok} && ! type -P ${1} >/dev/null ; then
477 einfo "Skipping '$*' due $1 not installed"
483 # Allow people to pass in full paths. #549268
484 local STDERR_TARGET="${T}/${1##*/}.out"
485 # most of the time, there will only be one run, but if there are
486 # more, make sure we get unique log filenames
487 if [[ -e ${STDERR_TARGET} ]] ; then
490 STDERR_TARGET="${T}/${1##*/}-${i}.out"
491 [[ -e ${STDERR_TARGET} ]] || break
497 set -- "${1}" $(autotools_m4dir_include) "${@:2}" $(autotools_m4sysdir_include)
500 # If the caller wants to probe something, then let them do it directly.
501 if ${return_output} ; then
506 printf "***** $1 *****\n***** PWD: ${PWD}\n***** $*\n\n" > "${STDERR_TARGET}"
509 "$@" >> "${STDERR_TARGET}" 2>&1
510 if ! eend $? && ${autofail} ; then
512 eerror "Failed Running $1 !"
514 eerror "Include in your bugreport the contents of:"
516 eerror " ${STDERR_TARGET}"
518 die "Failed Running $1 !"
522 # Internal function to check for support
524 # Keep a list of all the macros we might use so that we only
525 # have to run the trace code once. Order doesn't matter.
526 ALL_AUTOTOOLS_MACROS=(
527 A{C,M}_PROG_LIBTOOL LT_INIT LT_CONFIG_LTDL_DIR
528 A{C,M}_CONFIG_HEADER{S,}
530 AC_CONFIG_AUX_DIR AC_CONFIG_MACRO_DIR
533 AM_GNU_GETTEXT_{,REQUIRE_}VERSION
534 {AC,IT}_PROG_INTLTOOL
538 autotools_check_macro() {
539 [[ -f configure.ac || -f configure.in ]] || return 0
541 # We can run in multiple dirs, so we have to cache the trace
542 # data in $PWD rather than an env var.
543 local trace_file=".__autoconf_trace_data"
544 if [[ ! -e ${trace_file} ]] || [[ ! aclocal.m4 -ot ${trace_file} ]] ; then
545 WANT_AUTOCONF="2.5" autoconf \
546 $(autotools_m4dir_include) \
547 ${ALL_AUTOTOOLS_MACROS[@]/#/--trace=} > ${trace_file} 2>/dev/null
552 has ${macro} ${ALL_AUTOTOOLS_MACROS[@]} || die "internal error: add ${macro} to ALL_AUTOTOOLS_MACROS"
553 args+=( -e ":${macro}:" )
555 grep "${args[@]}" ${trace_file}
558 # @FUNCTION: autotools_check_macro_val
559 # @USAGE: <macro> [macros]
562 # Look for a macro and extract its value.
563 autotools_check_macro_val() {
567 autotools_check_macro "${macro}" | \
568 gawk -v macro="${macro}" \
569 '($0 !~ /^[[:space:]]*(#|dnl)/) {
570 if (match($0, macro ":(.*)$", res))
578 _autotools_m4dir_include() {
579 local x include_opts flag
581 # Use the right flag to autoconf based on the version #448986
582 [[ ${WANT_AUTOCONF} == "2.1" ]] \
591 [[ ! -d ${x} ]] && ewarn "autotools.eclass: '${x}' does not exist"
592 include_opts+=" -${flag} ${x}"
599 autotools_m4dir_include() { _autotools_m4dir_include ${AT_M4DIR} ; }
600 autotools_m4sysdir_include() {
601 # First try to use the paths the system integrator has set up.
602 local paths=( $(eval echo ${AT_SYS_M4DIR}) )
604 if [[ ${#paths[@]} -eq 0 && -n ${SYSROOT} ]] ; then
605 # If they didn't give us anything, then default to the SYSROOT.
606 # This helps when cross-compiling.
607 local path="${SYSROOT}/usr/share/aclocal"
608 [[ -d ${path} ]] && paths+=( "${path}" )
610 _autotools_m4dir_include "${paths[@]}"