[MLton-user] MinGW Cross-compiled! :)

Anoq of the Sun anoq@HardcoreProcessing.com
Thu, 06 Nov 2003 23:03:18 +0200


This is a multi-part message in MIME format.
--------------E3037B65F8F03688AB4CCDFF
Content-Type: text/plain; charset=iso-8859-7
Content-Transfer-Encoding: 7bit

Hello again!


Now it works. It even works now without the change
I sent earlier in the file libgcc2.c! :)

I can now cross-compile a Hello World program
to Windows with the newly compiled gcc.

I have attached the new build-cross-gcc script so
that you can do:

./build-cross-gcc mingw

All my changes and which files to download should be
fairly well commented in the file and I hope I only
changed the file names and added the mingw target.
There are also a few new variables but I hope it
doesn't change the semantics of the other targets
in the script.


I just had to remove the cd /usr command
from the script and it worked!
The world is so simple when you understand it! :)

I now use the flags recommended in the files I found on
www.libsdl.org (so I'm hoping that eventually SDL will
also work with this compiler...). However I still have to
add the option --disable-nls to avoid some problems
with undefined references to dcgettext__.

I also tried Pete's command - this command to be exact:

../gcc-3.2.3-20030504-1/configure
--prefix=/usr/i386-mingw32msvc
--with-local-prefix=/usr/i386-mingw32msvc
--enable-languages=c
--with-headers=../mingw/include
--with-libs=../mingw/lib
--target=i386-pc-mingw32msvc

...and I got some errors in the style of:

/bin/sh ../../gcc-3.2.3-20030504-1/gcc/mkconfig.sh tconfig.h
/usr/local/develop/C_CPP/GCCMingGWCross/gcc-build/gcc/xgcc -B/usr/local/develop/C_CPP/GCCMingGWCross/gcc-build/gcc/ -B/usr/i386-mingw32msvc/i386-pc-mingw32msvc/bin/
-B/usr/i386-mingw32msvc/i386-pc-mingw32msvc/lib/ -isystem /usr/i386-mingw32msvc/i386-pc-mingw32msvc/include -O2 -DIN_GCC -DCROSS_COMPILE   -W -Wall -Wwrite-strings -Wstrict-prototypes
-Wmissing-prototypes -isystem ./include  -I. -I. -I../../gcc-3.2.3-20030504-1/gcc -I../../gcc-3.2.3-20030504-1/gcc/. -I../../gcc-3.2.3-20030504-1/gcc/config
-I../../gcc-3.2.3-20030504-1/gcc/../include  -g0 -finhibit-size-directive -fno-inline-functions -fno-exceptions  \
   -c ../../gcc-3.2.3-20030504-1/gcc/crtstuff.c -DCRT_BEGIN \
  -o crtbegin.o
/tmp/ccO9Q6j0.s: Assembler messages:
/tmp/ccO9Q6j0.s:9: Error: unknown pseudo-op: `.def'
/tmp/ccO9Q6j0.s:9: Error: unknown pseudo-op: `.scl'
/tmp/ccO9Q6j0.s:9: Error: unrecognized symbol type ""
/tmp/ccO9Q6j0.s:9: Warning: rest of line ignored; first ignored character is `3'
/tmp/ccO9Q6j0.s:9: Error: unknown pseudo-op: `.endef'
/tmp/ccO9Q6j0.s:26: Error: unknown pseudo-op: `.def'
/tmp/ccO9Q6j0.s:26: Error: unknown pseudo-op: `.scl'
/tmp/ccO9Q6j0.s:26: Error: unrecognized symbol type ""
/tmp/ccO9Q6j0.s:37: Warning: rest of line ignored; first ignored character is `3'
/tmp/ccO9Q6j0.s:37: Error: unknown pseudo-op: `.endef'
/tmp/ccO9Q6j0.s:38: Error: unknown pseudo-op: `.def'
/tmp/ccO9Q6j0.s:38: Error: unknown pseudo-op: `.scl'
/tmp/ccO9Q6j0.s:38: Error: unrecognized symbol type ""
/tmp/ccO9Q6j0.s:38: Warning: rest of line ignored; first ignored character is `3'
/tmp/ccO9Q6j0.s:38: Error: unknown pseudo-op: `.endef'
/tmp/ccO9Q6j0.s:39: Error: unknown pseudo-op: `.def'
/tmp/ccO9Q6j0.s:39: Error: unknown pseudo-op: `.scl'
/tmp/ccO9Q6j0.s:39: Error: unrecognized symbol type ""
/tmp/ccO9Q6j0.s:39: Warning: rest of line ignored; first ignored character is `3'
/tmp/ccO9Q6j0.s:39: Error: unknown pseudo-op: `.endef'

etc.

But now that it works I'm definately not going to delve into
gcc error research ;)


Cheers
-- 
http://www.HardcoreProcessing.com
--------------E3037B65F8F03688AB4CCDFF
Content-Type: text/plain; charset=iso-8859-7;
 name="build-cross-gcc"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="build-cross-gcc"

#!/usr/bin/env bash

# This script builds and installs a gcc cross compiler.

# It has been used to build cross compilers from Linux to Cygwin and
# from Linux to SunOS.  It is unlikely that this script will work
# out-of-the-box.  It is only intended as a template.  You should read
# through it and understand what it does, and make changes as
# necessary.  Feel free to add another targetType if you modify this
# script for another target.

