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

Diff of /eclass/autotools-utils.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.68 Revision 1.75
1# Copyright 1999-2013 Gentoo Foundation 1# Copyright 1999-2015 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/autotools-utils.eclass,v 1.68 2013/05/05 20:22:25 mgorny Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/autotools-utils.eclass,v 1.75 2015/06/07 12:55:46 mgorny Exp $
4 4
5# @ECLASS: autotools-utils.eclass 5# @ECLASS: autotools-utils.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# Maciej Mrozowski <reavertm@gentoo.org> 7# Maciej Mrozowski <reavertm@gentoo.org>
8# Michał Górny <mgorny@gentoo.org> 8# Michał Górny <mgorny@gentoo.org>
94esac 94esac
95 95
96# @ECLASS-VARIABLE: AUTOTOOLS_AUTORECONF 96# @ECLASS-VARIABLE: AUTOTOOLS_AUTORECONF
97# @DEFAULT_UNSET 97# @DEFAULT_UNSET
98# @DESCRIPTION: 98# @DESCRIPTION:
99# Set to a non-empty value in order to enable running autoreconf 99# Set to a non-empty value before calling inherit to enable running autoreconf
100# in src_prepare() and adding autotools dependencies. 100# in src_prepare() and adding autotools dependencies.
101# 101#
102# This is usually necessary when using live sources or applying patches 102# This is usually necessary when using live sources or applying patches
103# modifying configure.ac or Makefile.am files. Note that in the latter case 103# modifying configure.ac or Makefile.am files. Note that in the latter case
104# setting this variable is obligatory even though the eclass will work without 104# setting this variable is obligatory even though the eclass will work without
134# @ECLASS-VARIABLE: ECONF_SOURCE 134# @ECLASS-VARIABLE: ECONF_SOURCE
135# @DEFAULT_UNSET 135# @DEFAULT_UNSET
136# @DESCRIPTION: 136# @DESCRIPTION:
137# Specify location of autotools' configure script. By default it uses ${S}. 137# Specify location of autotools' configure script. By default it uses ${S}.
138 138
139# @ECLASS-VARIABLE: DOCS
140# @DEFAULT_UNSET
141# @DESCRIPTION:
142# Array containing documents passed to dodoc command.
143#
144# In EAPIs 4+, can list directories as well.
145#
146# Example:
147# @CODE
148# DOCS=( NEWS README )
149# @CODE
150
151# @ECLASS-VARIABLE: HTML_DOCS
152# @DEFAULT_UNSET
153# @DESCRIPTION:
154# Array containing documents passed to dohtml command.
155#
156# Example:
157# @CODE
158# HTML_DOCS=( doc/html/ )
159# @CODE
160
161# @ECLASS-VARIABLE: PATCHES
162# @DEFAULT_UNSET
163# @DESCRIPTION:
164# PATCHES array variable containing all various patches to be applied.
165#
166# Example:
167# @CODE
168# PATCHES=( "${FILESDIR}"/${P}-mypatch.patch )
169# @CODE
170
171# @ECLASS-VARIABLE: AUTOTOOLS_PRUNE_LIBTOOL_FILES
172# @DEFAULT_UNSET
173# @DESCRIPTION:
174# Sets the mode of pruning libtool files. The values correspond to
175# prune_libtool_files parameters, with leading dashes stripped.
176#
177# Defaults to pruning the libtool files when static libraries are not
178# installed or can be linked properly without them. Libtool files
179# for modules (plugins) will be kept in case plugin loader needs them.
180#
181# If set to 'modules', the .la files for modules will be removed
182# as well. This is often the preferred option.
183#
184# If set to 'all', all .la files will be removed unconditionally. This
185# option is discouraged and shall be used only if 'modules' does not
186# remove the files.
187#
188# If set to 'none', no .la files will be pruned ever. Use in corner
189# cases only.
190
191# Determine using IN or OUT source build
192_check_build_dir() {
193 : ${ECONF_SOURCE:=${S}}
194 # Respect both the old variable and the new one, depending
195 # on which one was set by the ebuild.
196 if [[ ! ${BUILD_DIR} && ${AUTOTOOLS_BUILD_DIR} ]]; then
197 eqawarn "The AUTOTOOLS_BUILD_DIR variable has been renamed to BUILD_DIR."
198 eqawarn "Please migrate the ebuild to use the new one."
199
200 # In the next call, both variables will be set already
201 # and we'd have to know which one takes precedence.
202 _RESPECT_AUTOTOOLS_BUILD_DIR=1
203 fi
204
205 if [[ ${_RESPECT_AUTOTOOLS_BUILD_DIR} ]]; then
206 BUILD_DIR=${AUTOTOOLS_BUILD_DIR:-${WORKDIR}/${P}_build}
207 else
208 if [[ -n ${AUTOTOOLS_IN_SOURCE_BUILD} ]]; then
209 : ${BUILD_DIR:=${ECONF_SOURCE}}
210 else
211 : ${BUILD_DIR:=${WORKDIR}/${P}_build}
212 fi
213 fi
214
215 # Backwards compatibility for getting the value.
216 AUTOTOOLS_BUILD_DIR=${BUILD_DIR}
217 echo ">>> Working in BUILD_DIR: \"${BUILD_DIR}\""
218}
219
220# @FUNCTION: autotools-utils_src_prepare
221# @DESCRIPTION:
222# The src_prepare function.
223#
224# Supporting PATCHES array and user patches. See base.eclass(5) for reference.
225autotools-utils_src_prepare() {
226 debug-print-function ${FUNCNAME} "$@"
227
228 local want_autoreconf=${AUTOTOOLS_AUTORECONF}
229
230 [[ ${PATCHES} ]] && epatch "${PATCHES[@]}"
231
232 at_checksum() {
233 find '(' -name 'Makefile.am' \
234 -o -name 'configure.ac' \
235 -o -name 'configure.in' ')' \
236 -exec cksum {} + | sort -k2
237 }
238
239 [[ ! ${want_autoreconf} ]] && local checksum=$(at_checksum)
240 epatch_user
241 if [[ ! ${want_autoreconf} ]]; then
242 if [[ ${checksum} != $(at_checksum) ]]; then
243 einfo 'Will autoreconfigure due to user patches applied.'
244 want_autoreconf=yep
245 fi
246 fi
247
248 [[ ${want_autoreconf} ]] && eautoreconf
249 elibtoolize --patch-only
250}
251
252# @FUNCTION: autotools-utils_src_configure
253# @DESCRIPTION:
254# The src_configure function. For out of source build it creates build
255# directory and runs econf there. Configuration parameters defined
256# in myeconfargs are passed here to econf. Additionally following USE
257# flags are known:
258#
259# IUSE="static-libs" passes --enable-shared and either --disable-static/--enable-static
260# to econf respectively.
261
139# @ECLASS-VARIABLE: myeconfargs 262# @VARIABLE: myeconfargs
140# @DEFAULT_UNSET 263# @DEFAULT_UNSET
141# @DESCRIPTION: 264# @DESCRIPTION:
142# Optional econf arguments as Bash array. Should be defined before calling src_configure. 265# Optional econf arguments as Bash array. Should be defined before calling src_configure.
143# @CODE 266# @CODE
144# src_configure() { 267# src_configure() {
149# $(use_enable threads multithreading) 272# $(use_enable threads multithreading)
150# ) 273# )
151# autotools-utils_src_configure 274# autotools-utils_src_configure
152# } 275# }
153# @CODE 276# @CODE
154
155# @ECLASS-VARIABLE: DOCS
156# @DEFAULT_UNSET
157# @DESCRIPTION:
158# Array containing documents passed to dodoc command.
159#
160# In EAPIs 4+, can list directories as well.
161#
162# Example:
163# @CODE
164# DOCS=( NEWS README )
165# @CODE
166
167# @ECLASS-VARIABLE: HTML_DOCS
168# @DEFAULT_UNSET
169# @DESCRIPTION:
170# Array containing documents passed to dohtml command.
171#
172# Example:
173# @CODE
174# HTML_DOCS=( doc/html/ )
175# @CODE
176
177# @ECLASS-VARIABLE: PATCHES
178# @DEFAULT_UNSET
179# @DESCRIPTION:
180# PATCHES array variable containing all various patches to be applied.
181#
182# Example:
183# @CODE
184# PATCHES=( "${FILESDIR}"/${P}-mypatch.patch )
185# @CODE
186
187# @ECLASS-VARIABLE: AUTOTOOLS_PRUNE_LIBTOOL_FILES
188# @DEFAULT_UNSET
189# @DESCRIPTION:
190# Sets the mode of pruning libtool files. The values correspond to
191# prune_libtool_files parameters, with leading dashes stripped.
192#
193# Defaults to pruning the libtool files when static libraries are not
194# installed or can be linked properly without them. Libtool files
195# for modules (plugins) will be kept in case plugin loader needs them.
196#
197# If set to 'modules', the .la files for modules will be removed
198# as well. This is often the preferred option.
199#
200# If set to 'all', all .la files will be removed unconditionally. This
201# option is discouraged and shall be used only if 'modules' does not
202# remove the files.
203#
204# If set to 'none', no .la files will be pruned ever. Use in corner
205# cases only.
206
207# Determine using IN or OUT source build
208_check_build_dir() {
209 : ${ECONF_SOURCE:=${S}}
210 if [[ -n ${AUTOTOOLS_IN_SOURCE_BUILD} ]]; then
211 BUILD_DIR="${ECONF_SOURCE}"
212 else
213 # Respect both the old variable and the new one, depending
214 # on which one was set by the ebuild.
215 if [[ ! ${BUILD_DIR} && ${AUTOTOOLS_BUILD_DIR} ]]; then
216 eqawarn "The AUTOTOOLS_BUILD_DIR variable has been renamed to BUILD_DIR."
217 eqawarn "Please migrate the ebuild to use the new one."
218
219 # In the next call, both variables will be set already
220 # and we'd have to know which one takes precedence.
221 _RESPECT_AUTOTOOLS_BUILD_DIR=1
222 fi
223
224 if [[ ${_RESPECT_AUTOTOOLS_BUILD_DIR} ]]; then
225 BUILD_DIR=${AUTOTOOLS_BUILD_DIR:-${WORKDIR}/${P}_build}
226 else
227 : ${BUILD_DIR:=${WORKDIR}/${P}_build}
228 fi
229 fi
230
231 # Backwards compatibility for getting the value.
232 AUTOTOOLS_BUILD_DIR=${BUILD_DIR}
233 echo ">>> Working in BUILD_DIR: \"${BUILD_DIR}\""
234}
235
236# @FUNCTION: remove_libtool_files
237# @USAGE: [all]
238# @DESCRIPTION:
239# Determines unnecessary libtool files (.la) and libtool static archives (.a)
240# and removes them from installation image.
241#
242# To unconditionally remove all libtool files, pass 'all' as argument.
243# Otherwise, libtool archives required for static linking will be preserved.
244#
245# In most cases it's not necessary to manually invoke this function.
246# See autotools-utils_src_install for reference.
247remove_libtool_files() {
248 debug-print-function ${FUNCNAME} "$@"
249 local removing_all
250
251 eqawarn "The remove_libtool_files() function was deprecated."
252 eqawarn "Please use prune_libtool_files() from eutils eclass instead."
253
254 [[ ${#} -le 1 ]] || die "Invalid number of args to ${FUNCNAME}()"
255 if [[ ${#} -eq 1 ]]; then
256 case "${1}" in
257 all)
258 removing_all=1
259 ;;
260 *)
261 die "Invalid argument to ${FUNCNAME}(): ${1}"
262 esac
263 fi
264
265 local pc_libs=()
266 if [[ ! ${removing_all} ]]; then
267 local arg
268 for arg in $(find "${D}" -name '*.pc' -exec \
269 sed -n -e 's;^Libs:;;p' {} +); do
270 [[ ${arg} == -l* ]] && pc_libs+=(lib${arg#-l}.la)
271 done
272 fi
273
274 local f
275 find "${D}" -type f -name '*.la' -print0 | while read -r -d '' f; do
276 local shouldnotlink=$(sed -ne '/^shouldnotlink=yes$/p' "${f}")
277 local archivefile=${f/%.la/.a}
278 [[ "${f}" != "${archivefile}" ]] || die 'regex sanity check failed'
279
280 # Remove static libs we're not supposed to link against.
281 if [[ ${shouldnotlink} ]]; then
282 einfo "Removing unnecessary ${archivefile#${D%/}}"
283 rm -f "${archivefile}" || die
284 # The .la file may be used by a module loader, so avoid removing it
285 # unless explicitly requested.
286 [[ ${removing_all} ]] || continue
287 fi
288
289 # Remove .la files when:
290 # - user explicitly wants us to remove all .la files,
291 # - respective static archive doesn't exist,
292 # - they are covered by a .pc file already,
293 # - they don't provide any new information (no libs & no flags).
294 local removing
295 if [[ ${removing_all} ]]; then removing='forced'
296 elif [[ ! -f ${archivefile} ]]; then removing='no static archive'
297 elif has "$(basename "${f}")" "${pc_libs[@]}"; then
298 removing='covered by .pc'
299 elif [[ ! $(sed -n -e \
300 "s/^\(dependency_libs\|inherited_linker_flags\)='\(.*\)'$/\2/p" \
301 "${f}") ]]; then removing='no libs & flags'
302 fi
303
304 if [[ ${removing} ]]; then
305 einfo "Removing unnecessary ${f#${D%/}} (${removing})"
306 rm -f "${f}" || die
307 fi
308 done
309}
310
311# @FUNCTION: autotools-utils_autoreconf
312# @DESCRIPTION:
313# Reconfigure the sources (like gnome-autogen.sh or eautoreconf).
314autotools-utils_autoreconf() {
315 debug-print-function ${FUNCNAME} "$@"
316
317 eqawarn "The autotools-utils_autoreconf() function was deprecated."
318 eqawarn "Please call autotools-utils_src_prepare()"
319 eqawarn "with AUTOTOOLS_AUTORECONF set instead."
320
321 # Override this func to not require unnecessary eaclocal calls.
322 autotools_check_macro() {
323 local x
324
325 # Add a few additional variants as we don't get expansions.
326 [[ ${1} = AC_CONFIG_HEADERS ]] && set -- "${@}" \
327 AC_CONFIG_HEADER AM_CONFIG_HEADER
328
329 for x; do
330 grep -h "^${x}" configure.{ac,in} 2>/dev/null
331 done
332 }
333
334 einfo "Autoreconfiguring '${PWD}' ..."
335
336 local auxdir=$(sed -n -e 's/^AC_CONFIG_AUX_DIR(\(.*\))$/\1/p' \
337 configure.{ac,in} 2>/dev/null)
338 if [[ ${auxdir} ]]; then
339 auxdir=${auxdir%%]}
340 mkdir -p ${auxdir##[}
341 fi
342
343 # Support running additional tools like gnome-autogen.sh.
344 # Note: you need to add additional depends to the ebuild.
345
346 # gettext
347 if [[ $(autotools_check_macro AM_GLIB_GNU_GETTEXT) ]]; then
348 echo 'no' | autotools_run_tool glib-gettextize --copy --force
349 elif [[ $(autotools_check_macro AM_GNU_GETTEXT) ]]; then
350 eautopoint --force
351 fi
352
353 # intltool
354 if [[ $(autotools_check_macro AC_PROG_INTLTOOL IT_PROG_INTLTOOL) ]]
355 then
356 autotools_run_tool intltoolize --copy --automake --force
357 fi
358
359 # gtk-doc
360 if [[ $(autotools_check_macro GTK_DOC_CHECK) ]]; then
361 autotools_run_tool gtkdocize --copy
362 fi
363
364 # gnome-doc
365 if [[ $(autotools_check_macro GNOME_DOC_INIT) ]]; then
366 autotools_run_tool gnome-doc-prepare --copy --force
367 fi
368
369 if [[ $(autotools_check_macro AC_PROG_LIBTOOL AM_PROG_LIBTOOL LT_INIT) ]]
370 then
371 _elibtoolize --copy --force --install
372 fi
373
374 eaclocal
375 eautoconf
376 eautoheader
377 FROM_EAUTORECONF=sure eautomake
378
379 local x
380 for x in $(autotools_check_macro_val AC_CONFIG_SUBDIRS); do
381 if [[ -d ${x} ]] ; then
382 pushd "${x}" >/dev/null || die
383 autotools-utils_autoreconf
384 popd >/dev/null || die
385 fi
386 done
387}
388
389# @FUNCTION: autotools-utils_src_prepare
390# @DESCRIPTION:
391# The src_prepare function.
392#
393# Supporting PATCHES array and user patches. See base.eclass(5) for reference.
394autotools-utils_src_prepare() {
395 debug-print-function ${FUNCNAME} "$@"
396
397 local want_autoreconf=${AUTOTOOLS_AUTORECONF}
398
399 [[ ${PATCHES} ]] && epatch "${PATCHES[@]}"
400
401 at_checksum() {
402 find '(' -name 'Makefile.am' \
403 -o -name 'configure.ac' \
404 -o -name 'configure.in' ')' \
405 -exec cksum {} + | sort -k2
406 }
407
408 [[ ! ${want_autoreconf} ]] && local checksum=$(at_checksum)
409 epatch_user
410 if [[ ! ${want_autoreconf} ]]; then
411 if [[ ${checksum} != $(at_checksum) ]]; then
412 einfo 'Will autoreconfigure due to user patches applied.'
413 want_autoreconf=yep
414 fi
415 fi
416
417 [[ ${want_autoreconf} ]] && eautoreconf
418 elibtoolize --patch-only
419}
420
421# @FUNCTION: autotools-utils_src_configure
422# @DESCRIPTION:
423# The src_configure function. For out of source build it creates build
424# directory and runs econf there. Configuration parameters defined
425# in myeconfargs are passed here to econf. Additionally following USE
426# flags are known:
427#
428# IUSE="static-libs" passes --enable-shared and either --disable-static/--enable-static
429# to econf respectively.
430autotools-utils_src_configure() { 277autotools-utils_src_configure() {
431 debug-print-function ${FUNCNAME} "$@" 278 debug-print-function ${FUNCNAME} "$@"
432 279
433 [[ -z ${myeconfargs+1} || $(declare -p myeconfargs) == 'declare -a'* ]] \ 280 [[ -z ${myeconfargs+1} || $(declare -p myeconfargs) == 'declare -a'* ]] \
434 || die 'autotools-utils.eclass: myeconfargs has to be an array.' 281 || die 'autotools-utils.eclass: myeconfargs has to be an array.'
544 debug-print-function ${FUNCNAME} "$@" 391 debug-print-function ${FUNCNAME} "$@"
545 392
546 _check_build_dir 393 _check_build_dir
547 pushd "${BUILD_DIR}" > /dev/null || die 394 pushd "${BUILD_DIR}" > /dev/null || die
548 395
549 if make -n check &>/dev/null; then 396 if make -ni check "${@}" &>/dev/null; then
550 emake check "${@}" || die 'emake check failed.' 397 emake check "${@}" || die 'emake check failed.'
551 elif make -n test &>/dev/null; then 398 elif make -ni test "${@}" &>/dev/null; then
552 emake test "${@}" || die 'emake test failed.' 399 emake test "${@}" || die 'emake test failed.'
553 fi 400 fi
554 401
555 popd > /dev/null || die 402 popd > /dev/null || die
556} 403}

Legend:
Removed from v.1.68  
changed lines
  Added in v.1.75

  ViewVC Help
Powered by ViewVC 1.1.20