commit:     8717a4daccfd0211666d9a939ccba25e681d12bf
Author:     Ionen Wolkens <ionen <AT> gentoo <DOT> org>
AuthorDate: Thu Nov 13 04:37:29 2025 +0000
Commit:     Ionen Wolkens <ionen <AT> gentoo <DOT> org>
CommitDate: Thu Nov 13 07:48:34 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=8717a4da

dev-util/mingw64-toolchain: add 13.0.0_p1 (gcc-15.2+binutils-2.45.1)

Kind of overdue for some fixes in >=binutils-2.45 that were requiring
patches in older Wine versions with 2.44, but was kept on hold due to
needing further fixes in 2.45.1 (thanks to sam for the release, so do
not need to use a snapshot).

As far as I'm aware there is no specific reason to use a gcc snapshot
for our use case, so 15.2.0 should be fine like 15.1.0 still is afaik.

Believe no ebuild changes are needed, but have not thoroughly inspected
differences between 15.1->15.2 and 2.44->2.45.1.

Briefly tried both the oldest and newest Wine versions we have in-tree
(not all) but, like usual, hard to say if this regress anything at
runtime.

Signed-off-by: Ionen Wolkens <ionen <AT> gentoo.org>

 dev-util/mingw64-toolchain/Manifest                |   2 +
 .../mingw64-toolchain-13.0.0_p1.ebuild             | 375 +++++++++++++++++++++
 2 files changed, 377 insertions(+)

diff --git a/dev-util/mingw64-toolchain/Manifest 
b/dev-util/mingw64-toolchain/Manifest
index 4b43188ded29..c0fff29230b5 100644
--- a/dev-util/mingw64-toolchain/Manifest
+++ b/dev-util/mingw64-toolchain/Manifest
@@ -1,3 +1,5 @@
 DIST binutils-2.44.tar.xz 27285788 BLAKE2B 
0eb031ace9fb5a7047b81b5a05b1760f7d332c8ed67f98899f153a45f181b83e661a484551af05c0a9b2adc422da84619103c7b1f3c9fad5327872832b5446aa
 SHA512 
b85d3bbc0e334cf67a96219d3c7c65fbf3e832b2c98a7417bf131f3645a0307057ec81cd2b29ff2563cec53e3d42f73e2c60cc5708e80d4a730efdcc6ae14ad7
+DIST binutils-2.45.1.tar.xz 27962312 BLAKE2B 
1ccab38659ec47f9100b61322627345fe79ebd04ed0b1e872c988edded4d292d7c9ac33d9f6ea47bf265ec823dfba60da0e84374900c15ec89e3aa9280ac020c
 SHA512 
ea030419eba387579ab717be7e3223fc99e93b586860b06003c12489f93441640d4082736f76aa5e98233db4f46e232f536a45e471486de1f5b64e1b827c167e
 DIST gcc-15.1.0.tar.xz 98268344 BLAKE2B 
a902ce99db4e93615879e435bcd0b96d5a16ea0af42598ca0e6d12913b2ce3651a98574c3264b2717b848e6b5a823b403ccca0adde463938d5b41aa3f1da0d34
 SHA512 
ddd35ca6c653dffa88f7c7ef9ee4cd806e156e0f3b30f4d63e75a8363361285cd566ee73127734cde6a934611de815bee3e32e24bfd2e0ab9f7ff35c929821c1
+DIST gcc-15.2.0.tar.xz 101056276 BLAKE2B 
e270320978ca690e6e8f5ef06414dc13caf561f16403a3783c76fbf3dcee57e755a2d5bba922bf7fcae0bb6120443755d819b003791ae823d54589dd799804de
 SHA512 
89047a2e07bd9da265b507b516ed3635adb17491c7f4f67cf090f0bd5b3fc7f2ee6e4cc4008beef7ca884b6b71dffe2bb652b21f01a702e17b468cca2d10b2de
 DIST mingw-w64-v13.0.0.tar.bz2 10868704 BLAKE2B 
60f041e9a03f70e78217d169dc0f892fef1be3d242237f842f09cc755e8bd8efc9586f6a05475b427dc46bdef3d30619ad33e9c959775b22e27fad7dff93c677
 SHA512 
