-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
21accd3
commit f14f72a
Showing
1 changed file
with
369 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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=227 | ||
DJCRX_VERSION=205 | ||
DJLSR_VERSION=205 | ||
DJDEV_VERSION=205 | ||
|
||
GCC_VERSION=7.1.0 | ||
GCC_VERSION_SHORT=7.10 | ||
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/deleted/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.bz2" | ||
GMP_ARCHIVE="http://ftpmirror.gnu.org/gmp/gmp-${GMP_VERSION}.tar.bz2" | ||
MPFR_ARCHIVE="http://ftpmirror.gnu.org/mpfr/mpfr-${MPFR_VERSION}.tar.bz2" | ||
MPC_ARCHIVE="http://ftpmirror.gnu.org/mpc/mpc-${MPC_VERSION}.tar.gz" | ||
AUTOCONF_ARCHIVE="http://ftp.gnu.org/gnu/autoconf/autoconf-${AUTOCONF_VERSION}.tar.bz2" | ||
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 | ||
|
||
# patch for binutils 2.27 | ||
patch bfd/init.c ../../../../patch-bnu27-bfd-init.txt || exit 1 | ||
|
||
# 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.bz2 || 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.bz2 || exit 1 | ||
tar xjf ../../download/mpfr-${MPFR_VERSION}.tar.bz2 || 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 | ||
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.bz2 || 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-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." |