a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
228 lines
5.3 KiB
Bash
Executable File
228 lines
5.3 KiB
Bash
Executable File
#!/bin/bash -e
|
|
CURDIR="`pwd`"
|
|
MINGW=i386-mingw32msvc
|
|
CROSS_DIR=/opt/cross/$MINGW
|
|
EXTRA_CROSS_DIR=
|
|
INSTALL_DESTDIR="$CURDIR/mono-win32"
|
|
PROFILES="default net_2_0 net_3_5 net_4_0 net_4_5 moonlight"
|
|
TEMPORARY_PKG_CONFIG_DIR=/tmp/$RANDOM-pkg-config-$RANDOM
|
|
ORIGINAL_PATH="$PATH"
|
|
|
|
export CPPFLAGS_FOR_EGLIB CFLAGS_FOR_EGLIB CPPFLAGS_FOR_LIBGC CFLAGS_FOR_LIBGC
|
|
|
|
function cleanup ()
|
|
{
|
|
if [ -d "$TEMPORARY_PKG_CONFIG_DIR" ]; then
|
|
rm -rf "$TEMPORARY_PKG_CONFIG_DIR"
|
|
fi
|
|
}
|
|
|
|
function check_pkg_config_dir ()
|
|
{
|
|
local DIR="$1"
|
|
local DIR_PREFIX="$2"
|
|
|
|
if [ ! -d "$DIR" ]; then
|
|
return
|
|
fi
|
|
|
|
install -d -m 755 "$TEMPORARY_PKG_CONFIG_DIR"
|
|
for pc in "$DIR"/*.pc; do
|
|
if [ -f $pc ]; then
|
|
pcname="`basename $pc`"
|
|
sed -e "s;^prefix=.*;prefix=$DIR_PREFIX;g" < $pc > "$TEMPORARY_PKG_CONFIG_DIR"/$pcname
|
|
fi;
|
|
done
|
|
|
|
if [ -z "$CROSS_PKG_CONFIG_DIR" ]; then
|
|
CROSS_PKG_CONFIG_DIR="$TEMPORARY_PKG_CONFIG_DIR"
|
|
fi
|
|
}
|
|
|
|
function show_build_info ()
|
|
{
|
|
cat <<EOF
|
|
Installation prefix: $MONO_PREFIX
|
|
CPPFLAGS: ${CPPFLAGS:=not set}
|
|
LDFLAGS: ${LDFLAGS:=not set}
|
|
MONO_PATH: ${MONO_PATH:=not set}
|
|
EOF
|
|
}
|
|
|
|
function setup ()
|
|
{
|
|
local pcname
|
|
|
|
CROSS_BIN_DIR="$CROSS_DIR/bin"
|
|
CROSS_DLL_DIR="$CROSS_DIR/bin"
|
|
PATH=$CROSS_BIN_DIR:$PATH
|
|
|
|
MONO_VERSION=`grep AC_INIT configure.ac | cut -d ',' -f 2|tr -d '\[ \]'`
|
|
|
|
if [ -d ./.git ]; then
|
|
MONO_GIT_COMMIT="`git log -1 --format=format:%t`"
|
|
MONO_GIT_BRANCH="`git branch|grep '\*'|cut -d ' ' -f 2|tr -d '\)'|tr -d '\('`"
|
|
MONO_RELEASE="$MONO_VERSION-$MONO_GIT_BRANCH-$MONO_GIT_COMMIT"
|
|
else
|
|
MONO_RELEASE="$MONO_VERSION"
|
|
fi
|
|
|
|
MONO_PREFIX="$MONO_PREFIX/mono-$MONO_RELEASE"
|
|
|
|
NOCONFIGURE=yes
|
|
export NOCONFIGURE
|
|
|
|
check_pkg_config_dir "$CROSS_DIR/lib/pkgconfig" "$CROSS_DIR"
|
|
|
|
if [ -n "$EXTRA_CROSS_DIR" -a -d "$EXTRA_CROSS_DIR" ]; then
|
|
if [ -d "$EXTRA_CROSS_DIR/bin" ]; then
|
|
PATH="$EXTRA_CROSS_DIR/bin":$PATH
|
|
fi
|
|
|
|
check_pkg_config_dir "$EXTRA_CROSS_DIR/lib/pkgconfig" "$EXTRA_CROSS_DIR"
|
|
|
|
if [ -d "$EXTRA_CROSS_DIR/include" ]; then
|
|
if [ -z "$CPPFLAGS" ]; then
|
|
CPPFLAGS="-I \"$EXTRA_CROSS_DIR/include\""
|
|
else
|
|
CPPFLAGS="-I \"$EXTRA_CROSS_DIR/include\" $CFLAGS"
|
|
fi
|
|
fi
|
|
|
|
if [ -d "$EXTRA_CROSS_DIR/lib" ]; then
|
|
if [ -z "$LDFLAGS" ]; then
|
|
LDFLAGS="-I \"$EXTRA_CROSS_DIR/lib\""
|
|
else
|
|
LDFLAGS="-I \"$EXTRA_CROSS_DIR/lib\" $LDFLAGS"
|
|
fi
|
|
fi
|
|
|
|
if [ -d "$EXTRA_CROSS_DIR/share/aclocal" ]; then
|
|
if [ -z "$MONO_PATH" ]; then
|
|
MONO_PATH="\"$EXTRA_CROSS_DIR\""
|
|
else
|
|
MONO_PATH="\"$EXTRA_CROSS_DIR\":$MONO_PATH"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
export PATH MONO_PATH CPPFLAGS
|
|
show_build_info
|
|
}
|
|
|
|
function build ()
|
|
{
|
|
if [ -f ./Makefile ]; then
|
|
make distclean
|
|
fi
|
|
|
|
if [ -d ./autom4te.cache ]; then
|
|
rm -rf ./autom4te.cache
|
|
fi
|
|
|
|
if [ -f ./config.status ]; then
|
|
for f in `find -name config.status -type f`; do
|
|
rm $f
|
|
done
|
|
fi
|
|
|
|
./autogen.sh
|
|
|
|
BUILD="`./config.guess`"
|
|
|
|
if [ ! -d "$CURDIR/build-cross-windows" ]; then
|
|
mkdir "$CURDIR/build-cross-windows"
|
|
fi
|
|
|
|
cd "$CURDIR/build-cross-windows"
|
|
rm -rf *
|
|
../configure --prefix=$MONO_PREFIX --with-crosspkgdir=$CROSS_PKG_CONFIG_DIR --build=$BUILD --target=$MINGW --host=$MINGW --enable-parallel-mark --program-transform-name="" --with-tls=none --disable-mcs-build --disable-embed-check --enable-win32-dllmain=yes --with-libgc-threads=win32 --with-profile4=yes
|
|
make
|
|
cd "$CURDIR"
|
|
|
|
if [ ! -d "$CURDIR/build-cross-windows-mcs" ]; then
|
|
mkdir "$CURDIR/build-cross-windows-mcs"
|
|
fi
|
|
|
|
rm -rf autom4te.cache
|
|
unset PATH
|
|
PATH="$ORIGINAL_PATH"
|
|
export PATH
|
|
cd "$CURDIR/build-cross-windows-mcs"
|
|
rm -rf *
|
|
../configure --prefix=$MONO_PREFIX --enable-parallel-mark
|
|
make
|
|
}
|
|
|
|
function doinstall ()
|
|
{
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
rm -rf "$INSTALL_DIR"
|
|
fi
|
|
cd "$CURDIR/build-cross-windows"
|
|
make DESTDIR="$INSTALL_DESTDIR" USE_BATCH_FILES=yes install
|
|
|
|
if test -d $CURDIR/mcs; then
|
|
mcsdir=$CURDIR/mcs
|
|
else
|
|
mcsdir=$CURDIR/../mcs
|
|
fi
|
|
|
|
cd "$mcsdir/mcs"
|
|
for p in $PROFILES; do
|
|
make DESTDIR="$INSTALL_DESTDIR" PROFILE=$p install || echo "mcs profile $p installation failed"
|
|
done
|
|
|
|
cd "$mcsdir/class"
|
|
for p in $PROFILES; do
|
|
make DESTDIR="$INSTALL_DESTDIR" PROFILE=$p install || echo "class library profile $p installation failed"
|
|
done
|
|
|
|
cd "$mcsdir/tools"
|
|
for p in $PROFILES; do
|
|
make DESTDIR="$INSTALL_DESTDIR" PROFILE=$p install || echo "tools profile $p installation failed"
|
|
done
|
|
|
|
cd "$CURDIR/mono-win32"
|
|
rm -f "$CURDIR/mono-win32-$MONO_RELEASE".zip
|
|
zip -9r "$CURDIR/mono-win32-$MONO_RELEASE".zip .
|
|
|
|
}
|
|
|
|
function usage ()
|
|
{
|
|
cat <<EOF
|
|
Usage: build-mingw32.sh [OPTIONS]
|
|
|
|
where OPTIONS are:
|
|
|
|
-d DIR Sets the location of directory where MINGW is installed [$CROSS_DIR]
|
|
-e DIR Sets the location of directory where additional cross develoment packages are installed [${EXTRA_CROSS_DIR:=none}]
|
|
-m MINGW Sets the MINGW target name to be passed to configure [$MINGW]
|
|
-p PREFIX Prefix at which Mono is to be installed. Build will append the 'mono-X.Y' string to that path
|
|
EOF
|
|
|
|
exit 1
|
|
}
|
|
|
|
trap cleanup 0
|
|
|
|
pushd . > /dev/null
|
|
|
|
while getopts "d:m:e:p:" opt; do
|
|
case "$opt" in
|
|
d) CROSS_DIR="$OPTARG" ;;
|
|
m) MINGW="$OPTARG" ;;
|
|
e) EXTRA_CROSS_DIR="$OPTARG" ;;
|
|
p) MONO_PREFIX="$OPTARG" ;;
|
|
*) usage ;;
|
|
esac
|
|
done
|
|
|
|
setup
|
|
build
|
|
doinstall
|
|
show_build_info
|
|
|
|
popd > /dev/null
|