39a22bd92465f571df1d90ac80b88dc6846998f71e4b7db79d1c9aa6e04cb3e41b632990a7238fc2c384ea67e4a77d103230db2c0d741869340d24ea79b6dda8

diff --git a/dev-util/mingw64-toolchain/mingw64-toolchain-13.0.0_p1.ebuild 
b/dev-util/mingw64-toolchain/mingw64-toolchain-13.0.0_p1.ebuild
new file mode 100644
index 000000000000..d0aaebe85e44
--- /dev/null
+++ b/dev-util/mingw64-toolchain/mingw64-toolchain-13.0.0_p1.ebuild
@@ -0,0 +1,375 @@
+# Copyright 2022-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+MULTILIB_COMPAT=( abi_x86_{32,64} )
+inherit edo flag-o-matic multilib-build toolchain-funcs
+
+# Pick versions known to work for wine+dxvk, and avoid too frequent updates
+# due to slow rebuilds. Do _p1++ rather than revbump on changes (not using
+# Gentoo patchsets for simplicity, their changes are mostly unneeded here).
+BINUTILS_PV=2.45.1
+GCC_PV=15.2.0
+MINGW_PV=$(ver_cut 1-3)
+
+DESCRIPTION="All-in-one mingw64 toolchain intended for building Wine without 
crossdev"
+HOMEPAGE="
+       https://www.mingw-w64.org/
+       https://gcc.gnu.org/
+       https://sourceware.org/binutils/
+"
+SRC_URI="
+       
https://downloads.sourceforge.net/mingw-w64/mingw-w64/mingw-w64-release/mingw-w64-v${MINGW_PV}.tar.bz2
+       mirror://gnu/binutils/binutils-${BINUTILS_PV}.tar.xz
+"
+if [[ ${GCC_PV} == *-* ]]; then
+       SRC_URI+=" mirror://gcc/snapshots/${GCC_PV}/gcc-${GCC_PV}.tar.xz"
+else
+       SRC_URI+="
+               mirror://gcc/gcc-${GCC_PV}/gcc-${GCC_PV}.tar.xz
+               mirror://gnu/gcc/gcc-${GCC_PV}/gcc-${GCC_PV}.tar.xz
+       "
+fi
+S=${WORKDIR}
+
+# l1:binutils+gcc, l2:gcc(libraries), l3:mingw64-runtime
+LICENSE="
+       GPL-3+
+       LGPL-3+ || ( GPL-3+ libgcc libstdc++ gcc-runtime-library-exception-3.1 )
+       ZPL BSD BSD-2 ISC LGPL-2+ LGPL-2.1+ MIT public-domain
+"
+SLOT="0"
+KEYWORDS="-* ~amd64 ~x86"
+IUSE="+abi_x86_32 +bin-symlinks custom-cflags +strip"
+
+RDEPEND="
+       dev-libs/gmp:=
+       dev-libs/mpc:=
+       dev-libs/mpfr:=
+       virtual/libiconv
+       virtual/zlib:=
+       bin-symlinks? (
+               abi_x86_64? (
+                       !cross-x86_64-w64-mingw32/binutils
+                       !cross-x86_64-w64-mingw32/gcc
+               )
+               abi_x86_32? (
+                       !cross-i686-w64-mingw32/binutils
+                       !cross-i686-w64-mingw32/gcc
+               )
+       )
+"
+DEPEND="${RDEPEND}"
+
+QA_CONFIG_IMPL_DECL_SKIP=(
+       strerror_r # libstdc++ test using -Wimplicit+error
+)
+
+pkg_pretend() {
+       [[ ${MERGE_TYPE} == binary ]] && return
+
+       tc-is-cross-compiler &&
+               die "cross-compilation of the toolchain itself is unsupported"
+}
+
+src_prepare() {
+       # rename directories to simplify both patching and the ebuild
+       mv binutils{-${BINUTILS_PV},} || die
+       mv gcc{-${GCC_PV},} || die
+       mv mingw-w64-v${MINGW_PV} mingw64 || die
+
+       default
+}
+
+src_compile() {
+       # not great but do everything in src_compile given bootstrapping
+       # process needs to be done in steps of configure+compile+install
+       # (done modular to have most package-specific things in one place)
+
+       CTARGET=$(usex x86 i686 x86_64)-w64-mingw32
+
+       MWT_D=${T}/root # moved to ${D} in src_install
+       local mwtdir=/usr/lib/${PN}
+       local prefix=${EPREFIX}${mwtdir}
+       local sysroot=${MWT_D}${prefix}
+       local -x PATH=${sysroot}/bin:${PATH}
+
+       filter-lto # requires setting up, and may be messy with mingw static 
libs
+       use custom-cflags || strip-flags # fancy flags are not realistic here
+
+       local multilib=false
+       use abi_x86_32 && use abi_x86_64 && multilib=true
+
+       # global configure flags
+       local conf=(
+               --build=${CBUILD:-${CHOST}}
+               --target=${CTARGET}
+               --{doc,info,man}dir=/.skip # let the real binutils+gcc handle 
docs
+               MAKEINFO=: #922230
+       )
+
+       # binutils
+       local conf_binutils=(
+               --prefix="${prefix}"
+               --host=${CHOST}
+               --disable-cet
+               --disable-default-execstack
+               --disable-nls
+               --disable-shared
+               --with-system-zlib
+               --without-debuginfod
+               --without-msgpack
+               --without-xxhash
+               --without-zstd
+       )
+       mwt-binutils() {
+               # symlink gcc's lto plugin for AR (bug #854516)
+               ln -s 
../../libexec/gcc/${CTARGET}/${GCC_PV%%[.-]*}/liblto_plugin.so \
+                       "${sysroot}"/lib/bfd-plugins || die
+       }
+
+       # gcc (minimal -- if need more, disable only in stage1 / enable in 
stage3)
+       local conf_gcc=(
+               --prefix="${prefix}"
+               --host=${CHOST}
+               --disable-bootstrap
+               --disable-cet
+               --disable-gcov #843989
+               --disable-gomp
+               --disable-libquadmath
+               --disable-libsanitizer
+               --disable-libssp
+               --disable-libvtv
+               --disable-shared
+               --disable-werror
+               --with-gcc-major-version-only
+               --with-system-zlib
+               --without-isl
+               --without-zstd
+       )
+       ${multilib} || conf_gcc+=( --disable-multilib )
+       # libstdc++ may misdetect sys/sdt.h on systemtap-enabled system and fail
+       # (not passed in conf_gcc above given it is lost in sub-configure calls)
+       local -x glibcxx_cv_sys_sdt_h=no
+
+       local conf_gcc_stage1=(
+               --enable-languages=c
+               --disable-libatomic
+               --with-sysroot="${sysroot}"
+       )
+       local -n conf_gcc_stage2=conf_gcc_stage1
+
+       local conf_gcc_stage3=(
+               --enable-languages=c,c++
+               --enable-threads=posix # needs stage3, and is required for 
dxvk/vkd3d
+               --with-sysroot="${prefix}"
+               --with-build-sysroot="${sysroot}"
+       )
+
+       # mingw64-runtime (split in several parts, 3 needed for gcc stages)
+       local conf_mingw64=(
+               --prefix="${prefix}"/${CTARGET}
+               --host=${CTARGET}
+               --with-sysroot=no
+               --without-{crt,headers}
+
+               # mingw .dll aren't used by wine and packages wouldn't find them
+               # at runtime, use crossdev if need dll and proper search paths
+               --disable-shared
+       )
+
+       local conf_mingw64_headers=(
+               --enable-idl
+               --with-headers
+
+               # ucrt has not been tested and migration needs looking into, 
force
+               # msvcrt-os for now (if really want this either use crossdev or
+               # override using MWT_MINGW64_{HEADERS,RUNTIME}_CONF=... env 
vars)
+               --with-default-msvcrt=msvcrt-os
+       )
+       mwt-mingw64_headers() { ln -s ${CTARGET} "${sysroot}"/mingw || die; } 
#419601
+
+       local conf_mingw64_runtime=(
+               --with-crt
+               --with-default-msvcrt=msvcrt-os # match with headers
+       )
+       ${multilib} ||
+               conf_mingw64_runtime+=( $(usex x86 --disable-lib64 
--disable-lib32 ) )
+
+       local conf_mingw64_libraries=( --with-libraries )
+       local conf_mingw64_libraries32=(
+               --libdir="${prefix}"/${CTARGET}/lib32
+               --with-libraries
+               CC="${CTARGET}-gcc -m32"
+               RCFLAGS="--target=pe-i386 ${RCFLAGS}"
+       )
+
+       # mingw64-runtime's idl compiler (useful not to depend on wine for widl)
+       local conf_widl=( --prefix="${prefix}" )
+
+       # mwt-build [-x] <path/package-name> [stage-name]
+       # -> ./configure && make && make install && mwt-package() && 
mwt-package_stage()
+       # passes conf, conf_package, and conf_package_stage arrays to 
configure, and
+       # users can add options through environment with e.g.
+       #       MWT_BINUTILS_CONF="--some-option"
+       #       MWT_GCC_STAGE1_CONF="--some-gcc-stage1-only-option"
+       #       MWT_WIDL_CONF="--some-other-option"
+       #       EXTRA_ECONF="--global-option" (generic naming for if not 
reading this)
+       mwt-build() {
+               if [[ ${1} == -x ]]; then
+                       (
+                               # cross-compiling, cleanup and let ./configure 
handle it
+                               unset AR AS CC CPP CXX DLLTOOL LD NM OBJCOPY 
OBJDUMP RANLIB RC STRIP
+                               CHOST=${CTARGET}
+                               filter-flags '-fuse-ld=*'
+                               filter-flags '-mfunction-return=thunk*' #878849
+
+                               # support for stack-protector is still new and 
experimental
+                               # for mingw and issues can also be harder to 
debug + fix for
+                               # upstreams using it, if feeling concerned 
about security
+                               # would advise to either not use wine or at 
least contain it
+                               use custom-cflags || filter-flags 
'-fstack-protector*' #931512
+
+                               # some bashrc-mv users tend to do 
CFLAGS="${LDFLAGS}" and then
+                               # strip-unsupported-flags miss these during 
compile-only tests
+                               # (primarily done for 23.0 profiles' -z, not 
full coverage)
+                               filter-flags '-Wl,-z,*'
+
+                               # -mavx with mingw-gcc has a history of obscure 
issues and
+                               # disabling is seen as safer, e.g. 
`WINEARCH=win32 winecfg`
+                               # crashes with -march=skylake >=wine-8.10, 
similar issues with
+                               # znver4: 
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110273
+                               append-flags -mno-avx
+
+                               strip-unsupported-flags
+                               mwt-build "${@:2}"
+                       )
+                       return
+               fi
+
+               local id=${1##*/}
+               local build_dir=${WORKDIR}/${1}${2+_${2}}-build
+
+               # econf is not allowed in src_compile and its defaults are
+               # mostly unused here, so use configure directly
+               local conf=( "${WORKDIR}/${1}"/configure "${conf[@]}" )
+
+               local -n conf_id=conf_${id} conf_id2=conf_${id}_${2}
+               [[ ${conf_id@a} == *a* ]] && conf+=( "${conf_id[@]}" )
+               [[ ${2} && ${conf_id2@a} == *a* ]] && conf+=( "${conf_id2[@]}" )
+
+               local -n extra_id=MWT_${id^^}_CONF 
extra_id2=MWT_${id^^}_${2^^}_CONF
+               conf+=( ${EXTRA_ECONF} ${extra_id} ${2+${extra_id2}} )
+
+               einfo "Building ${id}${2+ ${2}} in ${build_dir} ..."
+
+               mkdir -p "${build_dir}" || die
+               pushd "${build_dir}" >/dev/null || die
+
+               edo "${conf[@]}"
+               emake MAKEINFO=: V=1
+               # -j1 to match bug #906155, other packages may be fragile too
+               emake -j1 MAKEINFO=: V=1 DESTDIR="${MWT_D}" install
+
+               declare -f mwt-${id} >/dev/null && edo mwt-${id}
+               declare -f mwt-${id}_${2} >/dev/null && edo mwt-${id}_${2}
+
+               popd >/dev/null || die
+       }
+
+       # workaround race condition with out-of-source crt build (bug #879537)
+       mkdir -p mingw64_runtime-build/mingw-w64-crt/lib{32,64} || die
+
+       # build with same ordering that crossdev would do + stage3 for pthreads
+       mwt-build binutils
+       mwt-build mingw64 headers
+       mwt-build gcc stage1
+       mwt-build -x mingw64 runtime
+       mwt-build gcc stage2
+       ${multilib} && mwt-build -x mingw64 libraries32
+       mwt-build -x mingw64 libraries
+       mwt-build gcc stage3
+       mwt-build mingw64/mingw-w64-tools/widl
+       # note: /could/ system-bootstrap if already installed, but gcc and
+       # libraries will use the system's older mingw64 headers/static-libs
+       # and make this potentially fragile without more workarounds/stages
+
+       if ${multilib}; then
+               # Like system's gcc, `x86_64-w64-mingw32-gcc -m32` can build 
for x86,
+               # but packages expect crossdev's i686-w64-mingw32-gcc which is 
the same
+               # just without 64bit support and would rather not build the 
toolchain
+               # twice. Dirty but wrap to allow simple interoperability with 
crossdev.
+               mwt-i686_wrapper() {
+                       printf "#!/usr/bin/env sh\nexec 
\"${prefix}/bin/${bin}\" ${*} "'"${@}"\n' \
+                               > ${bin32} || die
+                       chmod +x ${bin32} || die
+               }
+               pushd "${sysroot}"/bin >/dev/null || die
+               local bin bin32
+               for bin in ${CTARGET}-*; do
+                       bin32=${bin/x86_64-w64/i686-w64}
+                       case ${bin#${CTARGET}-} in
+                               as) mwt-i686_wrapper --32;;
+                               cpp|gcc|gcc-${GCC_PV%%[.-]*}|g++|widl) 
mwt-i686_wrapper -m32;;
+                               ld|ld.bfd) mwt-i686_wrapper -m i386pe;;
+                               windres) mwt-i686_wrapper --target=pe-i386;;
+                               *) ln -s ${bin} ${bin32} || die;;
+                       esac
+               done
+               popd >/dev/null || die
+       fi
+
+       if use bin-symlinks; then
+               mkdir -p -- "${MWT_D}${EPREFIX}"/usr/bin/ || die
+               local bin
+               for bin in "${sysroot}"/bin/*; do
+                       ln -rs -- "${bin}" "${MWT_D}${EPREFIX}"/usr/bin/ || die
+               done
+       fi
+
+       # portage doesn't know the right strip executable to use for CTARGET
+       # and it can lead to .a mangling, notably with 32bit (breaks toolchain)
+       dostrip -x ${mwtdir}/{${CTARGET}/lib{,32},lib/gcc/${CTARGET}}
+
+       # ... and instead do it here given this saves ~60MB
+       if use strip; then
+               einfo "Stripping ${CTARGET} static libraries ..."
+               find "${sysroot}"/{,lib/gcc/}${CTARGET} -type f -name '*.a' \
+                       -exec ${CTARGET}-strip --strip-unneeded {} + || die
+       fi
+}
+
+src_install() {
+       mv -- "${MWT_D}${EPREFIX}"/* "${ED}" || die
+
+       find "${ED}" -type f -name '*.la' -delete || die
+}
+
+pkg_postinst() {
+       use bin-symlinks && has_version dev-util/shadowman && [[ ! ${ROOT} ]] &&
+               eselect compiler-shadow update all
+
+       if [[ ! ${REPLACING_VERSIONS} ]]; then
+               elog "Note that this package is primarily intended for Wine and 
related"
+               elog "packages to depend on without needing a manual crossdev 
setup."
+               elog
+               elog "Settings are oriented only for what these need and 
simplicity."
+               elog "Use sys-devel/crossdev if need full 
toolchain/customization:"
+               elog "    https://wiki.gentoo.org/wiki/Mingw";
+               elog "    https://wiki.gentoo.org/wiki/Crossdev";
+       fi
+
+       local cross_gcc=cross-$(usex x86 i686 x86_64)-w64-mingw32/gcc
+       if has_version ${cross_gcc}; then
+               # encourage cleanup given users may not realize if switch by 
default
+               ewarn "${cross_gcc} is installed, note that ${PN}"
+               ewarn "is redundant with the 
*-w64-mingw32/{binutils,gcc,mingw64-runtime}"
+               ewarn "packages and optionally only one needs to be kept."
+       fi
+}
+
+pkg_postrm() {
+       use bin-symlinks && has_version dev-util/shadowman && [[ ! ${ROOT} ]] &&
+               eselect compiler-shadow clean all
+}

Reply via email to