[success] BuildMingwCross host=darwin target=mingw32

Mitch Murphy mitch@mix5.com
Mon Jan 2 07:39:00 GMT 2006


i didn't use crosstools-0.38 for this one. instead i made a few  
changes to another script i found at ...

http://www.mingw.org/MinGWiki/index.php/BuildMingwCross

any reason why mingw is not supported by crosstools ? scripts only  
work for glibc targets ?

cheers,
Mitch



-----------

#! /bin/bash

# This is my script for building a complete MinGW cross-compiler  
toolchain
# that runs under Linux to produce executables that run under  
Windows.  It
# probably works (or can easily be adapted to work) under any unix  
system.
#
# It is based in large part on Sam Lantinga's script, which in turn was
# based partly on Ray Kelm's script, which in turn was built on
# Mo Dejong's script for doing the same, but with some added fixes.
#
# My changes:
#       1. Adapted the script to the new packaging of MinGW GCC,  
which is
#          currently split into core and auxiliary components.
#       2. The script now determines the GCC and BINUTILS directory name
#          directly from the tar file contents.  This gets around common
#          problems due to the directory names not always following the
#          expected patterns.
#       3. Grouped together and simplified the macros that users need to
#          define.
#       4. Made optional components truly optional -- leave the
#          corresponding archive names blank and they will be ignored.
#       5. Included an option to purge the installation directory before
#          installing the current cross-compiler.
#
# NOTE: If you choose a destination directory for the installation (set
# in the macro PREFIX) for which you do not have write access, you will
# need to run this script with root (or equivalent) privileges.
#
#
# Updated by Igor Mikolic-Torreira <igormt@alumni.caltech.edu>
#
# Additional changes by MitchMurphy 2005/12/29
#
# 	2.1) binutils-2.16.91-20050827-1-src.tar.gz as per JoelDice
# 	2.2) MAKEFLAGS for parallel make
#		2.3) built under Mac OS X 10.4
#


#-----------------------------------------------------
#
# BEGIN USER SETTINGS
#
# You need to review and adjust the macros that follow
#
#-----------------------------------------------------

# What are your make flags? (ie. -j 8 for a parallel build)

MAKEFLAGS='-j 8'

# What flavor of GCC cross-compiler are we building?

TARGET=mingw32

# What directory will the cross-compiler be built in?
# This is the directory into which source archives will
# be downloaded, expanded, compiled, etc.  You need to
# have write-access to this directory.  If you leave it
# blank, it defaults to the current directory.

BUILDDIR=

# Where does the cross-compiler go?
# This should be the directory into which your cross-compiler
# will be installed.  Remember that if you set this to a directory
# that only root has write access to, you will need to run this
# script as root.

PREFIX=/Developer/SDKs/gcc-4.0.2-mingw.sdk

# Purge anything and everything already in the $PREFIX
#(also known as the destination or installation) directory?
# Set to "Y" to purge, any other value omits the purge step.

PURGE_DIR="Y"


# Set the following to the files from the current MinGW release
# (or whichever MinGW release you wish to build and install)
# You need to set both the URL they will be downloaded from
# and the exact name of the individual component files.

MINGW_URL="http://heanet.dl.sourceforge.net/sourceforge/mingw"

GCC_URL="http://mirrors.rcn.net/pub/sourceware/gcc/releases/gcc-4.0.2"

# GCC_CORE is required; the other components are optional.
# Set any you don't want to "".  You need binutils,
# mingw runtime and w32api; do not ever set those to "".

GCC_CORE_ARCHIVE="gcc-core-4.0.2.tar.gz"
# GCC_GPP_ARCHIVE="gcc-g++-4.0.2.tar.gz"
GCC_OBJC_ARCHIVE="gcc-objc-4.0.2.tar.gz"

