Skip to content

Commit

Permalink
Support 7.2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewwutw committed Aug 22, 2017
1 parent 9be9f46 commit 3a90404
Show file tree
Hide file tree
Showing 2 changed files with 372 additions and 2 deletions.
5 changes: 3 additions & 2 deletions README.md
Expand Up @@ -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.
Expand Down
369 changes: 369 additions & 0 deletions 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."

0 comments on commit 3a90404

Please sign in to comment.