toolchain.eclass: support gcc patches from cygwinports
authorMichael Haubenwallner <haubi@gentoo.org>
Wed, 20 Jun 2018 16:55:17 +0000 (18:55 +0200)
committerMichael Haubenwallner <haubi@gentoo.org>
Mon, 9 Jul 2018 16:20:11 +0000 (18:20 +0200)
Download and apply patches found in Cygwin's gcc.cygport, maintained at
github/cygwinports/gcc, for a compiler running on cygwin.  The ebuild
can define the cygwinports' git commit id as CYGWINPORTS_GITREV.

eclass/toolchain.eclass

index 241a3ea89f464d231da6ff881e66ae85d205a241..0fb518a0c2ea73d68c5f0903484ac4535710b437 100644 (file)
@@ -309,6 +309,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 +383,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 +494,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 +520,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 +661,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() {