# GCC_G77_ARCHIVE="gcc-g77-3.4.2-20040916-1-src.tar.gz"
# GCC_OBJC_ARCHIVE="gcc-objc-3.4.2-20040916-1-src.tar.gz"
# GCC_JAVA_ARCHIVE="gcc-java-3.4.2-20040916-1-src.tar.gz"
GCC_ADA_ARCHIVE=""
GCC_PATCH=""


# "The specified version of binutils did not build for me (on neither
# Debian amd64 nor i386), whereas binutils-2.16.91-20050827-1-src.tar.gz
# built fine on both. "
#
# - JoelDice
#
# BINUTILS_ARCHIVE="binutils-2.15.91-20040904-1-src.tar.gz"

BINUTILS_ARCHIVE="binutils-2.16.91-20050827-1-src.tar.gz"

MINGW_ARCHIVE="mingw-runtime-3.7.tar.gz"

W32API_ARCHIVE="w32api-3.2.tar.gz"


#-----------------------------------------------------
#
# END USER SETTINGS
#
# The remainder of the script should not neet any edits
#
#-----------------------------------------------------



# Make sure these are initialized as we want them

GCC_CORE=""
BINUTILS=""
GCC_LANGS="c"


# Set our build directory and where our sources will go

if [ "x$BUILDDIR" = "x" ]; then
         # Default to the current directory
         BUILDDIR=$(pwd)
fi
SRCDIR="$BUILDDIR/source"


# Need install directory first on the path so gcc can find binutils

PATH="$PREFIX/bin:$PATH"



#-----------------------------------------------------
#
# Functions that do most of the work
#
#-----------------------------------------------------


function download_files
{
         # Download a file from a given url, only if it is not present
         mkdir -p "$SRCDIR"

         # Make sure wget is installed
         if test "x`which wget`" = "x" ; then
                 echo "You need to install wget."
                 exit 1
         fi

         download_file "$GCC_CORE_ARCHIVE" "$GCC_URL"

         if [ "x$GCC_GPP_ARCHIVE" != "x" ]; then
                 download_file "$GCC_GPP_ARCHIVE" "$GCC_URL"
         fi
         if [ "x$GCC_G77_ARCHIVE" != "x" ]; then
                 download_file "$GCC_G77_ARCHIVE" "$GCC_URL"
         fi
         if [ "x$GCC_OBJC_ARCHIVE" != "x" ]; then
                 download_file "$GCC_OBJC_ARCHIVE" "$GCC_URL"
         fi
         if [ "x$GCC_JAVA_ARCHIVE" != "x" ]; then
                 download_file "$GCC_JAVA_ARCHIVE" "$GCC_URL"
         fi
         if [ "x$GCC_ADA_ARCHIVE" != "x" ]; then
                 download_file "$GCC_ADA_ARCHIVE" "$GCC_URL"
         fi

         download_file "$BINUTILS_ARCHIVE" "$MINGW_URL"
         download_file "$MINGW_ARCHIVE" "$MINGW_URL"
         download_file "$W32API_ARCHIVE" "$MINGW_URL"

}


function download_file
{
         cd "$SRCDIR"
         if test ! -f $1 ; then
                 echo "Downloading $1"
                 wget "$2/$1"
                 if test ! -f $1 ; then
                         echo "Could not download $1"
                         exit 1
                 fi
         else
                 echo "Found $1 in the srcdir $SRCDIR"
         fi
         cd "$BUILDDIR"
}


function purge_existing_install
{
         echo "Purging the existing files in $PREFIX"
         if cd "$PREFIX"; then
                 rm -rf *
         fi
         cd "$BUILDDIR"
}


function install_libs
{
         echo "Installing cross libs and includes"

         mkdir -p "$PREFIX/$TARGET"
         cd "$PREFIX"
				ln -s "$TARGET" usr

         cd "$PREFIX/$TARGET"
         tar -xzf "$SRCDIR/$MINGW_ARCHIVE"
         tar -xzf "$SRCDIR/$W32API_ARCHIVE"

         cd "$BUILDDIR"
}


