summaryrefslogtreecommitdiff
path: root/build-mingw32.sh
blob: 8bcb5ff973c1eb516b0550121872b754aef841ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#!/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.in | 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