]> git.donarmstrong.com Git - lilypond.git/blob - buildscripts/make-cygwin-cross.sh
ba14c333e1ddae9f8f1998082eb52dac96c76da3
[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 #  * RPM distribution of the cygwin pre-release sources, from:
17 #
18 #      http://appel.dyndns.org/lilypond/gnu-windows/redhat/SRPMS/
19 #
20 #    The tarballs were fetched from:
21 #
22 #      ftp://sourceware.cygnus.com/pub/cygwin/private/cygwin-net-485/
23 #
24
25 ################
26 # config section
27 ################
28
29 target=cygwin
30 #target=mingw
31
32 if [ $target = cygwin ]; then
33         ROOT=/usr/src/cygwin-net-485
34         TARGET_ARCH=i686-pc-cygwin
35 else
36         ROOT=/usr/src/mingw-net-485
37         TARGET_ARCH=i386-pc-mingw32
38 fi
39 PREFIX=$ROOT/usr
40 NATIVE_ROOT=/Cygnus
41 NATIVE_PREFIX=$NATIVE_ROOT/usr
42
43 # urg
44 DEVEL=/home/fred
45 distdir=$DEVEL/WWW/lilypond/gnu-windows/lily-w32
46 #distdir=/tmp
47
48 SOURCE_PATH=$DEVEL/usr/src/releases:$DEVEL/usr/src/redhat/SRPMS
49
50 ARCH=`uname -m`
51 OS=`uname -s | tr '[A-Z]' '[a-z]'`
52 HOST=$ARCH-gnu-$OS
53 CROSS_TARGET_ARCH=$ARCH-x-$TARGET_ARCH
54 cta=$ARCH-x-cygwin
55 ta=i686-cygwin
56
57 cygwin_binary=cygwin-20000301.tar.gz
58 mingw_binary=bin-crtdll-2000-02-03.tar.gz
59
60 #CYGWIN_DLL=cygwin1-net-485.dll
61 CYGWIN_DLL=cygwin1.dll
62 MINWG_DLL=mingwc10-net-485.dll
63
64
65 ################
66 # cross packages
67 ################
68
69 cross_rpm="
70 binutils-19990818
71 bison
72 flex
73 gcc-2.95.2
74 "
75
76 binutils_after_rpm='
77 cd $PREFIX/$TARGET_ARCH/bin \;
78 ln -f ../../bin/$TARGET_ARCH-ar ar \;
79 ln -f ../../bin/$TARGET_ARCH-as as \;
80 ln -f ../../bin/$TARGET_ARCH-dlltool dlltool \;
81 ln -f ../../bin/$TARGET_ARCH-ld ld \;
82 ln -f ../../bin/$TARGET_ARCH-nm nm \;
83 ln -f ../../bin/$TARGET_ARCH-objdump objdump \;
84 ln -f ../../bin/$TARGET_ARCH-objcopy objcopy \;
85 ln -f ../../bin/$TARGET_ARCH-ranlib ranlib \;
86 ln -f ../../bin/$TARGET_ARCH-strip strip \;
87 cd $PREFIX/bin \;
88 rm -f ar as dlltool ld nm objdump objcopy ranlib strip \;
89 '
90 gcc_after_rpm='
91 cd $PREFIX/$TARGET_ARCH/bin \;
92 ln -f ../../bin/$TARGET_ARCH-gcc cc \;
93 ln -f ../../bin/$TARGET_ARCH-gcc gcc \;
94 ln -f ../../bin/$TARGET_ARCH-c++ c++ \;
95 ln -f ../../bin/$TARGET_ARCH-g++ g++
96 '
97
98 #guile_after_rpm='ln -f $NATIVE_PREFIX/bin/i686-redhat-cygwin-guile-config $NATIVE_PREFIX/bin/i686-pc-cygwin-guile-config'
99
100 lilypond_version=@TOPLEVEL_VERSION@
101
102 native_rpm="
103 rx-1.5
104 zlib-1.1.3
105 db-2.7.7
106 guile-1.3.4
107 rpm-3.0.4
108 lilypond-$lilypond_version
109 "
110
111 #######################
112 # end of config section
113 #######################
114
115 ###########
116 # functions
117 ###########
118
119 expand ()
120 {(
121
122         set -
123         string=`eval echo $\`eval echo "${1}${2}"\``
124         eval echo $string
125 )
126 }
127
128 find_path ()
129 {(
130         set -
131         expr=$1
132         source_path=${2:-$SOURCE_PATH}
133         path_list=`echo $source_path | sed 's/:/ /g'`
134
135         found=
136         for i in $path_list; do
137                 found=`/bin/ls -d1 $i/$expr 2>/dev/null | head -1`
138                 if [ "$found" != "" ] && [ -e $found ]; then
139                         break
140                 fi
141         done
142         echo $found
143 )
144 }
145
146 build ()
147 {(
148         package=$1
149         name=`echo $package | sed 's/-.*//'`
150
151         if [ $type = "cross" ]; then
152                 target_arch=$CROSS_TARGET_ARCH
153                 a=$cta
154         else
155                 target_arch=$TARGET_ARCH
156                 a=$ta
157         fi
158
159         rpm_package=`find_path $name*.rpm "$topdir/RPMS/$cta:$topdir/RPMS/$ta"`
160         if [ "$rpm_package" != "" ]; then
161                 echo "$rpm_package: package exists"
162                 echo "$rpm_package: just updating db"
163                 rpm -ivv --justdb --ignoreos --ignorearch --nodeps --force\
164                         --dbpath $NATIVE_ROOT/var/lib/rpm \
165                         $topdir/RPMS/$a/$name*.rpm
166                 exit 0
167         fi
168
169         cd $topdir
170         found=`find_path $package*src.rpm`
171         if [ "$found" != "" ]; then
172                 rpm --root $NATIVE_ROOT -ivv $found || exit 1
173                 rpm --target=$target_arch -ba SPECS/$name*.spec || exit 1
174         else
175                 tarball=`/bin/ls -d1 SOURCES/$package*tar.gz 2>/dev/null | head -1`
176                 if [ "SPECS/$name.spec" != "" ] && [ "$tarball" != "" ]; then
177                         rpm --target=$target_arch -ba SPECS/$name.spec || exit 1
178                 else
179                         found=`find_path $package*tar.gz`
180                         if [ "$found" != "" ]; then
181                                 rpm --target=$target_arch -ta $found || exit 1
182                         else
183                                 echo "$package: no such rpm or tarball"
184                                 exit 1
185                         fi
186                 fi
187         fi
188         name=`echo $package | sed 's/-.*//'`
189
190         rpm -ivv --ignoreos --ignorearch --nodeps --force\
191                 --dbpath $NATIVE_ROOT/var/lib/rpm \
192                 $topdir/RPMS/$a/$name*.rpm
193         #urg
194         name_after_rpm="`expand $name _after_rpm`"
195         `eval $name_after_rpm` || exit 1
196 )
197 }
198
199 ##################
200 # end of functions
201 ##################
202
203 #######
204 # setup
205 #######
206
207 set -x
208 mkdir -p $ROOT
209 if [ ! -d $PREFIX/bin ]; then
210         mkdir -p $PREFIX
211         cd $PREFIX
212         mkdir -p include
213         mkdir -p $TARGET_ARCH
214         cd $TARGET_ARCH && ln -s ../include .
215         cd $ROOT
216         found=`find_path $cygwin_binary`
217         if [ "$found" = "" ]; then
218                 echo "$cygwin_binary: no such tarball"
219                 exit 1
220         fi
221         tar xzf $found
222         # urg, bug in gcc's cross-make configuration
223         mkdir -p $PREFIX/lib/gcc-lib/$TARGET_ARCH/2.95.2
224 else
225         echo "$PREFIX: already exists"
226         echo "$cygwin_binary: skipping"
227 fi
228
229 # mingw
230 if [ ! -d $PREFIX/$TARGET_ARCH ]; then
231         cd $PREFIX
232         found=`find_path $mingw_binary`
233         if [ "$found" = "" ]; then
234                 echo "$mingw_binary: no such tarball"
235                 exit 1
236         fi
237         tar xzf $found
238
239         mkdir -p $PREFIX/lib/gcc-lib/$TARGET_ARCH/2.95.2
240         rm -f include
241         mkdir -p $PREFIX/i386-mingw32/include
242         ln -s $PREFIX/i386-mingw32 $TARGET_ARCH
243         ln -s $PREFIX/$TARGET_ARCH/include .
244 fi
245
246 rm -f $NATIVE_ROOT
247 if [ ! -e $NATIVE_ROOT ]; then
248         ln -s $ROOT $NATIVE_ROOT || exit 1
249 fi
250
251 #mv $PREFIX/bin/cygwin1.dll $PREFIX/bin/$CYGWIN_DLL
252 #mv $PREFIX/bin/mingwc10.dll $PREFIX/bin/$MINGW_DLL
253
254 mkdir -p $ROOT/var/redhat
255 mkdir -p $PREFIX/src/redhat
256
257 native_config_site='$PREFIX/share/native-config.site'
258
259 ncs=`eval echo $native_config_site`
260 rm -f $ncs
261 mkdir -p `dirname $ncs`
262 cat > $ncs <<EOF
263 ac_cv_sizeof_int=4
264 ac_cv_sizeof_long=4
265 ac_cv_sys_restartable_syscalls=yes
266 ac_cv_sprintf_count=yes
267 ac_cv_spinlocks=no
268 db_cv_sprintf_count=yes
269 db_cv_spinlocks=no
270 EOF
271
272 mcta=$ARCH-cygwin
273 cross_rpm_dir=$NATIVE_PREFIX/lib/rpm/$mcta
274 cross_rpm_link=/usr/lib/rpm/$mcta
275 mkdir -p $cross_rpm_dir
276 rm -f $cross_rpm_link
277 ln -s $NATIVE_PREFIX/lib/rpm/$mcta $cross_rpm_link
278
279 native_rpm_dir=$NATIVE_PREFIX/lib/rpm/$ta
280 native_rpm_link=/usr/lib/rpm/$ta
281 mkdir -p $native_rpm_dir
282 rm -f $native_rpm_link
283 ln -s $NATIVE_PREFIX/lib/rpm/$ta $native_rpm_link
284
285 cross_macros=$cross_rpm_dir/macros
286 native_macros=$native_rpm_dir/macros
287
288 base_macros=$NATIVE_PREFIX/lib/rpm/base-macros
289 rm -f $base_macros
290 cat > $base_macros <<EOF
291 %root           /Cygnus
292 %_rootbindir    /Cygnus/bin
293 #_usr           /Cygnus/usr
294 %_prefix        /Cygnus/usr
295 %prefix         /Cygnus/usr
296 %native_prefix  /Cygnus/usr
297
298 %_topdir        %{native_prefix}/src/redhat
299 %_sourcedir     %{native_prefix}/src/redhat/SOURCES
300 %_builddir      %{native_prefix}/src/redhat/BUILD
301 %_srcrpmdir     %{native_prefix}/src/redhat/SRPMS
302 %_rpmdir        %{native_prefix}/src/redhat/RPMS
303
304 #%DocDir                %{native_prefix}/doc
305 %DocDir         /Cygnus/usr/doc
306 %_docdir        /Cygnus/usr/doc
307 %_defaultdocdir /Cygnus/usr/doc
308
309 %cygwin_dll     %{native_prefix}/bin/cygwin1.dll
310
311 %cflags         %{optflags}
312
313 %sourcedir      .
314 EOF
315
316 cp -f $base_macros $cross_macros
317 cat >> $cross_macros <<EOF
318 %_rpmfilename   %%{ARCH}-x-cygwin/%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}-x-cygwin.rpm
319
320 %config_site    %{nil}
321 %ldflags        %{nil}
322 %_target_platform $TARGET_ARCH
323 %program_prefix $TARGET_ARCH-
324
325 %configure      \
326   CFLAGS="%{cflags}" LDFLAGS="%{ldflags}" CONFIG_SITE=%{config_site} \
327   %{sourcedir}/configure \
328   --host=%{_host} --target=%{_target_platform} --prefix=%{native_prefix} \
329   --program-prefix=%{program_prefix}
330 EOF
331
332 cp -f $base_macros $native_macros
333 cat >> $native_macros <<EOF
334 %config_site    %{_prefix}/share/native-config.site
335 #%program_suffix .exe
336 %program_suffix %{nil}
337
338 #%_arch         i686-cygwin
339 #%_vendor       pc
340 #%_os           cygwin
341
342 %_rpmfilename   %%{ARCH}-cygwin/%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}-cygwin.rpm
343
344 %__find_provides        %{native_prefix}/lib/rpm/cygwin.prov
345 %__find_requires        %{native_prefix}/lib/rpm/cygwin.req
346
347 %ldflags        -L%{native_prefix}/lib %{cygwin_dll}
348 %configure      \
349   CFLAGS="%{cflags}" LDFLAGS="%{ldflags}" CONFIG_SITE=%{config_site} \
350   %{sourcedir}/configure --host=%{_host} --target=%{_target_platform} \
351   --prefix=%{native_prefix} --program-suffix=%{program_suffix}
352 EOF
353
354 rm -f $native_rpm_dir/cygwin.prov
355 cat > $native_rpm_dir/cygwin.prov <<EOF
356 #!/bin/sh
357 while read f ; do
358        f=\`echo $f | tr '[:upper:]' '[:lower:]'\`
359        case \$f in
360        *.dll)  basename \$f
361                ;;
362        esac
363 done | sort -u
364 EOF
365 chmod 755 $native_rpm_dir/cygwin.prov
366
367 rm -f $native_rpm_dir/cygwin.req
368 cat > $native_rpm_dir/cygwin.req <<EOF
369 #!/bin/sh
370
371 while read f ; do
372        case \$f in
373        *.dll|*.exe)    objdump -p $f | grep "DLL Name:" | cut -f3 -d" " | tr '[
374 upper:]' '[:lower:]'
375                        ;;
376        esac
377 done | sort -u
378
379 EOF
380 chmod 755 $native_rpm_dir/cygwin.req
381
382
383 set -x
384 type=rpm
385 rm -rf $NATIVE_ROOT/var/lib/rpm
386 mkdir -p $NATIVE_ROOT/var/lib/rpm
387 rpm --root $NATIVE_ROOT --initdb
388
389 topdir=$NATIVE_PREFIX/src/redhat
390 mkdir -p $topdir/{BUILD,RPMS/{$ta,$cta},SOURCES,SPECS,SRPMS}
391
392 ##############
393 # end of setup
394 ##############
395
396 OLDPATH=$PATH
397 PATH=$PREFIX/bin:$PATH
398
399 mkdir -p $PREFIX/src
400 cd $PREFIX/src
401 type=cross
402 for i in $cross_rpm; do
403         if build $i; then
404                 true
405         else
406                 echo "$i: rpm build failed"
407                 exit 1
408         fi
409 done
410
411 PATH=$PREFIX/$TARGET_ARCH/bin:$PATH
412
413 cd $PREFIX/src
414 type=native
415 for i in $native_rpm; do
416         if build $i; then
417                 true
418         else
419                 echo "$i: rpm build failed"
420                 exit 1
421         fi
422 done
423
424 ##############
425 # Distribution
426 ##############
427
428 PATH=$OLDPATH
429
430 mkdir -p $distdir
431 rm -f $distdir/$CYGWIN_DLL.gz
432 cd $distdir && cp -f $PREFIX/bin/$CYGWIN_DLL . && gzip -f $CYGWIN_DLL
433
434 rm -f $distdir/rpm.gz
435 cd $distdir && cp -f $ROOT/bin/rpm . && gzip -f rpm
436
437
438 cat > $distdir/setup.sh <<EOF
439 #!/bin/bash
440 set -x
441 ROOT=/Cygnus
442 PREFIX=\$ROOT/usr
443 gunzip rpm.gz || exit 1
444 #dll=\$ROOT/net-485
445 #mkdir -p \$dll
446 #gzip -dc cygwin.dll.gz > \$dll/cygwin1.dll
447 ## this won't work: must be done outside of cygwin
448 #old_dll=\`which cygwin1.dll\`
449 #mv -f \$old_dll \$old_dll.orig\$\$
450 #gunzip cygwin1.dll.gz
451 #cp -f cygwin1.dll \$old_dll
452 echo > rpmrc
453 mkdir -p \$ROOT/var/lib
454 mkdir -p \$ROOT/bin
455 echo > \$ROOT/bin/rpm
456 ./rpm --root \$ROOT --rcfile rpmrc --initdb
457 ./rpm --root \$ROOT --rcfile rpmrc --nodeps --ignorearch --ignoreos -Uhv \\
458         RPMS/$ta/rpm-*.$ta.rpm \\
459         RPMS/$ta/*.$ta.rpm
460 done
461 EOF
462
463 cat > $distdir/setup.bat <<EOF
464 del dll olddll
465 #old_dll=\`which cygwin1.dll\`
466 bash -c 'dll=\`which cygwin1.dll\`;
467         wdll=\`cygpath -w \$dll\`;
468         echo cygwin1.dll \$wdll > newdll; echo \$wdll \$wdll.orig\$\$ > olddll'
469 if not errorlevel 0 goto nobash
470 #mv -f \$old_dll \$old_dll.orig\$\$
471 #gunzip cygwin1.dll.gz
472 gunzip cygwin1.dll.gz
473 #cp -f cygwin1.dll \$old_dll
474 copy < olddll 
475 copy < newdll 
476 bash setup.sh
477 if not errorlevel 0 goto nobash
478 goto :exit
479 :nobash
480 @echo "setup.bat: can't find bash"
481 @echo "setup.bat: please install usertools from"
482 @echo "setup.bat: http://sourceware.cygnus.com/cygwin/"
483 :exit
484 EOF
485
486 cat > $distdir/lilypond.sh <<EOF
487 #!/bin/bash
488 ROOT=/Cygnus
489 PREFIX=\$ROOT/usr
490 \$ROOT/bin/lilypond \$*
491 EOF
492
493 cat > $distdir/midi2ly.sh <<EOF
494 #!/bin/bash
495 ROOT=/Cygnus
496 PREFIX=\$ROOT/usr
497 \$ROOT/bin/midi2ly \$*
498 EOF
499
500 cat > $distdir/lilypond.bat <<EOF
501 bash lilypond.sh %1 %2 %3 %4 %5 %6 %7 %8 %9
502 EOF
503
504 cat > $distdir/midi2ly.bat <<EOF
505 bash midi2ly.sh %1 %2 %3 %4 %5 %6 %7 %8 %9
506 EOF
507
508 distbase=`basename $distdir`
509 cd $distdir
510 rm -f RPMS
511 ln -s ../redhat/RPMS .
512
513 www=`dirname $distdir`
514 cd $www
515 for i in guile-1 rpm lilypond; do
516         rpm=`find_path $i*.rpm $distbase/RPMS/$ta`
517         dist_rpms="$dist_rpms $rpm"
518 done
519
520 rm -f $www/setup.zip
521 cd $www && zip setup.zip lily-w32 $distbase/* $dist_rpms
522
523
524 # make small zip dist available
525 #
526 zipdir=$www/zip
527 mkdir -p $zipdir
528
529 rm -f $zipdir/$CYGWIN_DLL.zip
530 cd $ROOT/bin && zip $zipdir/$CYGWIN_DLL.zip $CYGWIN_DLL
531
532 for i in guile-1 rpm lilypond; do
533         found=`find_path $i*.rpm $distdir/RPMS/$ta`
534         if [ "$found" = "" ]; then
535                 echo "$i: no such .rpm"
536         else
537                 base=`basename $found`
538                 package=`echo $base | sed "s/\.$ta.rpm//"`
539                 dir=/tmp/$i-rpm2zip
540                 rm -rf $dir
541                 mkdir -p $dir
542                 cd $dir || exit 1
543                 rpm2cpio $found | cpio -id
544                 zip -ry $zipdir/$package.zip .
545                 rm -rf $dir
546         fi
547 done