# Notes from Anoq about the mingw target:
# I downloaded the following files from www.mingw.org:
# *) binutils-2.13.90-20030111-1-src.tar.gz which I unpacked to
#    binutils-2.13.90-20030111-1-src.tar
#    This script unpacks the .tar to binutils-2.13.90-20030111-1-src
# *) gcc-3.2.3-20030504-1-src.tar.gz which I unpacked to
#    gcc-3.2.3-20030504-1-src.tar
#    This script unpacks the .tar to gcc-3.2.3-20030504-1
# However when running make on gcc it complains about missing files
# stdlib.h and unistd.h

set -e

die () {
	echo >&2 "$1"
	exit 1
}

root=`pwd`
name=`basename $0`

usage () {
	die "usage: $name {cygwin|mingw|sun}"
}

case "$#" in
1)
	case "$1" in
	cygwin|mingw|sun)
		targetType="$1"
	;;
	*)
		usage
	;;
	esac
;;
*)
	usage
esac

# You may want to change the installation prefix, which is where the
# script will install the cross-compiler tools.
prefix='/usr'

# You must have have the sources to binutils and gcc, and place the
# tarfiles in the current directory.  You can find ftp sites to
# download binutils and gcc-core at gnu.org.  You may need to change
# the version numbers below to match what you download.
binutils='binutils-2.13.90-20030111-1-src'
binutilsTar="$binutils.tar"
gccVers='3.2.3-20030504-1'
# gccTar="gcc-core-$gccVers.tar"
# Annoying that the .tar file ends in -src and the unpacked directory does not
gccTar="gcc-$gccVers-src.tar"

# You may want to set the target.
case "$targetType" in
cygwin)
	target='i386-pc-cygwin'
	configureGCCFlags=''
	makeGCCFlags=''
	# For Cygwin, we also need the cygwin and w32api packages,
	# which contain necessary header files and libraries.  I got
	# them by installing cygwin in a Windows machine (using #
	# Cygwin's setup.exe program) and then getting the bzip'ed tar
	# files out of their Cygwin packages dir.  I had problems with
	# cygwin-1.3.18-1, since its libcygwin.a contained a file,
	# pseudo-reloc.o, with some strangeness that binutils didn't
	# correctly handle.
	cygwin='cygwin-1.3.17-1'
	w32api='w32api-2.1-1'
;;
mingw)
	target='i386-mingw32msvc'
	# target='mingw32'
	# These flags are from build-cross.sh from www.libsdl.org except:
	# I added --disable-nls because of undefined references to dcgettext__
	configureGCCFlags='--with-headers=$prefix/$target/include --with-gnu-as --with-gnu-ld --without-newlib --disable-multilib --disable-nls'
	makeGCCFlags='LANGUAGES=c'
	# For MinGW, we also need the mingw-runtime and w32api packages,
	# which contain necessary header files and libraries.  I got
	# them from www.mingw.org.
	mingw='mingw-runtime-3.2'
	w32api='w32api-2.4'
;;
sun)
	target='sparc-sun-solaris'
	configureGCCFlags=''
	makeGCCFlags=''
	# For sun, we assume that you have already copied the includes
	# and libraries from a SunOS machine to the host machine.
	if ! [ -d "$prefix/$target/include" -a -d "$prefix/$target/lib" ]; then
		die "Must create $prefix/$target/{include,lib}."
	fi
	# The GCC tools expect limits.h to be in sys-include, not include.
	( cd $prefix/$target && 
		mkdir -p sys-include &&
		mv include/limits.h sys-include )
;;
esac

exists () {
	if [ ! -r "$1" ]; then
		die "$1 does not exist"
	fi
}

echo 'Checking that needed files exist.'
exists $binutilsTar
exists $gccTar
case "$targetType" in
cygwin)
	exists $cygwin.tar
	exists $w32api.tar
	echo 'Copying include files and libraries needed by cross compiler.'
	cd $root
	mkdir -p cygwin
	cd cygwin
	tar x <../$cygwin.tar
	tar x <../$w32api.tar
	mkdir -p $prefix/$target || 
		die "Cannot create $prefix/$target."
	(cd usr && tar c include lib) | (cd $prefix/$target/ && tar x)
;;
mingw)
	exists $mingw.tar
	exists $w32api.tar
	echo 'Copying include files and libraries needed by cross compiler.'
	cd $root
	mkdir -p mingw
	cd mingw
	tar x <../$mingw.tar
	tar x <../$w32api.tar
	mkdir -p $prefix/$target || 
		die "Cannot create $prefix/$target."
	(tar c include lib) | (cd $prefix/$target/ && tar x)
;;
*)
;;
esac

echo 'Building binutils.'
cd $root
if [ ! -d $binutils ]; then
	tar x <$binutilsTar
fi
mkdir -p build-binutils
cd build-binutils
../$binutils/configure --prefix=$prefix --target=$target \
	>$root/configure-binutils-log 2>&1 ||
	die "Configure of binutils failed."
make all install >$root/build-binutils-log 2>&1 ||
	die "Build of binutils failed."

echo 'Building gcc.'
cd $root
tar x <$gccTar
mkdir -p build-gcc
cd build-gcc
eval ../gcc-$gccVers/configure -v $configureGCCFlags \
	--enable-languages=c \
	--prefix=$prefix \
	--target=$target \
	>$root/configure-gcc-log 2>&1 || 
	die "Configure of gcc failed."
eval make $makeGCCFlags all install >$root/build-gcc-log 2>&1 || 
	die "Build of gcc failed."

echo 'Success.'

--------------E3037B65F8F03688AB4CCDFF--