[xbuild] RemoveDir - remove only if the dir exists.
[mono.git] / build-mingw32.sh
1 #!/bin/bash -e
2 CURDIR="`pwd`"
3 MINGW=i386-mingw32msvc
4 CROSS_DIR=/opt/cross/$MINGW
5 EXTRA_CROSS_DIR=
6 INSTALL_DESTDIR="$CURDIR/mono-win32"
7 PROFILES="default net_2_0 net_3_5 net_4_0 moonlight"
8 TEMPORARY_PKG_CONFIG_DIR=/tmp/$RANDOM-pkg-config-$RANDOM
9 ORIGINAL_PATH="$PATH"
10
11 export CPPFLAGS_FOR_EGLIB CFLAGS_FOR_EGLIB CPPFLAGS_FOR_LIBGC CFLAGS_FOR_LIBGC
12
13 function cleanup ()
14 {
15     if [ -d "$TEMPORARY_PKG_CONFIG_DIR" ]; then
16         rm -rf "$TEMPORARY_PKG_CONFIG_DIR"
17     fi
18 }
19
20 function check_pkg_config_dir ()
21 {
22     local DIR="$1"
23     local DIR_PREFIX="$2"
24
25     if [ ! -d "$DIR" ]; then
26         return
27     fi
28
29     install -d -m 755 "$TEMPORARY_PKG_CONFIG_DIR"
30     for pc in "$DIR"/*.pc; do
31         if [ -f $pc ]; then
32             pcname="`basename $pc`"
33             sed -e "s;^prefix=.*;prefix=$DIR_PREFIX;g" < $pc > "$TEMPORARY_PKG_CONFIG_DIR"/$pcname
34         fi;
35     done
36
37     if [ -z "$CROSS_PKG_CONFIG_DIR" ]; then
38         CROSS_PKG_CONFIG_DIR="$TEMPORARY_PKG_CONFIG_DIR"
39     fi
40 }
41
42 function show_build_info ()
43 {
44     cat <<EOF
45 Installation prefix: $MONO_PREFIX
46            CPPFLAGS: ${CPPFLAGS:=not set}
47             LDFLAGS: ${LDFLAGS:=not set}
48           MONO_PATH: ${MONO_PATH:=not set}
49 EOF
50 }
51
52 function setup ()
53 {
54     local pcname
55
56     CROSS_BIN_DIR="$CROSS_DIR/bin"
57     CROSS_DLL_DIR="$CROSS_DIR/bin"
58     PATH=$CROSS_BIN_DIR:$PATH
59
60     MONO_VERSION=`grep AM_INIT_AUTOMAKE configure.in | cut -d ',' -f 2|tr -d '\)'`
61     
62     if [ -d ./.git ]; then
63         MONO_GIT_COMMIT="`git log -1 --format=format:%t`"
64         MONO_GIT_BRANCH="`git branch|grep '\*'|cut -d ' ' -f 2`"
65         MONO_RELEASE="$MONO_VERSION-$MONO_GIT_BRANCH-$MONO_GIT_COMMIT"
66     else
67         MONO_RELEASE="$MONO_VERSION"
68     fi
69
70     MONO_PREFIX="$MONO_PREFIX/mono-$MONO_RELEASE"
71
72     NOCONFIGURE=yes
73     export NOCONFIGURE
74
75     check_pkg_config_dir "$CROSS_DIR/lib/pkgconfig" "$CROSS_DIR"
76
77     if [ -n "$EXTRA_CROSS_DIR" -a -d "$EXTRA_CROSS_DIR" ]; then
78         if [ -d "$EXTRA_CROSS_DIR/bin" ]; then
79                 PATH="$EXTRA_CROSS_DIR/bin":$PATH
80         fi
81         
82         check_pkg_config_dir "$EXTRA_CROSS_DIR/lib/pkgconfig" "$EXTRA_CROSS_DIR"
83
84         if [ -d "$EXTRA_CROSS_DIR/include" ]; then
85             if [ -z "$CPPFLAGS" ]; then
86                 CPPFLAGS="-I \"$EXTRA_CROSS_DIR/include\""
87             else
88                 CPPFLAGS="-I \"$EXTRA_CROSS_DIR/include\" $CFLAGS"
89             fi
90         fi
91
92         if [ -d "$EXTRA_CROSS_DIR/lib" ]; then
93             if [ -z "$LDFLAGS" ]; then
94                 LDFLAGS="-I \"$EXTRA_CROSS_DIR/lib\""
95             else
96                 LDFLAGS="-I \"$EXTRA_CROSS_DIR/lib\" $LDFLAGS"
97             fi
98         fi
99
100         if [ -d "$EXTRA_CROSS_DIR/share/aclocal" ]; then
101             if [ -z "$MONO_PATH" ]; then
102                 MONO_PATH="\"$EXTRA_CROSS_DIR\""
103             else
104                 MONO_PATH="\"$EXTRA_CROSS_DIR\":$MONO_PATH"
105             fi
106         fi
107     fi
108     
109     export PATH MONO_PATH CPPFLAGS
110     show_build_info
111 }
112
113 function build ()
114 {
115     if [ -f ./Makefile ]; then
116         make distclean
117     fi
118
119     if [ -d ./autom4te.cache ]; then
120         rm -rf ./autom4te.cache
121     fi
122
123     if [ -f ./config.status ]; then
124         for f in `find -name config.status -type f`; do
125             rm $f
126         done
127     fi
128
129     ./autogen.sh 
130
131     BUILD="`./config.guess`"
132
133     if [ ! -d "$CURDIR/build-cross-windows" ]; then
134         mkdir "$CURDIR/build-cross-windows"
135     fi
136
137     cd "$CURDIR/build-cross-windows"
138     rm -rf *
139     ../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
140     make
141     cd "$CURDIR"
142
143     if [ ! -d "$CURDIR/build-cross-windows-mcs" ]; then
144         mkdir "$CURDIR/build-cross-windows-mcs"
145     fi
146
147     rm -rf autom4te.cache
148     unset PATH
149     PATH="$ORIGINAL_PATH"
150     export PATH
151     cd "$CURDIR/build-cross-windows-mcs"
152     rm -rf *
153     ../configure --prefix=$MONO_PREFIX --enable-parallel-mark
154     make
155 }
156
157 function doinstall ()
158 {
159     if [ -d "$INSTALL_DIR" ]; then
160         rm -rf "$INSTALL_DIR"
161     fi
162     cd "$CURDIR/build-cross-windows"
163     make DESTDIR="$INSTALL_DESTDIR" USE_BATCH_FILES=yes install
164
165     if test -d $CURDIR/mcs; then
166       mcsdir=$CURDIR/mcs
167     else
168       mcsdir=$CURDIR/../mcs
169     fi
170
171     cd "$mcsdir/mcs"
172     for p in $PROFILES; do
173         make DESTDIR="$INSTALL_DESTDIR" PROFILE=$p install || echo "mcs profile $p installation failed"
174     done
175
176     cd "$mcsdir/class"
177     for p in $PROFILES; do
178         make DESTDIR="$INSTALL_DESTDIR" PROFILE=$p install || echo "class library profile $p installation failed"
179     done
180
181     cd "$mcsdir/tools"
182     for p in $PROFILES; do
183         make DESTDIR="$INSTALL_DESTDIR" PROFILE=$p install || echo "tools profile $p installation failed"
184     done
185
186     cd "$CURDIR/mono-win32"
187     rm -f "$CURDIR/mono-win32-$MONO_RELEASE".zip
188     zip -9r "$CURDIR/mono-win32-$MONO_RELEASE".zip .
189
190 }
191
192 function usage ()
193 {
194     cat <<EOF
195 Usage: build-mingw32.sh [OPTIONS]
196
197 where OPTIONS are:
198
199  -d DIR     Sets the location of directory where MINGW is installed [$CROSS_DIR]
200  -e DIR     Sets the location of directory where additional cross develoment packages are installed [${EXTRA_CROSS_DIR:=none}]
201  -m MINGW   Sets the MINGW target name to be passed to configure [$MINGW]
202  -p PREFIX  Prefix at which Mono is to be installed. Build will append the 'mono-X.Y' string to that path
203 EOF
204
205     exit 1
206 }
207
208 trap cleanup 0
209
210 pushd . > /dev/null
211
212 while getopts "d:m:e:p:" opt; do
213     case "$opt" in
214         d) CROSS_DIR="$OPTARG" ;;
215         m) MINGW="$OPTARG" ;;
216         e) EXTRA_CROSS_DIR="$OPTARG" ;;
217         p) MONO_PREFIX="$OPTARG" ;;
218         *) usage ;;
219     esac
220 done
221
222 setup
223 build
224 doinstall
225 show_build_info
226
227 popd > /dev/null