commit: 0ef588b1aae7bcdf9fd93630dfd5f9bddf527fe3 Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org> AuthorDate: Sun Feb 24 17:13:26 2019 +0000 Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org> CommitDate: Sun Feb 24 17:14:39 2019 +0000 URL: https://gitweb.gentoo.org/proj/musl.git/commit/?id=0ef588b1
toolchain.eclass: bring into sync with upstream Signed-off-by: Anthony G. Basile <blueness <AT> gentoo.org> eclass/toolchain.eclass | 226 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 150 insertions(+), 76 deletions(-) diff --git a/eclass/toolchain.eclass b/eclass/toolchain.eclass index 0163767..5411381 100644 --- a/eclass/toolchain.eclass +++ b/eclass/toolchain.eclass @@ -2,12 +2,13 @@ # Distributed under the terms of the GNU General Public License v2 # Maintainer: Toolchain Ninjas <toolch...@gentoo.org> +# @SUPPORTED_EAPIS: 5 DESCRIPTION="The GNU Compiler Collection" HOMEPAGE="https://gcc.gnu.org/" RESTRICT="strip" # cross-compilers need controlled stripping -inherit eutils fixheadtails flag-o-matic gnuconfig libtool multilib pax-utils toolchain-funcs versionator prefix +inherit eutils fixheadtails flag-o-matic gnuconfig libtool multilib pax-utils toolchain-funcs prefix if [[ ${PV} == *_pre9999* ]] ; then EGIT_REPO_URI="git://gcc.gnu.org/git/gcc.git" @@ -25,8 +26,8 @@ FEATURES=${FEATURES/multilib-strict/} case ${EAPI:-0} in 0|1|2|3|4*) die "Need to upgrade to at least EAPI=5" ;; - 5*) ;; - *) die "I don't speak EAPI ${EAPI}." ;; + 5*) inherit eapi7-ver ;; + *) die "I don't speak EAPI ${EAPI}." ;; esac EXPORT_FUNCTIONS pkg_pretend pkg_setup src_unpack src_prepare src_configure \ src_compile src_test src_install pkg_postinst pkg_postrm @@ -49,7 +50,7 @@ is_crosscompile() { # General purpose version check. Without a second arg matches up to minor version (x.x.x) tc_version_is_at_least() { - version_is_at_least "$1" "${2:-${GCC_RELEASE_VER}}" + ver_test "${2:-${GCC_RELEASE_VER}}" -ge "$1" } # General purpose version range check @@ -61,17 +62,17 @@ tc_version_is_between() { GCC_PV=${TOOLCHAIN_GCC_PV:-${PV}} GCC_PVR=${GCC_PV} [[ ${PR} != "r0" ]] && GCC_PVR=${GCC_PVR}-${PR} -GCC_RELEASE_VER=$(get_version_component_range 1-3 ${GCC_PV}) -GCC_BRANCH_VER=$(get_version_component_range 1-2 ${GCC_PV}) -GCCMAJOR=$(get_version_component_range 1 ${GCC_PV}) -GCCMINOR=$(get_version_component_range 2 ${GCC_PV}) -GCCMICRO=$(get_version_component_range 3 ${GCC_PV}) +GCC_RELEASE_VER=$(ver_cut 1-3 ${GCC_PV}) +GCC_BRANCH_VER=$(ver_cut 1-2 ${GCC_PV}) +GCCMAJOR=$(ver_cut 1 ${GCC_PV}) +GCCMINOR=$(ver_cut 2 ${GCC_PV}) +GCCMICRO=$(ver_cut 3 ${GCC_PV}) [[ ${BRANCH_UPDATE-notset} == "notset" ]] && \ - BRANCH_UPDATE=$(get_version_component_range 4 ${GCC_PV}) + BRANCH_UPDATE=$(ver_cut 4 ${GCC_PV}) # According to gcc/c-cppbuiltin.c, GCC_CONFIG_VER MUST match this regex. # ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? -GCC_CONFIG_VER=${GCC_CONFIG_VER:-$(replace_version_separator 3 '-' ${GCC_PV})} +GCC_CONFIG_VER=${GCC_CONFIG_VER:-$(ver_rs 3 '-' ${GCC_PV})} # Pre-release support if [[ ${GCC_PV} == *_pre* ]] ; then @@ -127,12 +128,18 @@ else LICENSE="GPL-2+ LGPL-2.1+ FDL-1.1+" fi -IUSE="regression-test vanilla" -IUSE_DEF=( nls nptl ) +if tc_version_is_at_least 8.3; then + GCC_EBUILD_TEST_FLAG='test' +else + # Don't force USE regression-test->test change on every + # gcc ebuild just yet. Let's do the change when >=gcc-8.3 + # is commonly used as a main compiler. + GCC_EBUILD_TEST_FLAG='regression-test' +fi +IUSE="${GCC_EBUILD_TEST_FLAG} vanilla +nls +nptl" if [[ ${PN} != "kgcc64" && ${PN} != gcc-* ]] ; then - IUSE+=" altivec debug" - IUSE_DEF+=( cxx fortran ) + IUSE+=" altivec debug +cxx +fortran" [[ -n ${PIE_VER} ]] && IUSE+=" nopie" [[ -n ${HTB_VER} ]] && IUSE+=" boundschecking" [[ -n ${D_VER} ]] && IUSE+=" d" @@ -143,13 +150,13 @@ if [[ ${PN} != "kgcc64" && ${PN} != gcc-* ]] ; then tc_version_is_at_least 4.0 && IUSE+=" objc-gc" tc_version_is_between 4.0 4.9 && IUSE+=" mudflap" tc_version_is_at_least 4.1 && IUSE+=" libssp objc++" - tc_version_is_at_least 4.2 && IUSE_DEF+=( openmp ) + tc_version_is_at_least 4.2 && IUSE+=" +openmp" tc_version_is_at_least 4.3 && IUSE+=" fixed-point" tc_version_is_at_least 4.7 && IUSE+=" go" # Note: while <=gcc-4.7 also supported graphite, it required forked ppl # versions which we dropped. Since graphite was also experimental in # the older versions, we don't want to bother supporting it. #448024 - tc_version_is_at_least 4.8 && IUSE+=" graphite" IUSE_DEF+=( sanitize ) + tc_version_is_at_least 4.8 && IUSE+=" graphite +sanitize" tc_version_is_between 4.9 8 && IUSE+=" cilk" tc_version_is_at_least 4.9 && IUSE+=" +vtv" tc_version_is_at_least 5.0 && IUSE+=" jit mpx" @@ -158,8 +165,6 @@ if [[ ${PN} != "kgcc64" && ${PN} != gcc-* ]] ; then tc_version_is_at_least 8.0 && IUSE+=" systemtap" fi -IUSE+=" ${IUSE_DEF[*]/#/+}" - SLOT="${GCC_CONFIG_VER}" #---->> DEPEND <<---- @@ -202,7 +207,7 @@ DEPEND="${RDEPEND} >=sys-devel/bison-1.875 >=sys-devel/flex-2.5.4 nls? ( sys-devel/gettext ) - regression-test? ( + ${GCC_EBUILD_TEST_FLAG}? ( >=dev-util/dejagnu-1.4.4 >=sys-devel/autogen-5.5.4 )" @@ -309,6 +314,14 @@ gentoo_urls() { # ten Brugge's bounds-checking patches. If you want to use a patch # for an older gcc version with a new gcc, make sure you set # HTB_GCC_VER to that version of gcc. +# +# CYGWINPORTS_GITREV +# If set, this variable signals that we should apply additional patches +# maintained by upstream Cygwin developers at github/cygwinports/gcc, +# using the specified git commit id there. The list of patches to +# apply is extracted from gcc.cygport, maintained there as well. +# This is done for compilers running on Cygwin, not for cross compilers +# with a Cygwin target. get_gcc_src_uri() { export PATCH_GCC_VER=${PATCH_GCC_VER:-${GCC_RELEASE_VER}} export UCLIBC_GCC_VER=${UCLIBC_GCC_VER:-${PATCH_GCC_VER}} @@ -375,6 +388,11 @@ get_gcc_src_uri() { fi fi + # Cygwin patches from https://github.com/cygwinports/gcc + [[ -n ${CYGWINPORTS_GITREV} ]] && \ + GCC_SRC_URI+=" elibc_Cygwin? ( https://github.com/cygwinports/gcc/archive/${CYGWINPORTS_GITREV}.tar.gz + -> gcc-cygwinports-${CYGWINPORTS_GITREV}.tar.gz )" + echo "${GCC_SRC_URI}" } @@ -481,6 +499,8 @@ gcc_quick_unpack() { use_if_iuse boundschecking && unpack "bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch.bz2" + [[ -n ${CYGWINPORTS_GITREV} ]] && use elibc_Cygwin && unpack "gcc-cygwinports-${CYGWINPORTS_GITREV}.tar.gz" + popd > /dev/null } @@ -505,6 +525,7 @@ toolchain_src_prepare() { fi do_gcc_HTB_patches do_gcc_PIE_patches + do_gcc_CYGWINPORTS_patches epatch_user if ( tc_version_is_at_least 4.8.2 || use_if_iuse hardened ) && ! use vanilla ; then @@ -645,6 +666,18 @@ do_gcc_PIE_patches() { BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, pie-${PIE_VER}" } +do_gcc_CYGWINPORTS_patches() { + [[ -n ${CYGWINPORTS_GITREV} ]] || return 0 + use elibc_Cygwin || return 0 + + local -a patches + local p d="${WORKDIR}/gcc-${CYGWINPORTS_GITREV}" + readarray -t patches < <(sed -e '1,/PATCH_URI="/d;/"/,$d' < "${d}"/gcc.cygport) + for p in ${patches[*]}; do + epatch "${d}/${p}" + done +} + # configure to build with the hardened GCC specs as the default make_gcc_hard() { @@ -999,7 +1032,7 @@ toolchain_src_configure() { then #291870 confgcc+=( --disable-shared ) fi - needed_libc=uclibc + needed_libc=uclibc-ng ;; *-cygwin) needed_libc=cygwin;; x86_64-*-mingw*|\ @@ -1034,7 +1067,7 @@ toolchain_src_configure() { confgcc+=( --enable-shared ) fi case ${CHOST} in - mingw*|*-mingw*|*-cygwin) + mingw*|*-mingw*) confgcc+=( --enable-threads=win32 ) ;; *) confgcc+=( --enable-threads=posix ) ;; @@ -1178,10 +1211,12 @@ toolchain_src_configure() { ### library options - if ! is_gcj ; then - confgcc+=( --disable-libgcj ) - elif use awt ; then - confgcc+=( --enable-java-awt=gtk ) + if tc_version_is_between 3.0 7.0 ; then + if ! is_gcj ; then + confgcc+=( --disable-libgcj ) + elif use awt ; then + confgcc+=( --enable-java-awt=gtk ) + fi fi if tc_version_is_at_least 4.2 ; then @@ -1246,7 +1281,8 @@ toolchain_src_configure() { if in_iuse vtv ; then confgcc+=( $(use_enable vtv vtable-verify) - $(use_enable vtv libvtv) + # See Note [implicitly enabled flags] + $(usex vtv '' --disable-libvtv) ) fi @@ -1275,7 +1311,8 @@ toolchain_src_configure() { fi if tc_version_is_at_least 4.8 && in_iuse sanitize ; then - confgcc+=( $(use_enable sanitize libsanitizer) ) + # See Note [implicitly enabled flags] + confgcc+=( $(usex sanitize '' --disable-libsanitizer) ) fi if tc_version_is_at_least 6.0 && in_iuse pie ; then @@ -1322,7 +1359,7 @@ toolchain_src_configure() { addwrite /dev/zero echo "${S}"/configure "${confgcc[@]}" # Older gcc versions did not detect bash and re-exec itself, so force the - # use of bash. Newer ones will auto-detect, but this is not harmeful. + # use of bash. Newer ones will auto-detect, but this is not harmful. CONFIG_SHELL="${EPREFIX}/bin/bash" \ bash "${S}"/configure "${confgcc[@]}" || die "failed to run configure" @@ -1479,6 +1516,12 @@ gcc_do_filter_flags() { filter-flags -f{no-,}unit-at-a-time -f{no-,}web -mno-tls-direct-seg-refs filter-flags -f{no-,}stack-protector{,-all} filter-flags -fvisibility-inlines-hidden -fvisibility=hidden + # and warning options + filter-flags -Wextra -Wstack-protector + fi + if ! tc_version_is_at_least 4.1 ; then + filter-flags -fdiagnostics-show-option + filter-flags -Wstack-protector fi if tc_version_is_at_least 3.4 ; then @@ -1594,6 +1637,11 @@ toolchain_src_compile() { [[ ! -x /usr/bin/perl ]] \ && find "${WORKDIR}"/build -name '*.[17]' -exec touch {} + + # Older gcc versions did not detect bash and re-exec itself, so force the + # use of bash. Newer ones will auto-detect, but this is not harmful. + # This needs to be set for compile as well, as it's used in libtool + # generation, which will break install otherwise (at least in 3.3.6): #664486 + CONFIG_SHELL="${EPREFIX}/bin/bash" \ gcc_do_make ${GCC_MAKE_TARGET} } @@ -1684,7 +1732,7 @@ gcc_do_make() { #---->> src_test <<---- toolchain_src_test() { - if use regression-test ; then + if use ${GCC_EBUILD_TEST_FLAG} ; then cd "${WORKDIR}"/build emake -k check fi @@ -1723,9 +1771,9 @@ toolchain_src_install() { S="${WORKDIR}"/build emake -j1 DESTDIR="${D}" install || die # Punt some tools which are really only useful while building gcc - find "${D}" -name install-tools -prune -type d -exec rm -rf "{}" \; + find "${ED}" -name install-tools -prune -type d -exec rm -rf "{}" \; # This one comes with binutils - find "${D}" -name libiberty.a -delete + find "${ED}" -name libiberty.a -delete # Move the libraries to the proper location gcc_movelibs @@ -1734,7 +1782,7 @@ toolchain_src_install() { if ! is_crosscompile ; then local EXEEXT eval $(grep ^EXEEXT= "${WORKDIR}"/build/gcc/config.log) - [[ -r ${D}${BINPATH}/gcc${EXEEXT} ]] || die "gcc not found in ${D}" + [[ -r ${D}${BINPATH}/gcc${EXEEXT} ]] || die "gcc not found in ${ED}" fi dodir /etc/env.d/gcc @@ -1777,46 +1825,54 @@ toolchain_src_install() { ln -sf ${CTARGET}-${x} ${CTARGET}-${x}-${GCC_CONFIG_VER} fi done - # Rename the main go binaries as we don't want to clobber dev-lang/go - # when gcc-config runs. #567806 - if tc_version_is_at_least 5 && is_go ; then - for x in go gofmt; do - mv ${x} ${x}-${GCCMAJOR} || die - done + + # When gcc builds a crosscompiler it does not install unprefixed tools. + # When cross-building gcc does install native tools. + if ! is_crosscompile; then + # Rename the main go binaries as we don't want to clobber dev-lang/go + # when gcc-config runs. #567806 + if tc_version_is_at_least 5 && is_go ; then + for x in go gofmt; do + mv ${x} ${x}-${GCCMAJOR} || die + done + fi fi - # Now do the fun stripping stuff - env RESTRICT="" CHOST=${CHOST} prepstrip "${D}${BINPATH}" - is_crosscompile && \ - env RESTRICT="" CHOST=${CHOST} prepstrip "${D}${HOSTLIBPATH}" - env RESTRICT="" CHOST=${CTARGET} prepstrip "${D}${LIBPATH}" - # gcc used to install helper binaries in lib/ but then moved to libexec/ - [[ -d ${D}${PREFIX}/libexec/gcc ]] && \ - env RESTRICT="" CHOST=${CHOST} prepstrip "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}" + # TODO: implement stripping (we use RESTRICT=strip) + # As gcc installs object files both build against ${CHOST} and ${CTARGET} + # we will ned to run stripping using different tools: + # Using ${CHOST} tools: + # - "${D}${BINPATH}" + # - (for is_crosscompile) "${D}${HOSTLIBPATH}" + # - "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}" + # Using ${CTARGET} tools: + # - "${D}${LIBPATH}" cd "${S}" if is_crosscompile; then - rm -rf "${ED}"usr/share/{man,info} + rm -rf "${ED}"/usr/share/{man,info} rm -rf "${D}"${DATAPATH}/{man,info} else if tc_version_is_at_least 3.0 ; then local cxx_mandir=$(find "${WORKDIR}/build/${CTARGET}/libstdc++-v3" -name man) if [[ -d ${cxx_mandir} ]] ; then - cp -r "${cxx_mandir}"/man? "${D}/${DATAPATH}"/man/ + cp -r "${cxx_mandir}"/man? "${D}${DATAPATH}"/man/ fi fi - has noinfo ${FEATURES} \ - && rm -r "${D}${DATAPATH}"/info \ - || prepinfo "${DATAPATH#${EPREFIX}}" - has noman ${FEATURES} \ - && rm -r "${D}${DATAPATH}"/man \ - || prepman "${DATAPATH#${EPREFIX}}" fi + + # portage regenerates 'dir' files on it's own: bug #672408 + # Drop 'dir' files to avoid collisions. + if [[ -f "${D}${DATAPATH}"/info/dir ]]; then + einfo "Deleting '${D}${DATAPATH}/info/dir'" + rm "${D}${DATAPATH}"/info/dir || die + fi + # prune empty dirs left behind - find "${D}" -depth -type d -delete 2>/dev/null + find "${ED}" -depth -type d -delete 2>/dev/null # install testsuite results - if use regression-test; then + if use ${GCC_EBUILD_TEST_FLAG}; then docinto testsuite find "${WORKDIR}"/build -type f -name "*.sum" -exec dodoc {} + find "${WORKDIR}"/build -type f -path "*/testsuite/*.log" -exec dodoc {} + @@ -1853,7 +1909,7 @@ toolchain_src_install() { # libvtv.la: gcc itself handles linkage correctly. # lib*san.la: Sanitizer linkage is handled internally by gcc, and they # do not support static linking. #487550 #546700 - find "${D}/${LIBPATH}" \ + find "${D}${LIBPATH}" \ '(' \ -name libstdc++.la -o \ -name libstdc++fs.la -o \ @@ -1919,7 +1975,7 @@ gcc_movelibs() { # code to run on the target. if tc_version_is_at_least 5 && is_crosscompile ; then dodir "${HOSTLIBPATH#${EPREFIX}}" - mv "${ED}"usr/$(get_libdir)/libcc1* "${D}${HOSTLIBPATH}" || die + mv "${ED}"/usr/$(get_libdir)/libcc1* "${D}${HOSTLIBPATH}" || die fi # For all the libs that are built for CTARGET, move them into the @@ -1969,7 +2025,7 @@ gcc_movelibs() { for FROMDIR in ${removedirs} ; do rmdir "${D}"${FROMDIR} >& /dev/null done - find -depth "${D}" -type d -exec rmdir {} + >& /dev/null + find -depth "${ED}" -type d -exec rmdir {} + >& /dev/null } # make sure the libtool archives have libdir set to where they actually @@ -2116,7 +2172,7 @@ gcc_slot_java() { toolchain_pkg_postinst() { do_gcc_config - if [[ ${ROOT} == / && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then + if [[ ! ${ROOT%/} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then eselect compiler-shadow update all fi @@ -2131,20 +2187,20 @@ toolchain_pkg_postinst() { echo # Clean up old paths - rm -f "${EROOT}"*/rcscripts/awk/fixlafiles.awk "${EROOT}"sbin/fix_libtool_files.sh - rmdir "${EROOT}"*/rcscripts{/awk,} 2>/dev/null + rm -f "${EROOT%/}"/*/rcscripts/awk/fixlafiles.awk "${EROOT%/}"/sbin/fix_libtool_files.sh + rmdir "${EROOT%/}"/*/rcscripts{/awk,} 2>/dev/null - mkdir -p "${EROOT}"usr/{share/gcc-data,sbin,bin} + mkdir -p "${EROOT%/}"/usr/{share/gcc-data,sbin,bin} # DATAPATH has EPREFIX already, use ROOT with it - cp "${ROOT}${DATAPATH}"/fixlafiles.awk "${EROOT}"usr/share/gcc-data/ || die - cp "${ROOT}${DATAPATH}"/fix_libtool_files.sh "${EROOT}"usr/sbin/ || die + cp "${ROOT%/}${DATAPATH}"/fixlafiles.awk "${EROOT%/}"/usr/share/gcc-data/ || die + cp "${ROOT%/}${DATAPATH}"/fix_libtool_files.sh "${EROOT%/}"/usr/sbin/ || die # Since these aren't critical files and portage sucks with # handling of binpkgs, don't require these to be found - cp "${ROOT}${DATAPATH}"/c{89,99} "${EROOT}"usr/bin/ 2>/dev/null + cp "${ROOT%/}${DATAPATH}"/c{89,99} "${EROOT%/}"/usr/bin/ 2>/dev/null fi - if use regression-test ; then + if use ${GCC_EBUILD_TEST_FLAG} ; then elog "Testsuite results have been installed into /usr/share/doc/${PF}/testsuite" echo fi @@ -2157,7 +2213,7 @@ toolchain_pkg_postinst() { } toolchain_pkg_postrm() { - if [[ ${ROOT} == / && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then + if [[ ! ${ROOT%/} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then eselect compiler-shadow clean all fi @@ -2168,16 +2224,16 @@ toolchain_pkg_postrm() { # clean up the cruft left behind by cross-compilers if is_crosscompile ; then - if [[ -z $(ls "${EROOT}"etc/env.d/gcc/${CTARGET}* 2>/dev/null) ]] ; then - rm -f "${EROOT}"etc/env.d/gcc/config-${CTARGET} - rm -f "${EROOT}"etc/env.d/??gcc-${CTARGET} - rm -f "${EROOT}"usr/bin/${CTARGET}-{gcc,{g,c}++}{,32,64} + if [[ -z $(ls "${EROOT%/}"/etc/env.d/gcc/${CTARGET}* 2>/dev/null) ]] ; then + rm -f "${EROOT%/}"/etc/env.d/gcc/config-${CTARGET} + rm -f "${EROOT%/}"/etc/env.d/??gcc-${CTARGET} + rm -f "${EROOT%/}"/usr/bin/${CTARGET}-{gcc,{g,c}++}{,32,64} fi return 0 fi # ROOT isnt handled by the script - [[ ${ROOT} != "/" ]] && return 0 + [[ ${ROOT%/} ]] && return 0 if [[ ! -e ${LIBPATH}/libstdc++.so ]] ; then # make sure the profile is sane during same-slot upgrade #289403 @@ -2210,7 +2266,7 @@ do_gcc_config() { [[ -n ${current_specs} ]] && use_specs=-${current_specs} if [[ -n ${use_specs} ]] && \ - [[ ! -e ${ROOT}/etc/env.d/gcc/${CTARGET}-${GCC_CONFIG_VER}${use_specs} ]] + [[ ! -e ${EROOT%/}/etc/env.d/gcc/${CTARGET}-${GCC_CONFIG_VER}${use_specs} ]] then ewarn "The currently selected specs-specific gcc config," ewarn "${current_specs}, doesn't exist anymore. This is usually" @@ -2243,7 +2299,7 @@ should_we_gcc_config() { # for being in the same SLOT, make sure we run gcc-config. local curr_config_ver=$(gcc-config -S ${curr_config} | awk '{print $2}') - local curr_branch_ver=$(get_version_component_range 1-2 ${curr_config_ver}) + local curr_branch_ver=$(ver_cut 1-2 ${curr_config_ver}) if [[ ${curr_branch_ver} == ${GCC_BRANCH_VER} ]] ; then return 0 @@ -2455,3 +2511,21 @@ toolchain_death_notice() { popd >/dev/null fi } + +# Note [implicitly enabled flags] +# ------------------------------- +# Usually configure-based packages handle explicit feature requests +# like +# ./configure --enable-foo +# as explicit request to check for support of 'foo' and bail out at +# configure time. +# +# GCC does not follow this pattern and instead overrides autodetection +# of the feature and enables it unconditionally. +# See bugs: +# https://gcc.gnu.org/PR85663 (libsanitizer on mips) +# https://bugs.gentoo.org/661252 (libvtv on powerpc64) +# +# Thus safer way to enable/disable the feature is to rely on implicit +# enabled-by-default state: +# econf $(usex foo '' --disable-foo)