function extract_binutils
{
         cd "$SRCDIR"
         BINUTILS=`tar -tzf "$SRCDIR/$BINUTILS_ARCHIVE" | head -n 1`
         rm -rf "$BINUTILS"
         echo "Extracting binutils"
         tar -xzf "$SRCDIR/$BINUTILS_ARCHIVE"
         cd "$BUILDDIR"
}


function configure_binutils
{
         cd "$BUILDDIR"
         rm -rf "binutils-$TARGET"
         mkdir "binutils-$TARGET"
         cd "binutils-$TARGET"
         echo "Configuring binutils"
         "$SRCDIR/$BINUTILS/configure" --prefix="$PREFIX" -- 
target="$TARGET" --disable-nls \
                 --with-gcc --with-gnu-as --with-gnu-ld --disable- 
shared &> configure.log
         cd "$BUILDDIR"
}


function build_binutils
{
         cd "$BUILDDIR/binutils-$TARGET"
         echo "Building binutils"
         make $MAKEFLAGS CFLAGS="-O2 -fno-exceptions" LDFLAGS="-s" &>  
make.log
         if test $? -ne 0; then
                 echo "make of binutils failed - log available:  
binutils-$TARGET/make.log"
                 exit 1
         fi
         cd "$BUILDDIR"
}


function install_binutils
{
         cd "$BUILDDIR/binutils-$TARGET"
         echo "Installing binutils"
         make $MAKEFLAGS install &> make-install.log
         if test $? -ne 0; then
                 echo "install of binutils failed - log available:  
binutils-$TARGET/make-install.log"
                 exit 1
         fi
         cd "$BUILDDIR"
}


function extract_gcc
{
         cd "$SRCDIR"
         GCC=`tar -tzf "$SRCDIR/$GCC_CORE_ARCHIVE" | head -n 1`
         rm -rf "$GCC"
         echo "Extracting gcc"
         tar -xzf "$SRCDIR/$GCC_CORE_ARCHIVE"
         if [ "x$GCC_GPP_ARCHIVE" != "x" ]; then
                 GCC_LANGS=${GCC_LANGS}",c++"
                 tar -xzf "$SRCDIR/$GCC_GPP_ARCHIVE"
         fi
         if [ "x$GCC_G77_ARCHIVE" != "x" ]; then
                 GCC_LANGS=${GCC_LANGS}",f77"
                 tar -xzf "$SRCDIR/$GCC_G77_ARCHIVE"
         fi
         if [ "x$GCC_OBJC_ARCHIVE" != "x" ]; then
                 GCC_LANGS=${GCC_LANGS}",objc"
                 tar -xzf "$SRCDIR/$GCC_OBJC_ARCHIVE"
         fi
         if [ "x$GCC_JAVA_ARCHIVE" != "x" ]; then
                 GCC_LANGS=${GCC_LANGS}",java"
                 tar -xzf "$SRCDIR/$GCC_JAVA_ARCHIVE"
         fi
         if [ "x$GCC_ADA_ARCHIVE" != "x" ]; then
                 GCC_LANGS=${GCC_LANGS}",ada"
                 tar -xzf "$SRCDIR/$GCC_ADA_ARCHIVE"
         fi
         cd "$BUILDDIR"
}


function patch_gcc
{
         if [ "$GCC_PATCH" != "" ]; then
                 echo "Patching gcc"
                 cd "$SRCDIR/$GCC"
                 patch -p1 < "$SRCDIR/$GCC_PATCH"
                 cd "$BUILDDIR"
         fi
}


