Updated dependency info
[maemo-efl] / trunk / build-all.sh
1 #!/bin/sh
2
3 source "helper-functions.sh"
4
5 ###########################################################
6 # Variable definitions
7 ###########################################################
8 __this_script=`basename $0`
9 __this_script_dir=`dirname $0`
10 __orig_path=$PATH
11
12 # Binaries
13 __date=`which date`
14 __git=`which git`
15 __head=`which head`
16 __mkdir=`which mkdir`
17 __sed=`which sed`
18 __uname=`which uname`
19 __chmod=`which chmod`
20 __grep=`which grep`
21 __egrep=`which egrep`
22 __debsign=`which debsign`
23
24 # git definitions
25 __git_clone="$__git clone -q"
26 __git_pull="$__git pull -q"
27 __git_clean="$__git clean -q -x -d -f"
28 __git_reset="$__git reset --hard HEAD"
29 __git_repo="git://staff.get-e.org/"
30
31 # e17 git repositories paths
32 __e17_libs="e17/libs"
33 __e17_proto="e17/proto"
34 __e17_python_efl="$__e17_proto/python-efl"
35 __e17_python_etk="users/cmarcelo"
36 __e17_python_efl_utils="users/barbieri"
37 #__e17_python_dispatcher="users/ulisses"
38
39 # modules to build
40 #__lib_modules="edb eet evas ecore embryo edje efreet epeg epsilon emotion etk ewl e_dbus exml enhance"
41 __lib_modules="eet:evas:ecore:embryo:edje:imlib2:epeg:epsilon:etk:e_dbus"
42 __other_modules="himf-ecore:himf-ecore-chinook:lightmediascanner:python-lightmediascanner"
43 __python_modules="python-evas:python-ecore:python-edje:python-epsilon:python-e_dbus"
44 __python_etk_module="python-etk"
45 __python_efl_utils_module="python-efl_utils"
46 #__python_dispatcher_module="python-dispatcher"
47 __virtual_packages="efl-core python-efl-core"
48
49 # dpkg definitions
50 __common_build_pkg_options="-rfakeroot -us -uc -D"
51
52 # Packages dirs and log file
53 __today=`$__date +%Y%m%d`
54 __base_pkg_dir="$__this_script_dir/packages_$__today"
55 __output_file="$PWD/$__base_pkg_dir/packages_$__today.log"
56
57 # Scratchbox definitions
58 __sbox_path="/scratchbox"
59
60 # Other
61 __update_repositories=1
62 __installed_packages=""
63
64 ###########################################################
65 # Function definitions
66 ###########################################################
67
68 function usage() {
69     cat << EOF
70
71 Usage: $__this_script [OPTIONS]
72
73 Build script for EFL debian packages for Maemo.
74
75 Options:
76     -c      Don't update source repositories.
77     -h      Show this usage guide.
78     -s PATH Specify alternate scratchbox path (default: $__sbox_path).
79
80 EOF
81 }
82
83 function create_log_file() {
84     if [ ! -r $__output_file ]; then
85         msg_begin "Creating log file"
86         touch $__output_file
87         msg_end $?
88     else
89         msg "Using existing log file: $__output_file"
90     fi
91 }
92
93 function log_to_file() {
94     local now
95     local msg
96     msg=$1
97
98     if [ ! -r $__output_file ]; then
99         error "log_to_file(): Log file does not exist"
100     fi
101
102     now=`$__date +%H:%M:%S`
103     echo "$now: $msg" >> $__output_file
104 }
105
106 function start_log() {
107     local now
108     now=`$__date -R`
109
110     echo "" >> $__output_file
111
112     if [ $? != 0 ] ; then
113         error "start_log(): Could not create $__output_file file"
114     fi
115
116     cat << EOF >> $__output_file
117 *********************************************************
118 * Started $__this_script: $now *
119 *********************************************************
120
121 EOF
122 }
123
124 function finish_log() {
125     local now
126     now=`$__date -R`
127
128     if [ ! -r $__output_file ]; then
129         error "finish_log(): Log file does not exist"
130     fi
131
132     cat << EOF >> $__output_file
133
134 * Finished $__this_script: $now
135 EOF
136 }
137
138 function clone_repository() {
139     local repo
140     repo=$1
141     $__git_clone $repo.git >> $__output_file 2>&1
142     return $?
143 }
144
145 function update_repository() {
146     local repo
147     repo=$1
148
149     if [ ! -d $repo ]; then
150         error "  Trying to update invalid repository"
151     fi
152
153     cd $repo
154     $__git_pull >> $__output_file 2>&1 || return 1
155     cd - > /dev/null 2>&1
156
157     return 0
158 }
159
160 function clean_repository() {
161     local repo
162     repo=$1
163
164     if [ ! -d $repo ]; then
165         error "  Trying to clean invalid repository"
166     fi
167
168     cd $repo
169     $__git_reset >> $__output_file 2>&1 || return 1
170     $__git_clean >> $__output_file 2>&1 || return 1
171     cd - > /dev/null 2>&1
172
173     return 0
174 }
175
176 function configure_pkg() {
177     local dir
178     dir=$1
179
180     cd $dir/`basename $dir`
181
182     if [ -x ./autogen.sh ]; then
183         NOCONFIGURE=1 ./autogen.sh >> $dir/sbox_build_pkgs.log 2>&1 || return 1
184     fi
185
186     cd - > /dev/null 2>&1
187
188     return 0
189 }
190
191 function build_pkg() {
192     local dir
193     dir=$1
194
195     configure_pkg $dir || return 1
196
197     local DEB_BUILD_OPTIONS=n8x0
198     if [ "x$__distro" = "xgregale" ]; then
199         DEB_BUILD_OPTIONS=n770
200     fi
201
202     cat << EOF > $dir/sbox_build_pkgs
203 #!/bin/sh
204
205 export DEBFULLNAME="$DEBFULLNAME"
206 export DEBEMAIL="$DEBEMAIL"
207 export DEB_BUILD_OPTIONS="$DEB_BUILD_OPTIONS"
208
209 cd $dir/`basename $dir`
210
211 VERSION=\`$__sbox_dpkg_parsechangelog | grep Version: | cut -d" " -f2 | cut -d- -f1 >> $dir/sbox_build_pkgs.log 2>&1 || exit 1\`
212 REVISION=\`$__sbox_dpkg_parsechangelog | grep Version: | cut -d- -f2 >> $dir/sbox_build_pkgs.log 2>&1 || exit 1\`
213
214 # $__sbox_dch -v \$VERSION+cvs$__today-\$REVISION -D $__distro "Snapshot CVS release of $__today" >> $dir/sbox_build_pkgs.log 2>&1 || exit 1
215 $__sbox_dpkg_buildpackage $__build_pkg_options >> $dir/sbox_build_pkgs.log 2>&1
216 exit \$?
217 EOF
218
219     $__chmod 755 $dir/sbox_build_pkgs
220     $__sbox $dir/sbox_build_pkgs
221     return $?
222 }
223
224 function install_pkgs() {
225     local dir
226     dir=$1
227
228     cat << EOF > $dir/sbox_install_pkgs
229 #!/bin/sh
230
231 cd $dir
232 $__sbox_dpkg --install *.deb >> $dir/sbox_install_pkgs.log 2>&1
233 exit \$?
234 EOF
235
236     $__chmod 755 $dir/sbox_install_pkgs
237     $__sbox $dir/sbox_install_pkgs || return 1
238
239     for package in $dir/*.deb; do
240         pkg=`basename $package | cut -d_ -f1`
241         echo $__installed_packages | tr " " "\n" | sort -u | $__egrep "\^$pkg\$" > /dev/null 2>&1
242
243         if [ ! $? -eq 0 ]; then
244             __installed_packages="$__installed_packages $pkg"
245         fi
246     done
247
248     return 0
249 }
250
251 function uninstall_pkgs() {
252
253     cat << EOF > /tmp/sbox_uninstall_pkgs
254 #!/bin/sh
255
256 cd /tmp
257 $__sbox_dpkg --purge $__installed_packages >> /tmp/sbox_uninstall_pkgs.log 2>&1
258 exit \$?
259 EOF
260
261     __installed_packages=""
262     $__chmod 755 /tmp/sbox_uninstall_pkgs
263     #$__sbox /tmp/sbox_uninstall_pkgs
264     return $?
265 }
266
267 function sign_pkgs() {
268     local dir
269     dir=$1
270
271     cd $dir
272     $__debsign *.changes >> $dir/sign_pkgs.log 2>&1 || return 1
273
274     cd - > /dev/null 2>&1
275
276     return 0
277 }
278
279 function get_sources() {
280     local modules
281     local repo
282     modules=`echo $1|$__sed -e 's/:/ /g'`
283     repo=$2
284
285     for module in $modules; do
286
287         if [ ! -d $module ]; then
288             error "Directory $module does not exist."
289         fi
290
291         cd $module
292
293         if [ -d $module/.git ]; then
294             if [ ! $__update_repositories -eq 0 ]; then
295                 log_to_file "Updating existing repository at $PWD/$module"
296
297                 msg_begin "  Updating $module repository"
298                 update_repository $module
299                 msg_end $?
300             else
301                 log_to_file "Skipping update of $module repository"
302             fi
303         elif [ -d $module ]; then
304             log_to_file "Removing invalid repository at $PWD/$module"
305             rm -rf $module
306         fi
307
308         if [ ! -d $module ]; then
309             msg_begin "  Cloning $repo/$module.git"
310             clone_repository $repo/$module
311             msg_end $?
312         fi
313
314         cd ..
315     done
316 }
317
318 function setup_distro() {
319     local target
320     local sources_list_file
321     local target_conf_file
322     local ret
323     target=$1
324     sources_list_file=$__sbox_path/users/$USER/targets/$target/etc/apt/sources.list
325     target_conf_file=$__sbox_path/users/$USER/targets/$target.config
326     ret=1
327
328     log_to_file "setup_distro(): Target $target"
329     log_to_file "setup_distro(): sources.list file : $sources_list_file"
330     log_to_file "setup_distro(): config file: $target_conf_file"
331
332     if [ "x$target" != "x" ] && [ -r $sources_list_file ] && [ -r $target_conf_file ]; then
333         # XXX: FIXME Figure out a better way to get the distro string
334         __distro=`$__head -1 $sources_list_file | cut -d" " -f3`
335         __arch=`$__grep SBOX_CPU= $target_conf_file | cut -d= -f2`
336         __pkg_dir="$__base_pkg_dir/$__distro/$__arch"
337         if [ "x$__arch" = "xarm" ] ; then
338             __build_pkg_options="$__common_build_pkg_options -B"
339         else
340             __build_pkg_options="$__common_build_pkg_options -I.svn -I.git -I.gitignore -I.cvsignore -sa"
341         fi
342         ret=0
343     fi
344
345     if [ $ret -eq 0 ]; then
346         log_to_file "setup_distro(): Configuration:"
347         log_to_file "setup_distro(): distro...........: $__distro"
348         log_to_file "setup_distro(): arch.............: $__arch"
349         log_to_file "setup_distro(): build options....: $__build_pkg_options"
350         log_to_file "setup_distro(): pkg_dir..........: $__pkg_dir"
351     fi
352
353     return $ret
354 }
355
356 function setup_sbox() {
357     if [ ! -d $__sbox_path ]; then
358         error "Invalid scratchbox path: $__sbox_path"
359     fi
360
361     __sbox="$__sbox_path/login"
362     __sbox_tools_bin_path="$__sbox_path/tools/bin"
363     __sbox_sb_conf="$__sbox_tools_bin_path/sb-conf"
364
365     __sbox_maemo3_debian_bin_path="/scratchbox/devkits/maemo3-debian/bin"
366     __sbox_dpkg="$__sbox_maemo3_debian_bin_path/dpkg"
367     __sbox_dpkg_buildpackage="$__sbox_dpkg-buildpackage"
368     __sbox_dpkg_parsechangelog="$__sbox_dpkg-parsechangelog"
369
370     __sbox_debian_sarge_bin_path="/scratchbox/devkits/debian-sarge/bin"
371     __sbox_dch="$__sbox_debian_sarge_bin_path/dch"
372 }
373
374 function change_sbox_target() {
375     local target
376     target=$1
377
378     $__sbox_sb_conf select $target >> $__output_file 2>&1
379     return $?
380 }
381
382 ###########################################################
383 # Begin script
384 ###########################################################
385
386 # Parse comand line options
387 while getopts "chs:" opt ; do
388     case "$opt" in
389         c)
390             __update_repositories=0
391             ;;
392         h)
393             usage
394             exit 0
395             ;;
396         s)
397             __sbox_path=$OPTARG
398             if [ "x$__sbox_path" = "x" ] || [ ! -d $__sbox_path ]; then
399                 error "Invalid scratchbox path: $__sbox_path"
400             fi
401             ;;
402         [?])
403             usage
404             exit 1
405             ;;
406     esac
407 done
408
409 # Initial checks
410
411 # Check if we're running inside scratchbox
412 if [ -r /targets/links/scratchbox.config ]; then
413     error "You should run this script ouside the scratchbox environment."
414 fi
415
416 # Create base packages dir
417 if [ ! -d $__base_pkg_dir ]; then
418     msg_begin "Creating base packages dir $__base_pkg_dir"
419     $__mkdir -p $__base_pkg_dir
420     msg_end $?
421 fi
422
423 # Create log file
424 create_log_file
425 start_log
426
427 # Download modules under e17/libs
428 msg "Downloading e17 modules"
429 get_sources $__lib_modules $__git_repo$__e17_libs
430
431 # Download python modules under proto/python/efl
432 msg "Downloading python modules"
433 get_sources $__python_modules $__git_repo$__e17_python_efl
434
435 # Download python-etk module
436 get_sources $__python_etk_module $__git_repo$__e17_python_etk
437
438 # Download python-efl-utils module
439 get_sources $__python_efl_utils_module $__git_repo$__e17_python_efl_utils
440
441 # Download python-dispatcher module
442 #get_sources $__python_dispatcher_module $__git_repo$__e17_python_dispatcher
443
444 # Setup scratchbox variables
445 setup_sbox
446
447 ###########################################################
448 # ARCHITECTURE DEPENDENT MODULES
449 ###########################################################
450 # For each scratchbox target
451 for target in `$__sbox_sb_conf list --targets`; do
452     msg_begin "Checking distro and arch for target $target"
453     setup_distro $target
454     msg_end $?
455
456     msg "  Distribution..: $__distro"
457     msg "  Architecture..: $__arch"
458     msg "  Build Options.: $__build_pkg_options"
459
460     if [ ! -d $__pkg_dir ]; then
461         msg_begin "  Creating dir for $__distro $__arch packages"
462         $__mkdir -p $__pkg_dir
463         msg_end $?
464     fi
465
466     msg_begin "  Changing current sbox target to $target"
467     change_sbox_target $target
468     msg_end $?
469
470     # For each module
471     for module in `echo $__lib_modules:$__python_modules:$__python_etk_module|$__sed -e 's/:/ /g'`; do
472         msg "  Building $module packages for $__distro $__arch"
473
474         if [ -d ./$module/$module/debian ]; then
475             msg_begin "  Removing existing debian directory"
476             rm -rf ./$module/$module/debian
477             msg_end $?
478         fi
479
480         msg_begin "  Copying specific debian directory"
481         if [ -d ./$module/debian ]; then
482             cp -r ./$module/debian ./$module/$module/
483
484             if [ -d ./$module/debian_$__distro ]; then
485                 cp -r ./$module/debian_$__distro/* ./$module/$module/debian/
486             fi
487         else
488             if [ -d ./$module/debian_$__distro ]; then
489                 cp -r ./$module/debian_$__distro ./$module/$module/debian
490             else
491                 echo ""
492                 warn "Missing debian directory for $module. Ignoring"
493                 continue
494             fi
495         fi
496         msg_end $?
497
498         if [ -d /tmp/$module/$module ]; then
499             msg_begin "  Removing temporary $module"
500             rm -rf /tmp/$module/$module
501             msg_end $?
502         fi
503
504         msg_begin "  Copying $module dir to /tmp"
505         cp -u -r $module /tmp
506         msg_end $?
507
508         msg_begin "  Cleaning $module repository"
509         clean_repository $module/$module
510         msg_end $?
511
512         msg_begin "  Building $module packages"
513         build_pkg /tmp/$module
514         msg_end $?
515
516         msg_begin "  Signing $module packages"
517         sign_pkgs /tmp/$module
518         msg_end $?
519
520         msg_begin "  Installing $module packages"
521         install_pkgs /tmp/$module
522         msg_end $?
523
524         msg_begin "  Copying $module packages"
525         if [ "x$__arch" != "xarm" ]; then
526             mv /tmp/$module/*.dsc /tmp/$module/*.tar.gz $__pkg_dir
527         fi
528         mv /tmp/$module/*.deb /tmp/$module/*.changes $__pkg_dir
529         msg_end $?
530
531         msg_begin "  Removing temporary $module"
532         rm -rf /tmp/$module/$module
533         msg_end $?
534     done
535
536     msg_begin "  Uninstalling packages $__installed_packages"
537     uninstall_pkgs
538     msg_end $?
539 done
540
541 exit 0
542 ###########################################################
543 # ARCHITECTURE INDEPENDENT MODULES
544 ###########################################################
545 # For each scratchbox target
546 for target in `$__sbox_sb_conf list --targets`; do
547     msg_begin "Checking distro and arch for target $target"
548     setup_distro $target
549     msg_end $?
550
551     msg "  Distribution..: $__distro"
552     msg "  Architecture..: $__arch"
553     msg "  Build Options.: $__build_pkg_options"
554
555     if [ "x$__arch" = "xarm" ]; then
556         warn "Skipping target $target for architecture independent packages"
557         continue
558     fi
559
560     __arch="all"
561     __pkg_dir=`dirname $__pkg_dir`/$__arch
562
563     if [ ! -d $__pkg_dir ]; then
564         msg_begin "  Creating dir for $__distro $__arch packages"
565         $__mkdir -p $__pkg_dir
566         msg_end $?
567     fi
568
569     msg_begin "  Changing current sbox target to $target"
570     change_sbox_target $target
571     msg_end $?
572
573     # For each module
574     for module in $__python_efl_utils_module; do
575         msg "  Building $module packages for $__distro $__arch"
576
577         if [ ! -d /tmp/$module ]; then
578             mkdir /tmp/$module
579         fi
580
581         if [ -d /tmp/$module/$module ]; then
582             msg_begin "  Removing temporary $module"
583             rm -rf /tmp/$module/$module
584             msg_end $?
585         fi
586
587         msg_begin "  Copying specific debian directory"
588         if [ -d ./$module/debian ]; then
589             cp -r ./$module/debian ./$module/$module/
590
591             if [ -d ./$module/debian_$__distro ]; then
592                 cp -r ./$module/debian_$__distro/* ./$module/$module/debian/
593             fi
594         else
595             echo ""
596             warn "  Missing debian directory for $module. Ignoring"
597             continue
598         fi
599         msg_end $?
600
601         msg_begin "  Copying $module dir to /tmp"
602         cp -u -r $module /tmp
603         msg_end $?
604
605         msg_begin "  Cleaning $module repository"
606         clean_repository $module/$module
607         msg_end $?
608
609         msg_begin "  Building $module packages"
610         build_pkg /tmp/$module
611         msg_end $?
612
613         msg_begin "  Signing $module packages"
614         sign_pkgs /tmp/$module
615         msg_end $?
616
617         msg_begin "  Installing $module packages"
618         install_pkgs /tmp/$module
619         msg_end $?
620
621         msg_begin "  Copying $module packages"
622         mv /tmp/$module/*.dsc /tmp/$module/*.tar.gz /tmp/$module/*.deb /tmp/$module/*.changes $__pkg_dir
623         msg_end $?
624
625         msg_begin "  Removing temporary $module"
626         rm -rf /tmp/$module/$module
627         msg_end $?
628     done
629
630     msg_begin "  Uninstalling packages $__installed_packages"
631     uninstall_pkgs
632     msg_end $?
633 done
634
635 ###########################################################
636 # VIRTUAL PACKAGES
637 ###########################################################
638 # For each scratchbox target
639 for target in `$__sbox_sb_conf list --targets`; do
640     msg_begin "Checking distro and arch for target $target"
641     setup_distro $target
642     msg_end $?
643
644     msg "  Distribution..: $__distro"
645     msg "  Architecture..: $__arch"
646     msg "  Build Options.: $__build_pkg_options"
647
648     if [ "x$__arch" = "xarm" ]; then
649         warn "Skipping target $target for architecture independent packages"
650         continue
651     fi
652
653     __arch="all"
654     __pkg_dir=`dirname $__pkg_dir`/$__arch
655
656     if [ ! -d $__pkg_dir ]; then
657         msg_begin "  Creating dir for $__distro $__arch packages"
658         $__mkdir -p $__pkg_dir
659         msg_end $?
660     fi
661
662     msg_begin "  Changing current sbox target to $target"
663     change_sbox_target $target
664     msg_end $?
665
666     # For each module
667     for module in $__virtual_packages; do
668         msg "  Building $module packages for $__distro $__arch"
669
670         if [ ! -d /tmp/$module ]; then
671             mkdir /tmp/$module
672         fi
673
674         if [ -d /tmp/$module/$module ]; then
675             msg_begin "  Removing temporary $module"
676             rm -rf /tmp/$module/$module
677             msg_end $?
678         fi
679
680         msg_begin "  Copying $module dir to /tmp"
681         cp -u -r $module /tmp/$module
682         msg_end $?
683
684         msg_begin "  Building $module packages"
685         build_pkg /tmp/$module
686         msg_end $?
687
688         msg_begin "  Signing $module packages"
689         sign_pkgs /tmp/$module
690         msg_end $?
691
692         msg_begin "  Installing $module packages"
693         install_pkgs /tmp/$module
694         msg_end $?
695
696         msg_begin "  Copying $module packages"
697         mv /tmp/$module/*.dsc /tmp/$module/*.tar.gz /tmp/$module/*.deb /tmp/$module/*.changes $__pkg_dir
698         msg_end $?
699
700         msg_begin "  Removing temporary $module"
701         rm -rf /tmp/$module/$module
702         msg_end $?
703     done
704
705     msg_begin "  Uninstalling packages $__installed_packages"
706     uninstall_pkgs
707     msg_end $?
708 done
709
710 # END
711 finish_log