]> git.donarmstrong.com Git - lilypond.git/blob - buildscripts/make-cygwin-cross.sh
patch::: 1.3.39.jcn2
[lilypond.git] / buildscripts / make-cygwin-cross.sh
1 #!@BASH@
2 # make-cygwin-cross
3 #
4 # Build and install cross-development tools for cygwin package 
5 # (binutils, compiler, flex, bison).
6 # Using this cross-development enviroment, build and install
7 # native cygwin packages (guile, lilypond).
8 #
9 # Besides being a handy script for me, currently this mainly serves
10 # as documentation for cross-building lilypond.
11 #
12 # To use this script, you need
13 #
14 #  * all development tools to build a native LilyPond, see INSTALL.txt
15 #
16 #  * pre-release cygnus sources (and a binary) from:
17 #
18 #      ftp://sourceware.cygnus.com/pub/cygwin/private/cygwin-net-485/
19 #
20 #          binutils/binutils-19990818-1-src.tar.gz
21 #          bison/bison-src.tar.gz
22 #          cygwin/cygwin-20000301.tar.gz
23 #          flex/flex-src.tar.gz
24 #          gcc/gcc-2.95.2-1-src.tar.gz
25 #
26 #      ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/runtime/
27 #
28 #          bin-crtdll-2000-02-03.tar.gz  (mingw only)
29 #
30 #  * regex-0.12.tar.gz
31 #
32 #  * guile-1.3.4.tar.gz
33 #
34 #  * lilypond-1.3.38.jcn1.tar.gz
35 #
36 #  * lots of disk space, ca 353MB
37 #
38
39 ################
40 # config section
41 ################
42
43 target=cygwin
44 #target=mingw
45
46 if [ $target = cygwin ]; then
47         ROOT=/usr/src/cygwin-net-485
48         TARGET_ARCH=i686-pc-cygwin
49 else
50         ROOT=/usr/src/mingw-net-485
51         TARGET_ARCH=i386-pc-mingw32
52 fi
53 PREFIX=$ROOT/usr
54 NATIVE_PREFIX=/Cygnus/usr
55
56 # urg
57 DEVEL=/home/fred
58 WWW=$DEVEL/WWW/lilypond/gnu-windows
59 #WWW=/tmp
60
61 CYGWIN_SOURCE=$DEVEL/sourceware.cygnus.com/pub/cygwin/private/cygwin-net-485
62 MINGW_SOURCE=$DEVEL/ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/runtime
63 SOURCE_PATH=$DEVEL/usr/src/releases:$DEVEL/usr/src/patches:$DEVEL/usr/src/lilypond/Documentation/ntweb:$MINGW_SOURCE
64
65 HOST=`uname -m`-gnu-`uname -s | tr '[A-Z]' '[a-z]'`
66
67 cygwin_binary=cygwin-20000301.tar.gz
68 mingw_binary=bin-crtdll-2000-02-03.tar.gz
69
70 #CYGWIN_DLL=cygwin1-net-485.dll
71 CYGWIN_DLL=cygwin1.dll
72 MINWG_DLL=mingwc10-net-485.dll
73
74
75 ################
76 # cross packages
77 ################
78
79 cross_packages="
80 binutils-19990818
81 gcc-2.95.2
82 flex
83 bison
84 "
85 not_yet_needed="
86 cygwin-2000301
87 "
88
89 cross_configure='--prefix=$PREFIX --target=$TARGET_ARCH'
90 gcc_make='LANGUAGES="c++"'
91 cygwin_make='-k || true'
92
93
94 #################
95 # native packages
96 #################
97
98 # Typically, we install native packages under
99 #
100 #   /Cygnus/usr/package-x.y.z
101 #
102 # so that's how we configure them.
103 #
104 native_configure='--target=$TARGET_ARCH --build=$TARGET_ARCH --host=$HOST --oldincludedir=$PREFIX/include --prefix=$NATIVE_PREFIX/$package --program-suffix='
105 native_config_site='$PREFIX/share/native-config.site'
106
107 # urg: avoid making doc dir
108 regex_make='subdirs=test'
109 regex_before_install='ar -ru libregex.a regex.o \; mkdir -p $PREFIX/{include,lib} \; cp ../$package/regex.h $PREFIX/include \; cp libregex.a $PREFIX/lib'
110 regex_install='subdirs=test'
111 regex_before_zip='mkdir -p $install_prefix/{include,lib} \; cp ../$package/regex.h $install_prefix/include \; cp libregex.a $install_prefix/lib'
112
113 guile_patch='guile-1.3.4-gnu-windows.patch'
114 if [ $target = mingw ]; then
115         guile_patch1='guile-1.3.4-mingw.patch'
116         guile_cflags='-I $PREFIX/$TARGET_ARCH/include -I $PREFIX/i686-pc-cygwin/include'
117 fi
118 guile_ldflags='-L$PREFIX/lib $PREFIX/bin/$CYGWIN_DLL'
119 guile_make='oldincludedir=$PREFIX/include'
120
121 # We need to get guile properly installed for cross-development, ie
122 # at our prefix: $PREFIX.  When packaging, the prefix we configured
123 # for, will be used.
124 #
125 guile_install='prefix=$PREFIX'
126
127 lilypond_version=@TOPLEVEL_VERSION@
128 if [ $target = mingw ]; then
129         lilypond_cflags='-I $PREFIX/$TARGET_ARCH/include -I $PREFIX/i686-pc-cygwin/include'
130 fi
131 lilypond_ldflags='-L$PREFIX/lib -lguile $PREFIX/bin/$CYGWIN_DLL'
132 #lilypond_configure='--enable-tex-tfmdir=miktex/usr/share/texmf/fonts/tfm/public/cm/'
133 ## URG, help2man: doesn't know about cross-compilation.
134 #lilypond_make='-k || make -k || true'
135 lilypond_patch=lilypond-manpages.patch
136 # Don't install lilypond
137 lilypond_install='--just-print'
138 lilypond_before_zip='cp -pr $PREFIX/src/$package/input $install_prefix \; cp -p \`find $PREFIX/src/$package -type f -maxdepth 1\` $install_prefix'
139
140 native_packages="
141 regex-0.12
142 guile-1.3.4
143 lilypond-$lilypond_version
144 "
145
146 #######################
147 # end of config section
148 #######################
149
150 cygwin_dirs=`/bin/ls -d1 $CYGWIN_SOURCE/*`
151 cygwin_source_path=`echo $CYGWIN_SOURCE $cygwin_dirs`
152 source_path=`echo $SOURCE_PATH:$cygwin_source_path | sed 's/:/ /g'`
153
154 ###########
155 # functions
156 ###########
157
158 untar ()
159 {(
160         set -x
161         tarball=$1
162         dest_dir=$2
163
164         first_dir=`tar tzf $tarball | head -1`
165         src_dir=`dirname $first_dir`
166
167         if [ "$src_dir" = "src" -o "$src_dir" = "./src" \
168           -o "$src_dir" = "." ]; then
169                 src_dir=$first_dir
170         fi
171
172         tar xzf $tarball
173
174         if [ "$src_dir" != "$dest_dir" -a "$src_dir" != "$dest_dir/" ]; then
175                 mv $src_dir $dest_dir
176                 rm -rf ./$first_dir
177         fi
178 )
179 }
180
181 expand ()
182 {(
183
184         set -
185         string=`eval echo $\`eval echo "${1}${2}"\``
186         eval echo $string
187 )
188 }
189
190 find_path ()
191 {(
192         set -
193         expr=$1
194         found=
195         for i in $source_path; do
196                 found=`/bin/ls -d1 $i/$expr 2>/dev/null | head -1`
197                 if [ -e "$found" ]; then
198                         break
199                 fi
200         done
201         echo $found
202 )
203 }
204
205 fix_extension ()
206 {
207         file=$1
208         ext=$2
209         expr="$3"
210         base=`basename $file $ext`
211         if [ $base$ext != $i ]; then
212                 type="`file $file`"
213                 if expr "$type" : "$expr"; then
214                         mv -f $file $base$ext
215                 fi
216         fi
217 }
218
219 build ()
220 {(
221         package=$1
222         set -
223         if [ -d $package ]; then
224                 echo "$package: directory exists"
225                 echo "$package: skipping"
226                 exit 0
227         fi
228
229         name=`echo $package | sed 's/-.*//'`
230         name_cflags=`expand $name _cflags`
231         name_ldflags=`expand $name _ldflags`
232         name_configure=`expand $name _configure`
233         type_config_site=`expand $type _config_site`
234         type_configure=`expand $type _configure`
235         name_make=`expand $name _make`
236         name_before_install="`expand $name _before_install`"
237         name_install=`expand $name _install`
238
239         found=`find_path $package*src.tar.gz`
240         if [ "$found" = "" ]; then
241                 found=`find_path $package.tar.gz`
242         fi
243         if [ "$found" = "" ]; then
244                 found=`find_path $name*tar.gz`
245         fi
246         if [ "$found" = "" ]; then
247                 echo "$package: no such tarball"
248                 exit 1
249         fi
250         
251         untar $found $package
252         patch=`expand $name _patch`
253         count=0
254         while [ "x$patch" != "x" ]; do
255                 (
256                 cd $package
257                 set -x
258                 found=`find_path $patch`
259                 if [ "$found" = "" ]; then
260                         echo "$patch: no such file"
261                         exit 1
262                 fi
263                 patch -p1 -E < $found
264                 )
265                 count=`expr $count + 1`
266                 patch=`expand $name _patch$count`
267         done
268         mkdir $type-$package
269         cd $type-$package
270
271         rm -f config.cache
272         CONFIG_SITE="$type_config_site" CFLAGS="$name_cflags" LDFLAGS="$name_ldflags" ../$package/configure $type_configure $name_configure || exit 1
273         make $name_make || exit 1
274         `eval $name_before_install` || exit 1
275         make install $name_install || exit 1
276 )
277 }
278
279 ## urg, let's hope Cygnus uses rpm for packaging its next release
280 pack ()
281 {(
282         set -
283         package=$1
284
285         zip=$WWW/$package.zip
286         if [ -e $zip ]; then
287                 echo "$zip: package exists"
288                 echo "$zip: skipping"
289                 exit 0
290         fi
291
292         name=`echo $package | sed 's/-.*//'`
293         name_pack_install=`expand $name _pack_install`
294         install_root=/tmp/$package-install
295         install_prefix=$install_root/$NATIVE_PREFIX/$package
296         name_before_zip=`expand $name _before_zip`
297
298         set -x
299         rm -rf $install_root
300         mkdir -p $install_prefix
301
302         cd $PREFIX/src/$type-$package || exit 1
303         make install prefix=$install_prefix $name_pack_install
304
305         ## duh, rename executables,
306         ## for people that use a dumb shell instead of bash
307         cd $install_prefix/bin &&
308         for i in `/bin/ls -d1 *`; do
309                 fix_extension $i .exe '.*Windows.*\(executable\).*'
310                 fix_extension $i .py '.*\(python\).*'
311         done
312
313         rm -f $zip
314         `eval $name_before_zip` || exit 1
315         cd $install_root && zip -ry $zip .$NATIVE_PREFIX
316 )
317 }
318 ##################
319 # end of functions
320 ##################
321
322 #
323 # setup
324 #
325
326 set -x
327 mkdir -p $ROOT
328 if [ ! -d $PREFIX ]; then
329         cd $ROOT
330         found=`find_path $cygwin_binary`
331         if [ "$found" = "" ]; then
332                 echo "$cygwin_binary: no such tarball"
333                 exit 1
334         fi
335         tar xzf $found
336         # urg, bug in gcc's cross-make configuration
337         mkdir -p $PREFIX/lib/gcc-lib/$TARGET_ARCH/2.95.2
338
339         cd $PREFIX
340
341         # urg, bug in gcc's cross-make configuration
342         rm -f include
343         ln -s $PREFIX/$TARGET_ARCH/include .
344 else
345         echo "$PREFIX: already exists"
346         echo "$cygwin_binary: skipping"
347 fi
348
349 # mingw
350 if [ ! -d $PREFIX/$TARGET_ARCH ]; then
351         cd $PREFIX
352         found=`find_path $mingw_binary`
353         if [ "$found" = "" ]; then
354                 echo "$mingw_binary: no such tarball"
355                 exit 1
356         fi
357         tar xzf $found
358
359         mkdir -p $PREFIX/lib/gcc-lib/$TARGET_ARCH/2.95.2
360         rm -f include
361         mkdir -p $PREFIX/i386-mingw32/include
362         ln -s $PREFIX/i386-mingw32 $TARGET_ARCH
363         ln -s $PREFIX/$TARGET_ARCH/include .
364 fi
365
366 if [ ! -e $NATIVE_PREFIX ]; then
367         ln -s $ROOT /Cygnus || exit 1
368 fi
369
370 mkdir -p $PREFIX/src
371 cd $PREFIX/src
372 PATH=$PATH:$PREFIX/bin
373
374 type=cross
375 for i in $cross_packages; do
376         if build $i; then
377                 true
378         else
379                 echo "$i: build failed"
380                 exit 1
381         fi
382 done
383
384 # urg, bug in gcc's cross-make install
385 mv $PREFIX/bin/cygwin1.dll $PREFIX/bin/$CYGWIN_DLL
386 mv $PREFIX/bin/mingwc10.dll $PREFIX/bin/$MINGW_DLL
387 ln -f $PREFIX/bin/$TARGET_ARCH-gcc $PREFIX/$TARGET_ARCH/bin/cc 
388 ln -f $PREFIX/bin/$TARGET_ARCH-c++ $PREFIX/$TARGET_ARCH/bin/c++
389 ln -f $PREFIX/bin/$TARGET_ARCH-g++ $PREFIX/$TARGET_ARCH/bin/g++
390
391 PATH=$PREFIX/$TARGET_ARCH/bin:$PREFIX/bin:$PATH 
392
393 mkdir -p $PREFIX/src
394 cd $PREFIX/src
395
396 ncs=`eval echo $native_config_site`
397 rm -f $ncs
398 mkdir -p `dirname $ncs`
399 cat > $ncs <<EOF
400 ac_cv_sizeof_int=4
401 ac_cv_sizeof_long=4
402 ac_cv_sys_restartable_syscalls=yes
403 EOF
404
405 set -x
406 type=native
407 for i in $native_packages; do
408         if build $i; then
409                 pack $i
410                 continue
411         fi
412         exit 1
413 done
414
415 rm -f $WWW/$CYGWIN_DLL.zip
416 cd $PREFIX/bin && zip $WWW/$CYGWIN_DLL.zip $CYGWIN_DLL