function configure_gcc
{
         cd "$BUILDDIR"
         rm -rf "gcc-$TARGET"
         mkdir "gcc-$TARGET"
         cd "gcc-$TARGET"
         echo "Configuring gcc"
         "$SRCDIR/$GCC/configure" -v \
                 --prefix="$PREFIX" --target="$TARGET" \
                 --with-headers="$PREFIX/$TARGET/include" \
                 --with-gcc --with-gnu-ld --with-gnu-as \
                 --enable-threads --disable-nls --enable-languages= 
$GCC_LANGS \
                 --disable-win32-registry --disable-shared --enable- 
sjlj-exceptions --enable-libgcj \
                 --disable-java-awt --without-x --enable-java- 
gc=boehm --disable-libgcj-debug \
                 --enable-interpreter --enable-hash-synchronization -- 
enable-libstdcxx-debug \
                 &> configure.log
         cd "$BUILDDIR"
}


function build_gcc
{
         cd "$BUILDDIR/gcc-$TARGET"
         echo "Building gcc"
         make $MAKEFLAGS CFLAGS="-O2" CXXFLAGS="-O2" GCJFLAGS="-O2"  
LDFLAGS="-s" DEBUG_FLAGS="-g0"  &> make.log
         if test $? -ne 0; then
                 echo "make of gcc failed - log available: gcc- 
$TARGET/make.log"
                 exit 1
         fi
         if [ "x$GCC_ADA" != "x" ]; then
                 cd gcc
                 make $MAKEFLAGS "CFLAGS=-O2" "LDFLAGS=-s"  
gnatlib_and_tools &> make-gnatlib.log
                 if test $? -ne 0; then
                         echo "make of gnatlib and tools failed - log  
available: gcc-$TARGET/make-gnatlib.log"
                         exit 1
                 fi
         fi
         cd "$BUILDDIR"
}


function install_gcc
{
         cd "$BUILDDIR/gcc-$TARGET"
         echo "Installing gcc"
         make $MAKEFLAGS install &> make-install.log
         if test $? -ne 0; then
                 echo "install of gcc failed - log available: gcc- 
$TARGET/make-install.log"
                 exit 1
         fi
         cd "$BUILDDIR"
}


function final_tweaks
{
         echo "Finalizing installation"

         # remove gcc build headers
         rm -rf "$PREFIX/$TARGET/sys-include"

         # Add extra binary links
         if [ ! -f "$PREFIX/$TARGET/bin/objdump" ]; then
                 ln "$PREFIX/bin/$TARGET-objdump" "$PREFIX/$TARGET/ 
bin/objdump"
         fi

         # make cc and c++ symlinks to gcc and g++
#        if [ ! -f "$PREFIX/$TARGET/bin/g++" ]; then
#                ln "$PREFIX/bin/$TARGET-g++" "$PREFIX/$TARGET/bin/g++"
#        fi
#        if [ ! -f "$PREFIX/$TARGET/bin/cc" ]; then
#                ln -s "gcc" "$PREFIX/$TARGET/bin/cc"
#        fi
#        if [ ! -f "$PREFIX/$TARGET/bin/c++" ]; then
#                ln -s "g++" "$PREFIX/$TARGET/bin/c++"
#        fi

				# copy gsl headers to sdk
				mkdir -p "$PREFIX/$TARGET/include"
				cp -r /usr/local/include/gsl "$PREFIX/$TARGET/include"

				# copy static libraries to sdk
				cp /usr/local/mingw/lib/* "$PREFIX/$TARGET/lib"

         # strip all the binaries
         ls "$PREFIX"/bin/* "$PREFIX/$TARGET"/bin/* | egrep -v '.dll 
$' | egrep -v 'gccbug$' |
         while read file; do
                 strip "$file"
         done

         echo "Installation complete!"
}



#
# Main part of the script
#

download_files

if [ "x$PURGE_DIR" = "xY" ]; then
         purge_existing_install
fi

install_libs

extract_binutils
configure_binutils
build_binutils
install_binutils

extract_gcc
patch_gcc
configure_gcc
build_gcc
install_gcc

final_tweaks


#
# End
#


------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com



More information about the crossgcc mailing list