Add a script to build a mingw64 compiler.
[mirror_edk2.git] / Tools / gcc / mingw64-gcc-build
1 #!/bin/bash
2
3 #
4 # Build a mingw64 compiler for doing x64 compiles.
5 #
6
7 ###
8 ### CYGWIN :: Make sure that cygwin is mouting its file systems in binmode.
9 ###
10
11 #
12 # Specify the architectures for which the tools are to be built
13 #
14 TARGS="${TARGS:-x86_64-pc-mingw64 }"
15
16 # Let's be nice
17 renice 10 -p $$
18
19 # If any thing goes wrong, we'll bail out.
20 set -e
21
22 #
23 # Specify the versions
24 #
25 GCC=gcc-4.1.1
26 BINUTILS=binutils-2.17
27 W32API=w32api-3.6
28 # BINUTILS=binutils-2.16.91-20060119-1
29 CYGWIN_SNAP=20060403 # You may need to find a more recent one.
30 export PATH=/bin:/usr/bin:/usr/local/bin
31
32 #
33 # Where to install
34 #
35 # PREFIX="${PREFIX:-~/tiano/}"
36 PREFIX="${PREFIX:-/opt/tiano/}"
37
38 #
39 # Where to get the GNU tools
40 #
41 BINUTILS_URL=ftp://ftp.ibiblio.org/pub/mirrors/gnu/ftp/gnu/binutils/${BINUTILS}.tar.bz2
42 GCC_URL=ftp://mirrors.kernel.org/gnu/gcc/$GCC/$GCC.tar.bz2
43 CYG_LOC=http://cygwin.com/snapshots/cygwin-src-${CYGWIN_SNAP}.tar.bz2
44 W32API_LOC=http://superb-west.dl.sourceforge.net/sourceforge/mingw/${W32API}-src.tar.gz
45 # export http_proxy=http://proxy.dp.intel.com:911
46 # export ftp_proxy=http://proxy.dp.intel.com:911
47
48 #
49 # Uncomment one of the following depending upon which your system provides
50 #
51 #GET_COMMAND="curl --remote-name"
52 GET_COMMAND="wget -nc --no-directories --retr-symlinks "
53
54 #
55 # Allow environment to override some programs
56 #
57 MAKE="${MAKE:-make}"
58 export MAKE
59 SHELL="${SHELL:-/bin/sh}"
60 export SHELL
61
62 #
63 # Get the source
64 # If you don't have curl on your machine, try using
65 # wget --passive-ftp --no-directories --retr-symlinks <<url>>
66 # If that doesn't work, try without the --passive-ftp option.
67 #
68 getSource() {
69 ${GET_COMMAND} "${BINUTILS_URL}" &
70 ${GET_COMMAND} "${GCC_URL}" &
71 ${GET_COMMAND} "${CYG_LOC}" &
72 ${GET_COMMAND} "${W32API_LOC}" &
73 wait
74 }
75
76 #
77 # Unpack the source
78 #
79 unpackSource() {
80 (rm -rf "${BINUTILS}"
81 tar jxf "${BINUTILS}.tar.bz2"
82 ) &
83
84 (rm -rf "${GCC}"
85 tar jxf "${GCC}.tar.bz2"
86 ) &
87
88 (rm -rf cygwin-snapshot-${CYGWIN_SNAP}-1/
89 tar jxf cygwin-src-${CYGWIN_SNAP}.tar.bz2
90 ) &
91
92 (rm -rf ${W32API}
93 tar zxf ${W32API}-src.tar.gz
94 ) &
95
96 wait
97
98 # Apply patches
99 (cd ${GCC}; patch -p1 < ../gcc_4.1.1.x86_64.061113.diff
100 )
101
102 (cd ${BINUTILS}; patch -p1 < ../binutils.diff
103 )
104
105 wait
106 }
107
108 CONF_SHELL="${CONF_SHELL:-/bin/bash}"
109 # CONF_SHELL="${CONF_SHELL:-echo}"
110
111 #
112 # Build
113 #
114 build() {
115 for targ in $TARGS
116 do (
117 export pref=${PREFIX}${targ}
118 export PATH="${pref}/bin:$PATH"
119
120 ( mkdir -p build-binutils-$targ
121 cd build-binutils-$targ
122 "${CONF_SHELL}" "../${BINUTILS}/configure" \
123 --disable-nls "--target=${targ}" "--prefix=${pref}"
124 ${MAKE} -j1 -w all
125 ${MAKE} -w install
126 ) >> ${targ}.log 2>&1
127
128 (
129 mkdir -p $pref/$targ/sys-include;
130 cp -fr cygwin-snapshot-${CYGWIN_SNAP}-1/newlib/libc/include/* $pref/$targ/sys-include
131 cp -fr cygwin-snapshot-${CYGWIN_SNAP}-1/winsup/cygwin/include/* $pref/$targ/sys-include
132 )
133
134 (
135 mkdir -p $pref/$targ/include;
136 cp -fr ${W32API}/include/* $pref/$targ/sys-include;
137 )
138
139 ( mkdir -p build-gcc-$targ
140 cd build-gcc-$targ
141 "${CONF_SHELL}" "../${GCC}/configure" "--target=${targ}" "--prefix=${pref}" \
142 --with-gnu-as --with-gnu-ld --without-headers --with-newlib --verbose \
143 --disable-libssp \
144 --disable-nls --enable-languages=c
145 ${MAKE} -j1 -w all
146 ${MAKE} -w install
147 ) >> ${targ}.log 2>&1
148 ) &
149 done
150
151 wait
152 }
153
154
155
156 #
157 # Do everything
158 #
159 # Comment out any activities you wish to omit
160 #
161 getSource
162 unpackSource
163 build