From 3a9040431e57a87664fe82806ec535b70ae40a61 Mon Sep 17 00:00:00 2001 From: Andrew Wu Date: Tue, 22 Aug 2017 16:38:36 +0800 Subject: [PATCH] Support 7.2.0 --- README.md | 5 +- script/7.2.0 | 369 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 372 insertions(+), 2 deletions(-) create mode 100755 script/7.2.0 diff --git a/README.md b/README.md index 16cea30..4395ab9 100644 --- a/README.md +++ b/README.md @@ -82,11 +82,12 @@ Currently supported djgpp-version : * 6.3.0 * 6.4.0 * 7.1.0 +* 7.2.0 -For example, to build DJGPP for gcc 7.1.0 : +For example, to build DJGPP for gcc 7.2.0 : ``` -./build-djgpp.sh 7.1.0 +./build-djgpp.sh 7.2.0 ``` It will download all necessary files, build DJGPP compiler and binutils, and install it. diff --git a/script/7.2.0 b/script/7.2.0 new file mode 100755 index 0000000..d0a5e84 --- /dev/null +++ b/script/7.2.0 @@ -0,0 +1,369 @@ +#!/usr/bin/env bash + +unset CDPATH + +# target directory +DJGPP_PREFIX=${DJGPP_PREFIX-/usr/local/djgpp} + +# enabled languages +#ENABLE_LANGUAGES=${ENABLE_LANGUAGES-c,c++,f95,objc,obj-c++} +ENABLE_LANGUAGES=${ENABLE_LANGUAGES-c,c++} + +#DJGPP_DOWNLOAD_BASE="ftp://ftp.delorie.com/pub" +DJGPP_DOWNLOAD_BASE="http://www.delorie.com/pub" + +# source tarball versions +BINUTILS_VERSION=229 +DJCRX_VERSION=205 +DJLSR_VERSION=205 +DJDEV_VERSION=205 + +GCC_VERSION=7.2.0 +GCC_VERSION_SHORT=7.20 +GMP_VERSION=6.1.2 +MPFR_VERSION=3.1.5 +MPC_VERSION=1.0.3 +AUTOCONF_VERSION=2.64 +AUTOMAKE_VERSION=1.11.6 + +CC=gcc +CXX=g++ + +# use gmake under FreeBSD +if [ `uname` = "FreeBSD" ]; then + MAKE=gmake + export CC=clang + export CXX=clang++ +else + MAKE=make +fi + +# tarball location +BINUTILS_ARCHIVE="${DJGPP_DOWNLOAD_BASE}/djgpp/current/v2gnu/bnu${BINUTILS_VERSION}s.zip" +DJCRX_ARCHIVE="${DJGPP_DOWNLOAD_BASE}/djgpp/current/v2/djcrx${DJCRX_VERSION}.zip" +DJLSR_ARCHIVE="${DJGPP_DOWNLOAD_BASE}/djgpp/current/v2/djlsr${DJLSR_VERSION}.zip" +DJDEV_ARCHIVE="${DJGPP_DOWNLOAD_BASE}/djgpp/current/v2/djdev${DJDEV_VERSION}.zip" + +DJCROSS_GCC_ARCHIVE="${DJGPP_DOWNLOAD_BASE}/djgpp/rpms/djcross-gcc-${GCC_VERSION}/djcross-gcc-${GCC_VERSION}.tar.bz2" +GCC_ARCHIVE="http://ftpmirror.gnu.org/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.xz" +GMP_ARCHIVE="http://ftpmirror.gnu.org/gmp/gmp-${GMP_VERSION}.tar.xz" +MPFR_ARCHIVE="http://ftpmirror.gnu.org/mpfr/mpfr-${MPFR_VERSION}.tar.xz" +MPC_ARCHIVE="http://ftpmirror.gnu.org/mpc/mpc-${MPC_VERSION}.tar.gz" +AUTOCONF_ARCHIVE="http://ftp.gnu.org/gnu/autoconf/autoconf-${AUTOCONF_VERSION}.tar.xz" +AUTOMAKE_ARCHIVE="http://ftp.gnu.org/gnu/automake/automake-${AUTOMAKE_VERSION}.tar.xz" + +# gcc 4.9.0 unpack-gcc.sh needs to be patched for OSX +PATCH_UNPACK_GCC_SH="patch-unpack-gcc-490.txt" + +# check required programs +REQ_PROG_LIST="${CXX} ${CC} unzip bison flex ${MAKE} makeinfo patch" + +# MinGW doesn't have curl, so we use wget. +if uname|grep "^MINGW32" > /dev/null; then + USE_WGET=1 +fi + +# use curl or wget? +if [ ! -z $USE_WGET ]; then + REQ_PROG_LIST+=" wget" +else + REQ_PROG_LIST+=" curl" +fi + +for REQ_PROG in $REQ_PROG_LIST; do + if ! which $REQ_PROG > /dev/null; then + echo "$REQ_PROG not installed" + exit 1 + fi +done + +# check GNU sed is installed or not. +# It is for OSX, which doesn't ship with GNU sed. +if ! sed --version 2>/dev/null |grep "GNU sed" > /dev/null ;then + echo GNU sed is not installed, need to download. + SED_VERSION=4.2.2 + SED_ARCHIVE="http://ftp.gnu.org/gnu/sed/sed-${SED_VERSION}.tar.bz2" +else + SED_ARCHIVE="" +fi + +# check zlib is installed +if ! ${CC} test-zlib.c -o test-zlib -lz; then + echo "zlib not installed" + exit 1 +fi +rm test-zlib 2>/dev/null +rm test-zlib.exe 2>/dev/null + +# download source files +ARCHIVE_LIST="$BINUTILS_ARCHIVE $DJCRX_ARCHIVE $DJLSR_ARCHIVE $DJDEV_ARCHIVE + $SED_ARCHIVE $DJCROSS_GCC_ARCHIVE $GCC_ARCHIVE + $GMP_ARCHIVE $MPFR_ARCHIVE $MPC_ARCHIVE + $AUTOCONF_ARCHIVE $AUTOMAKE_ARCHIVE" + +echo "Download source files..." +mkdir -p download || exit 1 +cd download + +for ARCHIVE in $ARCHIVE_LIST; do + FILE=`basename $ARCHIVE` + if ! [ -f $FILE ]; then + echo "Download $ARCHIVE ..." + if [ ! -z $USE_WGET ]; then + if ! wget -U firefox $ARCHIVE; then + rm $FILE + exit 1 + fi + else + if ! curl -f $ARCHIVE -L -o $FILE; then + rm $FILE + exit 1 + fi + fi + fi +done +cd .. + +# create target directory, check writable. +echo "Make prefix directory : $DJGPP_PREFIX" +mkdir -p $DJGPP_PREFIX + +if ! [ -d $DJGPP_PREFIX ]; then + echo "Unable to create prefix directory" + exit 1 +fi + +if ! [ -w $DJGPP_PREFIX ]; then + echo "prefix directory is not writable." + exit 1 +fi + +# make build dir +echo "Make build dir" +rm -rf build || exit 1 +mkdir -p build || exit 1 +cd build + +# build binutils +echo "Building bintuils" +mkdir bnu${BINUTILS_VERSION}s +cd bnu${BINUTILS_VERSION}s +unzip ../../download/bnu${BINUTILS_VERSION}s.zip || exit 1 +cd gnu/binutils-* || exit + +# exec permission of some files are not set, fix it. +for EXEC_FILE in install-sh missing; do + echo "chmod a+x $EXEC_FILE" + chmod a+x $EXEC_FILE || exit 1 +done + +sh ./configure \ + --prefix=$DJGPP_PREFIX \ + --target=i586-pc-msdosdjgpp \ + --program-prefix=i586-pc-msdosdjgpp- \ + --disable-werror \ + --disable-nls \ + || exit 1 + +${MAKE} configure-bfd || exit 1 +${MAKE} -C bfd stmp-lcoff-h || exit 1 +${MAKE} || exit 1 + +if [ ! -z $MAKE_CHECK ]; then + echo "Run ${MAKE} check" + ${MAKE} check || exit 1 +fi + +${MAKE} install || exit 1 + +cd ../../.. +# binutils done + +# prepare djcrx +echo "Prepare djcrx" +mkdir djcrx${DJCRX_VERSION} +cd djcrx${DJCRX_VERSION} +unzip ../../download/djcrx${DJCRX_VERSION}.zip || exit 1 +patch -p1 -u < ../../patch/patch-djcrx205.txt || exit 1 + +cd src/stub +${CC} -O2 stubify.c -o stubify || exit 1 +${CC} -O2 stubedit.c -o stubedit || exit 1 + +cd ../.. + +mkdir -p $DJGPP_PREFIX/i586-pc-msdosdjgpp/sys-include || exit 1 +cp -rp include/* $DJGPP_PREFIX/i586-pc-msdosdjgpp/sys-include/ || exit 1 +cp -rp lib $DJGPP_PREFIX/i586-pc-msdosdjgpp/ || exit 1 +cp -p src/stub/stubify $DJGPP_PREFIX/i586-pc-msdosdjgpp/bin/ || exit 1 +cp -p src/stub/stubedit $DJGPP_PREFIX/i586-pc-msdosdjgpp/bin/ || exit 1 + +cd .. +# djcrx done + +# build gcc +tar -xjvf ../download/djcross-gcc-${GCC_VERSION}.tar.bz2 || exit 1 +cd djcross-gcc-${GCC_VERSION}/ + +BUILDDIR=`pwd` + +echo "Building autoconf" +cd $BUILDDIR +tar xJf ../../download/autoconf-${AUTOCONF_VERSION}.tar.xz || exit 1 +cd autoconf-${AUTOCONF_VERSION}/ +./configure --prefix=$BUILDDIR/tmpinst || exit 1 +${MAKE} all install || exit 1 + +echo "Building automake" +cd $BUILDDIR +tar xJf ../../download/automake-${AUTOMAKE_VERSION}.tar.xz || exit 1 +cd automake-${AUTOMAKE_VERSION}/ +PATH="$BUILDDIR//tmpinst/bin:$PATH" \ +./configure --prefix=$BUILDDIR/tmpinst || exit 1 +PATH="$BUILDDIR//tmpinst/bin:$PATH" \ +${MAKE} all install || exit 1 + +# build GNU sed if needed. +if [ ! -z $SED_VERSION ]; then + echo "Building sed" + cd $BUILDDIR + tar xjf ../../download/sed-${SED_VERSION}.tar.bz2 || exit 1 + cd sed-${SED_VERSION}/ + ./configure --prefix=$BUILDDIR/tmpinst || exit 1 + ${MAKE} all install || exit 1 +fi + +cd $BUILDDIR +tar xJf ../../download/gmp-${GMP_VERSION}.tar.xz || exit 1 +tar xJf ../../download/mpfr-${MPFR_VERSION}.tar.xz || exit 1 +tar xzf ../../download/mpc-${MPC_VERSION}.tar.gz || exit 1 + +if [ ! -z $PATCH_UNPACK_GCC_SH ]; then + echo "Patch unpack-gcc.sh" + patch unpack-gcc.sh ../../${PATCH_UNPACK_GCC_SH} || exit 1 + # patch for .xz compressed file. + sed -i -e 's/tar xjf/tar xJf/' unpack-gcc.sh || exit 1 + if [ `uname` = "FreeBSD" ]; then + # The --verbose option is not recognized by BSD patch + sed -i '.bsd.back' 's/patch --verbose/patch/' unpack-gcc.sh + fi +fi + +echo "Running unpack-gcc.sh" +PATH="$BUILDDIR/tmpinst/bin:$PATH" sh unpack-gcc.sh --no-djgpp-source ../../download/gcc-${GCC_VERSION}.tar.xz || exit 1 + +# copy stubify programs +cp $DJGPP_PREFIX/i586-pc-msdosdjgpp/bin/stubify $BUILDDIR/tmpinst/bin + +echo "Building gmp" +cd $BUILDDIR/gmp-*/ +./configure --enable-fat --prefix=$BUILDDIR/tmpinst --enable-static --disable-shared || exit 1 +${MAKE} all || exit 1 +if [ ! -z $MAKE_CHECK ]; then + echo "Run ${MAKE} check" + ${MAKE} check || exit 1 +fi +${MAKE} install || exit 1 + +echo "Building mpfr" +cd $BUILDDIR/mpfr-${MPFR_VERSION}/ +./configure --prefix=$BUILDDIR/tmpinst --with-gmp=$BUILDDIR/tmpinst --enable-static --disable-shared || exit 1 +${MAKE} all || exit 1 +if [ ! -z $MAKE_CHECK ]; then + echo "Run ${MAKE} check" + ${MAKE} check || exit 1 +fi +${MAKE} install || exit 1 + +echo "Building mpc" +cd $BUILDDIR/mpc-${MPC_VERSION}/ +./configure --prefix=$BUILDDIR/tmpinst --with-gmp=$BUILDDIR/tmpinst --with-mpfr=$BUILDDIR/tmpinst --enable-static --disable-shared || exit 1 +${MAKE} all || exit 1 +if [ ! -z $MAKE_CHECK ]; then + echo "Run ${MAKE} check" + ${MAKE} check || exit 1 +fi +${MAKE} install || exit 1 + +echo "Building gcc" +cd $BUILDDIR/ + +mkdir djcross +cd djcross + +PATH="$BUILDDIR//tmpinst/bin:$PATH" \ +../gnu/gcc-${GCC_VERSION_SHORT}/configure \ + --target=i586-pc-msdosdjgpp \ + --program-prefix=i586-pc-msdosdjgpp- \ + --prefix=$DJGPP_PREFIX \ + --disable-nls \ + --disable-plugin \ + --disable-lto \ + --enable-lto \ + --enable-libstdcxx-filesystem-ts \ + --enable-libquadmath-support \ + --with-gmp=$BUILDDIR/tmpinst \ + --with-mpfr=$BUILDDIR/tmpinst \ + --with-mpc=$BUILDDIR/tmpinst \ + --enable-version-specific-runtime-libs \ + --enable-languages=${ENABLE_LANGUAGES} \ + || exit 1 + +${MAKE} j=4 "PATH=$BUILDDIR/tmpinst/bin:$PATH" || exit 1 + +${MAKE} install-strip || exit 1 + +echo "Copy long name executables to short name." +( + cd $DJGPP_PREFIX || exit 1 + SHORT_NAME_LIST="gcc g++ c++ addr2line c++filt cpp size strings" + for SHORT_NAME in $SHORT_NAME_LIST; do + if [ -f bin/i586-pc-msdosdjgpp-gcc ]; then + cp bin/i586-pc-msdosdjgpp-$SHORT_NAME i586-pc-msdosdjgpp/bin/$SHORT_NAME + fi + done +) || exit 1 + +# gcc done + +# build djlsr (for dxegen / exe2coff) +echo "Prepare djlsr" +cd $BUILDDIR +cd .. +rm -rf djlsr${DJLSR_VERSION} +mkdir djlsr${DJLSR_VERSION} +cd djlsr${DJLSR_VERSION} +unzip ../../download/djlsr${DJLSR_VERSION}.zip || exit 1 +unzip ../../download/djdev${DJDEV_VERSION}.zip "include/*" || exit 1 +patch -p1 -u < ../../patch/patch-djlsr205.txt || exit 1 +cd src +PATH=$DJGPP_PREFIX/bin/:$PATH make || exit 1 +cp dxe/dxegen dxe/dxe3gen dxe/dxe3res $DJGPP_PREFIX/i586-pc-msdosdjgpp/bin/ || exit 1 +cd .. +cd src/stub +${CC} -o exe2coff exe2coff.c || exit 1 +cp -p exe2coff $DJGPP_PREFIX/i586-pc-msdosdjgpp/bin/ || exit 1 +cd ../../.. +# djlsr done + +# copy setenv script +(cd $BUILDDIR/../../setenv/ && ./copyfile.sh $DJGPP_PREFIX) || exit 1 + +echo "Testing DJGPP." +cd $BUILDDIR +cd .. +echo "Use DJGPP to build a test C program." +$DJGPP_PREFIX/bin/i586-pc-msdosdjgpp-gcc ../hello.c -o hello || exit 1 + +for x in $(echo $ENABLE_LANGUAGES | tr "," " ") +do + case $x in + c++) + echo "Use DJGPP to build a test C++ program." + $DJGPP_PREFIX/bin/i586-pc-msdosdjgpp-c++ ../hello-cpp.cpp -o hello-cpp || exit 1 + ;; + esac +done +exit 1 + +echo "build-djgpp.sh done."