commit: 312bd3143a3842f072d096dbda4af9ee9a127ca7 Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Tue Dec 2 22:38:53 2014 +0000 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org> CommitDate: Tue Dec 2 22:38:53 2014 +0000 URL: http://sources.gentoo.org/gitweb/?p=dev/mgorny.git;a=commit;h=312bd314
sys-devel/gcc: Complete install (hopefully). Package-Manager: portage-2.2.14 --- .../gcc-4.6.4-fix-libgcc-s-path-with-vsrl.patch | 21 ++ sys-devel/gcc/gcc-4.9.2-r100.ebuild | 250 +++++++++++++++++---- 2 files changed, 233 insertions(+), 38 deletions(-) diff --git a/sys-devel/gcc/files/gcc-4.6.4-fix-libgcc-s-path-with-vsrl.patch b/sys-devel/gcc/files/gcc-4.6.4-fix-libgcc-s-path-with-vsrl.patch new file mode 100644 index 0000000..11c3731 --- /dev/null +++ b/sys-devel/gcc/files/gcc-4.6.4-fix-libgcc-s-path-with-vsrl.patch @@ -0,0 +1,21 @@ +diff -urN gcc-4.6.4/libgcc/Makefile.in gcc-4.6.4-fixed/libgcc/Makefile.in +--- gcc-4.6.4/libgcc/Makefile.in 2013-04-24 00:12:29.213242770 +0000 ++++ gcc-4.6.4-fixed/libgcc/Makefile.in 2013-04-24 01:19:14.909313041 +0000 +@@ -945,7 +945,7 @@ + + $(subst @multilib_dir@,$(MULTIDIR),$(subst \ + @shlib_base_name@,libunwind,$(subst \ +- @shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIBUNWIND_INSTALL)))) ++ @shlib_slibdir_qual@,$(MULTISUBDIR),$(SHLIBUNWIND_INSTALL)))) + + install-shared: + $(mkinstalldirs) $(DESTDIR)$(inst_libdir) +@@ -956,7 +956,7 @@ + + $(subst @multilib_dir@,$(MULTIDIR),$(subst \ + @shlib_base_name@,libgcc_s,$(subst \ +- @shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL)))) ++ @shlib_slibdir_qual@,$(MULTISUBDIR),$(SHLIB_INSTALL)))) + + install-leaf: $(install-shared) $(install-libunwind) + $(mkinstalldirs) $(DESTDIR)$(inst_libdir) diff --git a/sys-devel/gcc/gcc-4.9.2-r100.ebuild b/sys-devel/gcc/gcc-4.9.2-r100.ebuild index bbde906..6f6d359 100644 --- a/sys-devel/gcc/gcc-4.9.2-r100.ebuild +++ b/sys-devel/gcc/gcc-4.9.2-r100.ebuild @@ -63,6 +63,9 @@ REQUIRED_USE=" pie? ( !vanilla ) ssp? ( !vanilla )" +# Custom magic. +RESTRICT="strip" + pkg_setup() { export CTARGET=${CTARGET:-${CHOST}} @@ -102,13 +105,16 @@ setup_multilib_osdirnames() { src_prepare() { export BRANDING_GCC_PKGVERSION="Gentoo ${PVR}::mgorny" - if has_version '<sys-libs/glibc-2.12' ; then - ewarn "Your host glibc is too old; disabling automatic fortify." - ewarn "Please rebuild gcc after upgrading to >=glibc-2.12 #362315" - rm "${WORKDIR}"/patch/10_all_default-fortify-source.patch || die - fi + # fix libgcc_s install path + epatch "${FILESDIR}"/gcc-4.6.4-fix-libgcc-s-path-with-vsrl.patch || die if ! use vanilla; then + if has_version '<sys-libs/glibc-2.12' ; then + ewarn "Your host glibc is too old; disabling automatic fortify." + ewarn "Please rebuild gcc after upgrading to >=glibc-2.12 #362315" + rm "${WORKDIR}"/patch/10_all_default-fortify-source.patch || die + fi + BRANDING_GCC_PKGVERSION+=" p${PATCH_VER}" einfo "Applying Gentoo patches ..." @@ -184,12 +190,12 @@ src_configure() { einfo "CXXFLAGS: ${CXXFLAGS}" einfo "LDFLAGS: ${LDFLAGS}" - local prefix=/usr - local binpath=${prefix}/${CTARGET}/gcc-bin/${PV} - local libpath=${prefix}/lib/gcc/${CTARGET}/${PV} - local incpath=${libpath}/include - local datapath=${prefix}/share/gcc-data/${CTARGET}/${PV} - local stdcxx_incdir=${libpath}/include/g++-v${GCC_BRANCH_VER%%.*} + PREFIX=/usr + BINPATH=${PREFIX}/${CTARGET}/gcc-bin/${PV} + LIBPATH=${PREFIX}/lib/gcc/${CTARGET}/${PV} + INCPATH=${LIBPATH}/include + DATAPATH=${PREFIX}/share/gcc-data/${CTARGET}/${PV} + STDCXX_INCDIR=${LIBPATH}/include/g++-v${GCC_BRANCH_VER%%.*} local langs=( c ) use cxx && langs+=( c++ ) @@ -203,18 +209,19 @@ src_configure() { --host=${CHOST} --build=${CBUILD:-${CHOST}} - --prefix="${prefix}" - --bindir="${binpath}" - --includedir="${incpath}" - --datadir="${datapath}" - --mandir="${datapath}/man" - --infodir="${datapath}/info" - --with-gxx-include-dir="${stdcxx_incdir}" - --with-python-dir=${datapath#${prefix}/}/python + --prefix="${PREFIX}" + --bindir="${BINPATH}" + --includedir="${INCPATH}" + --datadir="${DATAPATH}" + --mandir="${DATAPATH}/man" + --infodir="${DATAPATH}/info" + --with-gxx-include-dir="${STDCXX_INCDIR}" + --with-python-dir=${DATAPATH#${PREFIX}/}/python --enable-languages="${langs// /,}" --disable-libgcj + --disable-bootstrap --enable-obsolete --enable-secureplt --disable-werror @@ -235,6 +242,7 @@ src_configure() { # going to link in -lrt to all C++ apps. #411681 $(use_enable cxx libstdcxx-time) + --enable-version-specific-runtime-libs --enable-lto --enable-shared --enable-threads=posix @@ -414,33 +422,15 @@ src_configure() { # return to whatever directory we were in before popd > /dev/null - - # TODO: crap - - cat <<-EOF > envd - PATH="${binpath}" - ROOTPATH="${binpath}" - GCC_PATH="${binpath}" - LDPATH="${ldpaths}" - MANPATH="${datapath}/man" - INFOPATH="${datapath}/info" - STDCXX_INCDIR="${stdcxx_incdir##*/}" - CTARGET="${CTARGET}" - GCC_SPECS="${gcc_specs_file}" - MULTIOSDIRS="${mosdirs}" - EOF } src_compile() { touch "${S}"/gcc/c-gperf.h - local prefix=/usr - local libpath=${prefix}/lib/gcc/${CTARGET}/${PV} - emake -C "${WORKDIR}"/build all \ LDFLAGS="${LDFLAGS}" \ STAGE1_CFLAGS="${CFLAGS}" \ - LIBPATH="${libpath}" \ + LIBPATH="${LIBPATH}" \ BOOT_CFLAGS="$(get_abi_CFLAGS "${TARGET_DEFAULT_ABI}") ${CFLAGS}" if use cxx && use doc; then @@ -452,3 +442,187 @@ src_compile() { src_test() { emake -k -C "${WORKDIR}"/build check } + +create_gcc_symlinks() { + dodir /usr/bin + cd "${D}${BINPATH}" || die + + # First, remove all default hardlinks (we have all files + # unprefixed anyway). + rm "${CTARGET}"-* || die + + # Replace c++ hardlink with symlink. We can't drop it since + # gcc-wrapper doesn't have an alias for it... + ln -f -s g++ c++ || die + + local t + for t in *; do + # Add CTARGET-ed symlinks to make gcc-wrapper happy. + ln -s "${t}" "${CTARGET}-${t}" || die + + # Install versioned symlinks in /usr/bin. + dosym "${BINPATH}/${t}" /usr/bin/"${CTARGET}-${t}-${PV}" + dosym "${CTARGET}-${t}-${PV}" /usr/bin/"${t}-${PV}" + done +} + +strip_gcc_executables() { + # TODO: find out how to avoid prepstrip + env RESTRICT="" CHOST="${CHOST}" prepstrip "${D}${BINPATH}" + env RESTRICT="" CHOST="${CHOST}" prepstrip "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}" + env RESTRICT="" CHOST="${CTARGET}" prepstrip "${D}${LIBPATH}" +} + +# Grab a variable from the build system (taken from linux-info.eclass) +get_make_var() { + local var=$1 makefile=${2:-${WORKDIR}/build/Makefile} + echo -e "e:\\n\\t@echo \$(${var})\\ninclude ${makefile}" | \ + r=${makefile%/*} emake --no-print-directory -s -f - 2>/dev/null +} + +XGCC() { get_make_var GCC_FOR_TARGET ; } + +create_gcc_env_entry() { + dodir /etc/env.d/gcc + local gcc_envd_base="/etc/env.d/gcc/${CTARGET}-${PV}" + + local gcc_specs_file + local gcc_envd_file="${D}${gcc_envd_base}" + if [[ -z $1 ]] ; then + # I'm leaving the following commented out to remind me that it + # was an insanely -bad- idea. Stuff broke. GCC_SPECS isnt unset + # on chroot or in non-toolchain.eclass gcc ebuilds! + #gcc_specs_file="${LIBPATH}/specs" + gcc_specs_file="" + else + gcc_envd_file+="-${1}" + gcc_specs_file="${LIBPATH}/${1}.specs" + fi + + # We want to list the default ABI's LIBPATH first so libtool + # searches that directory first. This is a temporary + # workaround for libtool being stupid and using .la's from + # conflicting ABIs by using the first one in the search path + local ldpaths mosdirs mdir mosdir abi ldpath + for abi in $(get_all_abis TARGET) ; do + mdir=$($(XGCC) $(get_abi_CFLAGS ${abi}) --print-multi-directory) + ldpath=${LIBPATH} + [[ ${mdir} != "." ]] && ldpath+="/${mdir}" + ldpaths="${ldpath}${ldpaths:+:${ldpaths}}" + + mosdir=$($(XGCC) $(get_abi_CFLAGS ${abi}) -print-multi-os-directory) + mosdirs="${mosdir}${mosdirs:+:${mosdirs}}" + done + + cat <<-EOF > ${gcc_envd_file} + PATH="${BINPATH}" + ROOTPATH="${BINPATH}" + GCC_PATH="${BINPATH}" + LDPATH="${ldpaths}" + MANPATH="${DATAPATH}/man" + INFOPATH="${DATAPATH}/info" + STDCXX_INCDIR="${STDCXX_INCDIR##*/}" + CTARGET="${CTARGET}" + GCC_SPECS="${gcc_specs_file}" + MULTIOSDIRS="${mosdirs}" + EOF +} + +copy_minispecs_gcc_specs() { + # setup the hardenedno* specs files and the vanilla specs file. + if hardened_gcc_works ; then + create_gcc_env_entry hardenednopiessp + fi + if hardened_gcc_works pie ; then + create_gcc_env_entry hardenednopie + fi + if hardened_gcc_works ssp ; then + create_gcc_env_entry hardenednossp + fi + create_gcc_env_entry vanilla + insinto "${LIBPATH}" + doins "${WORKDIR}"/specs/*.specs +} + +src_install() { + cd "${WORKDIR}"/build || die + + # Fix out-of-source info-page install + local f + while read -r -d '' f; do + cp "${S}/${f}" "${f}" || die + done < <(cd "${S}" && find gcc -name '*.info') + + # Clean up include-fixed + find gcc/include-fixed -type l -delete || die + while read -r -d '' f; do + if grep 'auto-edited by fixincludes' "${f}"; then + rm "${f}" || die + fi + done < <(find gcc/include-fixed -type f) + find gcc/include-fixed -type d -empty -delete || die + + emake -j1 DESTDIR="${D}" install + + # Punt some tools which are really only useful while building gcc + find "${D}" -name install-tools -prune -type d -exec rm -r {} + || die + + create_gcc_symlinks + strip_gcc_executables + + if use doc; then + cd "${WORKDIR}/build/${CTARGET}/libstdc++-v3/doc/doxygen/man" || die + doman man*/* + fi + + # Don't scan .gox files for executable stacks - false positives + export QA_EXECSTACK="usr/lib*/go/*/*.gox" + export QA_WX_LOAD="usr/lib*/go/*/*.gox" + + # Disable RANDMMAP so PCH works. #301299 + pax-mark -r "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1" + pax-mark -r "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1plus" + + prune_libtool_files + + create_gcc_env_entry + use hardened && copy_minispecs_gcc_specs +} + +switch_gcc() { + local curr_config curr_pv + # config name: ${CTARGET}-${PV} + curr_config=$(env -i ROOT="${ROOT}" gcc-config -c "${CTARGET}" 2>&1) + + # no config? switch! + if [[ -z ${curr_config} ]]; then + gcc-config "${CTARGET}-${PV}" + return + fi + + # some config? argh, we need to parse it. + split_config=( $(env -i ROOT="${ROOT}" gcc-config -S "${CTARGET}") ) + + # different branch? we aren't doing such leaps ourselves. + if [[ ${split_config[1]%.*} != ${PV%.*} ]]; then + env -i ROOT="${ROOT}" gcc-config --use-old --force + return + fi + + if [[ -n ${split_config[2]} ]]; then + if [[ -f ${ROOT}/etc/env.d/gcc/${CTARGET}-${PV}-${split_config[2]} ]] + then + gcc-config "${CTARGET}-${PV}-${split_config[2]}" + return + else + ewarn "Spec '${split_config[2]}' used so far is no longer available." + ewarn "The default will be used instead." + fi + + gcc-config "${CTARGET}-${PV}" + fi +} + +pkg_postinst() { + switch_gcc +}