From 66990ba52bdca6c1e102422629a29e31a6d22650 Mon Sep 17 00:00:00 2001 From: Eric Hameleers Date: Mon, 28 Sep 2020 08:33:55 +0000 Subject: MinGW-w64: this builds a package on 32bit Slackware by omitting a custom build of the gcc toolchain. --- MinGW-w64/build/MinGW-w64.SlackBuild | 192 ++++++++++++++++++++++++----------- 1 file changed, 132 insertions(+), 60 deletions(-) diff --git a/MinGW-w64/build/MinGW-w64.SlackBuild b/MinGW-w64/build/MinGW-w64.SlackBuild index 29a2189f..b8d7ae41 100755 --- a/MinGW-w64/build/MinGW-w64.SlackBuild +++ b/MinGW-w64/build/MinGW-w64.SlackBuild @@ -23,9 +23,10 @@ # ----------------------------------------------------------------------------- # # This script pays hommage to the work of Tk-Glitch -# who is the author of '(Mostly) Portable GCC/MinGW', this SlackBuild is a -# simplified version of his work. For more info, see the git homepage at -# https://github.com/Frogging-Family/mostlyportable-gcc +# who is the author of '(Mostly) Portable GCC/MinGW', this SlackBuild is an +# adapted version of his work, adding support for a 32bit OS. +# For more info, see the git homepage at: +# https://github.com/Frogging-Family/mostlyportable-gcc # # ----------------------------------------------------------------------------- # @@ -74,12 +75,63 @@ OSL=0.9.2 ISL=0.22.1 CLOOG=0.20.0 +# Automatically determine the architecture we're building on: +if [ -z "$ARCH" ]; then + case "$(uname -m)" in + i?86) ARCH=i586 ;; + arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;; + # Unless $ARCH is already set, use uname -m for all other archs: + *) ARCH=$(uname -m) ;; + esac + export ARCH +fi +# Set CFLAGS/CXXFLAGS and LIBDIRSUFFIX: +case "$ARCH" in + i?86) SLKCFLAGS="-O2 -march=${ARCH} -mtune=i686" + SLKLDFLAGS=""; LIBDIRSUFFIX="" + MINGW_TARGETS="${ARCH}-w64-mingw32" + ;; + x86_64) SLKCFLAGS="-O2 -fPIC" + SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64" + MINGW_TARGETS="i686-w64-mingw32 x86_64-w64-mingw32" + ;; + *) SLKCFLAGS=${SLKCFLAGS:-"-O2"} + SLKLDFLAGS=${SLKLDFLAGS:-""}; LIBDIRSUFFIX=${LIBDIRSUFFIX:-""} + MINGW_TARGETS="${ARCH}-w64-mingw32" + ;; +esac +TARGET=${ARCH}-slackware-linux + +# Attempting to compile our own support tools, binutils and gcc fails +# on 32bit Slackware. When the build gets to gcc I run into the error: +# "/tmp/mingw_gcc_bootstrap/bin/ld: cannot find -lc", +# and I have not found a fix for this. +# So, on 32bit Slackware we have use the system toolchain until I fix this: +if [ "$ARCH" == "x86_64" ]; then + BUILD_GCC=${BUILD_GCC:-"YES"} +else + BUILD_GCC=${BUILD_GCC:-"NO"} +fi + # Tool capabilities: GCC_EXCEPTIONS="dwarf2" GCC_LANGUAGES="c,c++,lto" MINGW_LANGUAGES="c,c++,lto,objc,obj-c++" WIN32_THREADS="false" +if [ "$ARCH" == "x86_64" ]; then + BINUTILS_TARGETS="x86_64-pep" + GCC_MULTI_ARCH="\ + --with-arch-32=i686 \ + --with-abi=m64 \ + --with-multilib-list=m32,m64 \ + --enable-multilib \ + --enable-default-pie" +else + BINUTILS_TARGETS="i386-efi-pe" + GCC_MULTI_ARCH="--disable-multilib" +fi + # Arguments for the MinGW gcc compilation: if [ "$GCC_EXCEPTIONS" == "dwarf2" ]; then EXCEPTIONS_ARGS="--disable-sjlj-exceptions --with-dwarf2" @@ -143,30 +195,6 @@ SRCURL[8]=" https://github.com/periscop/cloog/releases/download/cloog-${CLOOG}/c ## --- with a little luck, you won't have to edit below this point --- ## ## -# Automatically determine the architecture we're building on: -if [ -z "$ARCH" ]; then - case "$(uname -m)" in - i?86) ARCH=i586 ;; - arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;; - # Unless $ARCH is already set, use uname -m for all other archs: - *) ARCH=$(uname -m) ;; - esac - export ARCH -fi -# Set CFLAGS/CXXFLAGS and LIBDIRSUFFIX: -case "$ARCH" in - i?86) SLKCFLAGS="-O2 -march=${ARCH} -mtune=i686" - SLKLDFLAGS=""; LIBDIRSUFFIX="" - ;; - x86_64) SLKCFLAGS="-O2 -fPIC" - SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64" - ;; - *) SLKCFLAGS=${SLKCFLAGS:-"-O2"} - SLKLDFLAGS=${SLKLDFLAGS:-""}; LIBDIRSUFFIX=${LIBDIRSUFFIX:-""} - ;; -esac -TARGET=${ARCH}-slackware-linux - # Exit the script on errors: set -e trap 'echo "$0 FAILED at line ${LINENO}" | tee $OUTPUT/error-${PRGNAM}.log' ERR @@ -229,47 +257,57 @@ export CFLAGS="$SLKCFLAGS" export CPPFLAGS="$SLKCFLAGS" # Used in all compilations: -MINGW_TARGETS="i686-w64-mingw32 x86_64-w64-mingw32" COMMONCONFIG="--disable-shared --enable-static" # Build the supporting tools first, then build a custom gcc for our platform # and then build mingw-w64 binaries using our support tools and custom gcc: function build_support_tools() { - MY_DESTDIR=${1} + MY_DESTDIR="${1}" + MY_ARCH="${2:-""}" + + [ -z "$MY_ARCH" ] && BUILD_ARGS="" || BUILD_ARGS="--build=$MY_ARCH" # gmp: + echo "-- gmp --" cd $TMP/tmp-$PRGNAM/gmp-${GMP} ./configure \ --prefix=${MY_DESTDIR} \ - ${COMMONCONFIG} + ${COMMONCONFIG} \ + ${BUILD_ARGS} make ${NUMJOBS} || make || exit 1 make install || exit 1 # mpfr: + echo "-- mpfr --" cd $TMP/tmp-$PRGNAM/mpfr-${MPFR} ./configure \ --prefix=${MY_DESTDIR} \ --with-gmp=${MY_DESTDIR} \ - ${COMMONCONFIG} + ${COMMONCONFIG} \ + ${BUILD_ARGS} make ${NUMJOBS} || make || exit 1 make install || exit 1 # mpc: + echo "-- mpc --" cd $TMP/tmp-$PRGNAM/mpc-${MPC} ./configure \ --prefix=${MY_DESTDIR} \ --with-gmp=${MY_DESTDIR} \ --with-mpfr=${MY_DESTDIR} \ - ${COMMONCONFIG} + ${COMMONCONFIG} \ + ${BUILD_ARGS} make ${NUMJOBS} || make || exit 1 make install || exit 1 # isl: + echo "-- isl --" cd $TMP/tmp-$PRGNAM/isl-${ISL} ./configure \ --prefix=${MY_DESTDIR} \ - ${COMMONCONFIG} + ${COMMONCONFIG} \ + ${BUILD_ARGS} make ${NUMJOBS} || make || exit 1 make install || exit 1 @@ -279,6 +317,7 @@ function build_support_tools_mingw() { MY_DESTDIR=${1} # osl: + echo "-- osl --" cd $TMP/tmp-$PRGNAM/osl-${OSL} ./configure \ --prefix=${MY_DESTDIR} \ @@ -288,6 +327,7 @@ function build_support_tools_mingw() { make install || exit 1 # cloog: + echo "-- cloog --" cd $TMP/tmp-$PRGNAM/cloog-${CLOOG} ./configure \ --prefix=${MY_DESTDIR} \ @@ -300,6 +340,7 @@ function build_support_tools_mingw() { } # end build_support_tools_mingw +if [ "$BUILD_GCC" == "YES" ]; then # # --- GCC --- # @@ -318,9 +359,10 @@ chmod -R u+w,go+r-w,a+rX-st * export PATH="${GCC_BOOTSTRAP_PATH}/bin:${GCC_BOOTSTRAP_PATH}/lib:${GCC_BOOTSTRAP_PATH}/include:${PATH}" # Build the support tools: -build_support_tools ${GCC_BOOTSTRAP_PATH} +build_support_tools ${GCC_BOOTSTRAP_PATH} ${TARGET} # binutils: +echo "-- binutils --" mkdir -p $TMP/tmp-$PRGNAM/binutils-build && cd $TMP/tmp-$PRGNAM/binutils-build $TMP/tmp-$PRGNAM/binutils-${BINUTILS}/configure \ --prefix=${GCC_BOOTSTRAP_PATH} \ @@ -331,7 +373,7 @@ $TMP/tmp-$PRGNAM/binutils-${BINUTILS}/configure \ --enable-lto \ --enable-plugins \ --enable-relro \ - --enable-targets=x86_64-pep \ + --enable-targets=${BINUTILS_TARGETS} \ --enable-threads \ --disable-gdb \ --disable-werror \ @@ -344,12 +386,26 @@ make install prefix=${GCC_BOOTSTRAP_PATH} tooldir=${GCC_BOOTSTRAP_PATH} || exit # Remove unwanted files: rm -f ${GCC_BOOTSTRAP_PATH}/share/man/man1/{dlltool,nlmconv,windres,windmc}* +#if [ "$ARCH" != "x86_64" ]; then +# # Create symlinks to c and math libraries to prevent 'ld: can not find -lc': +# ln -sf /usr/lib/libc.so ${GCC_BOOTSTRAP_PATH}/lib/ +# ln -sf /usr/lib/libc.a ${GCC_BOOTSTRAP_PATH}/lib/ +# ln -sf /usr/lib/libm.so ${GCC_BOOTSTRAP_PATH}/lib/ +# ln -sf /usr/lib/libpthread.so ${GCC_BOOTSTRAP_PATH}/lib/ + #ln -sf /usr/lib/libpthread.a ${GCC_BOOTSTRAP_PATH}/lib/ +#fi + # gcc: +echo "-- gcc --" mkdir -p $TMP/tmp-$PRGNAM/gcc-build && cd $TMP/tmp-$PRGNAM/gcc-build +LDFLAGS="$LDFLAGS -Wl,--library-path=/usr/lib$LIBDIRSUFFIX" \ $TMP/tmp-$PRGNAM/gcc-${GCC}/configure \ + ${GCC_MULTI_ARCH} \ --prefix=${GCC_BOOTSTRAP_PATH} \ --with-pkgversion='alienBOB' \ + --with-build-sysroot='/' \ --enable-languages=${GCC_LANGUAGES} \ + --enable-multiarch \ --disable-bootstrap \ --with-gcc-major-version-only \ --enable-linker-build-id \ @@ -366,14 +422,8 @@ $TMP/tmp-$PRGNAM/gcc-${GCC}/configure \ --enable-gnu-unique-object \ --disable-vtable-verify \ --enable-plugin \ - --enable-default-pie \ --with-target-system-zlib=auto \ --with-system-zlib \ - --enable-multiarch \ - --with-arch-32=i686 \ - --with-abi=m64 \ - --with-multilib-list=m32,m64 \ - --enable-multilib \ --disable-werror \ --enable-checking=release \ --with-fpmath=sse \ @@ -389,20 +439,24 @@ $TMP/tmp-$PRGNAM/gcc-${GCC}/configure \ --target=${TARGET} \ || exit 1 + make ${NUMJOBS} || make || exit 1 make install || exit 1 ln -s gcc ${GCC_BOOTSTRAP_PATH}/bin/cc #libgcc: +echo "-- libgcc --" cd $TMP/tmp-$PRGNAM/gcc-build make -C ${TARGET}/libgcc install -make -C ${TARGET}/32/libgcc install make -C libcpp install make -C gcc install-po make -C ${TARGET}/libgcc install-shared -make -C ${TARGET}/32/libgcc install-shared rm -f ${GCC_BOOTSTRAP_PATH}/lib/gcc/${TARGET}/${GCC}/libgcc_eh.a -rm -f ${GCC_BOOTSTRAP_PATH}/lib/gcc/${TARGET}/${GCC}/32/libgcc_eh.a +if [ "$ARCH" == "x86_64" ]; then + make -C ${TARGET}/32/libgcc install + make -C ${TARGET}/32/libgcc install-shared + rm -f ${GCC_BOOTSTRAP_PATH}/lib/gcc/${TARGET}/${GCC}/32/libgcc_eh.a +fi for lib in \ libatomic \ libgomp \ @@ -413,18 +467,22 @@ for lib in \ libvtv; do make -C ${TARGET}/$lib install-toolexeclibLTLIBRARIES done -for lib in \ - libatomic \ - libgomp \ - libitm \ - libquadmath \ - libsanitizer/{a,l,ub}san \ - libstdc++-v3/src \ - libvtv; do - make -C ${TARGET}/32/$lib install-toolexeclibLTLIBRARIES -done +if [ "$ARCH" == "x86_64" ]; then + for lib in \ + libatomic \ + libgomp \ + libitm \ + libquadmath \ + libsanitizer/{a,l,ub}san \ + libstdc++-v3/src \ + libvtv; do + make -C ${TARGET}/32/$lib install-toolexeclibLTLIBRARIES + done +fi make -C ${TARGET}/libstdc++-v3/po install +fi # End $BUILD_GCC == YES + # # --- MINGW --- # @@ -441,13 +499,18 @@ chown -R root:root * chmod -R u+w,go+r-w,a+rX-st * # Make the process use our tools as they get built: -export PATH="${GCC_BOOTSTRAP_PATH}/bin:${GCC_BOOTSTRAP_PATH}/lib:${GCC_BOOTSTRAP_PATH}/include:${MINGW_OUTPUT_PATH}/bin:${MINGW_OUTPUT_PATH}/lib:${MINGW_OUTPUT_PATH}/include:${PATH}" +if [ "$BUILD_GCC" == "YES" ]; then + export PATH="${GCC_BOOTSTRAP_PATH}/bin:${GCC_BOOTSTRAP_PATH}/lib:${GCC_BOOTSTRAP_PATH}/include:${MINGW_OUTPUT_PATH}/bin:${MINGW_OUTPUT_PATH}/lib:${MINGW_OUTPUT_PATH}/include:${PATH}" +else + export PATH="${MINGW_OUTPUT_PATH}/bin:${MINGW_OUTPUT_PATH}/lib:${MINGW_OUTPUT_PATH}/include:${PATH}" +fi # Re-build the support tools, this time targeting MinGW: -build_support_tools ${MINGW_OUTPUT_PATH} +build_support_tools ${MINGW_OUTPUT_PATH} ${TARGET} build_support_tools_mingw ${MINGW_OUTPUT_PATH} # mingw-w64-binutils: +echo "-- mingw-w64-binutils --" cd $TMP/tmp-$PRGNAM/binutils-${BINUTILS} # Do not install libiberty: sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in @@ -473,12 +536,14 @@ for _target in ${MINGW_TARGETS}; do done # binutils docs: +echo "-- binutils-docs --" mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/binutils ( cd $TMP/tmp-$PRGNAM/binutils-${BINUTILS} cp -a $BINUTILS_DOCS $PKG/usr/doc/$PRGNAM-$VERSION/binutils/ || true ) # mingw-w64-headers: +echo "-- mingw-w64-headers --" for _target in ${MINGW_TARGETS}; do echo -e "Configuring ${_target} headers" mkdir -p $TMP/tmp-$PRGNAM/headers-${_target} && cd $TMP/tmp-$PRGNAM/headers-${_target} @@ -499,6 +564,7 @@ for _target in ${MINGW_TARGETS}; do done # mingw-w64-headers-bootstrap: +echo "-- mingw-w64-headers-bootstrap --" _dummystring="/* Dummy header, which gets overriden, if winpthread library gets installed. */" mkdir -p $TMP/tmp-$PRGNAM/dummy/ && cd $TMP/tmp-$PRGNAM//dummy echo "${_dummystring}" > pthread_signal.h @@ -514,6 +580,7 @@ done cp -r $TMP/tmp-$PRGNAM/gcc-${GCC} $TMP/tmp-$PRGNAM/gcc-${GCC}-base # mingw-w64-gcc-base: +echo "-- mingw-w64-gcc-base --" # Do not install libiberty: sed -i 's/install_to_$(INSTALL_DEST) //' $TMP/tmp-$PRGNAM/gcc-${GCC}-base/libiberty/Makefile.in for _target in ${MINGW_TARGETS}; do @@ -547,12 +614,13 @@ for _target in ${MINGW_TARGETS}; do done # mingw-w64-crt: +echo "-- mingw-w64-crt --" for _target in ${MINGW_TARGETS}; do echo -e "Building ${_target} CRT" - if [ "${_target}" == "i686-w64-mingw32" ]; then - _crt_configure_args="--disable-lib64 --enable-lib32" - elif [ "${_target}" == "x86_64-w64-mingw32" ]; then + if [ "${_target}" == "x86_64-w64-mingw32" ]; then _crt_configure_args="--disable-lib32 --enable-lib64" + else + _crt_configure_args="--disable-lib64 --enable-lib32" fi mkdir -p $TMP/tmp-$PRGNAM/crt-${_target} && cd $TMP/tmp-$PRGNAM/crt-${_target} $TMP/tmp-$PRGNAM/mingw-w64-${MINGW}/mingw-w64-crt/configure \ @@ -569,6 +637,7 @@ for _target in ${MINGW_TARGETS}; do done # mingw-w64-winpthreads: +echo "-- mingw-w64-winpthreads --" for _target in ${MINGW_TARGETS}; do echo -e "Building ${_target} winpthreads..." mkdir -p $TMP/tmp-$PRGNAM/winpthreads-build-${_target} && cd $TMP/tmp-$PRGNAM/winpthreads-build-${_target} @@ -585,12 +654,14 @@ for _target in ${MINGW_TARGETS}; do done # mingw-w64 docs: +echo "-- mingw-w64-docs --" mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/mingw-w64 ( cd $TMP/tmp-$PRGNAM/mingw-w64-${MINGW} cp -a $MINGW_DOCS $PKG/usr/doc/$PRGNAM-$VERSION/mingw-w64/ || true ) # mingw-w64-gcc: +echo "-- mingw-w64-gcc --" for _target in ${MINGW_TARGETS}; do mkdir -p $TMP/tmp-$PRGNAM/gcc-build-${_target} && cd $TMP/tmp-$PRGNAM/gcc-build-${_target} $TMP/tmp-$PRGNAM/gcc-${GCC}/configure \ @@ -639,9 +710,10 @@ rm -rf ${MINGW_OUTPUT_PATH}/share rm -f ${MINGW_OUTPUT_PATH}/lib/libcc1.* # Create lto plugin link: mkdir -p ${MINGW_OUTPUT_PATH}/lib/bfd-plugins -ln -sf ../gcc/x86_64-w64-mingw32/${GCC}/liblto_plugin.so ${MINGW_OUTPUT_PATH}/lib/bfd-plugins/liblto_plugin.so +ln -sf ../gcc/${ARCH}-w64-mingw32/${GCC}/liblto_plugin.so ${MINGW_OUTPUT_PATH}/lib/bfd-plugins/liblto_plugin.so # gcc docs: +echo "-- gcc-docs --" mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/gcc ( cd $TMP/tmp-$PRGNAM/gcc-${GCC} cp -a $GCC_DOCS $PKG/usr/doc/$PRGNAM-$VERSION/gcc/ || true -- cgit v1.2.3-65-gdbad