Using bash allows us to have flexibility that sh does'nt give us

Features added by this change are:
Support singular/multiple platform builds - allows to build just the platform
  we care about, while the old behavior is still retained
Support ability to choose if build should stop proceeding if one of the build
  platforms stopped
Support ability to *not* update git, this is useful for development
 branches when folks are getting platform support ready
Support easy addition of platform configuration.
 Supporting a new ks is as easy as adding oneline as follows:
 build_name | ks file | build options
Easy scalability to MeeGo 1.2 release and beyond
 all we need to do is add to the bash array
Use get_opts like all good scripts - allows parameter ordering not important
Add a help text for usage for newbies like me :)

old usage:
scripts/create.sh ID REPOTYPE RELEASE

New usage:
scripts/create.sh -i ID -r RELEASE -R REPO

Signed-off-by: Nishanth Menon <[email protected]>
---
For: master branch:
http://meego.gitorious.org/meego-os-base/image-configurations/
Following
http://meego.com/about/contribution-guidelines
        Submitting Patches to MeeGo
        I am posting the patch again to meego-dev.
        Original post:
        V2: http://marc.info/?t=128991957800001&r=1&w=2&n=2
        V1: http://marc.info/?l=meego-packaging&m=128986623002881&w=2
Not really sure who the project maintainer is given multiple folks who have
pushed changes there

I have also requested a gitorious merge request here:
http://meego.gitorious.org/meego-os-base/image-configurations/merge_requests/6

 scripts/create.sh |  313 +++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 243 insertions(+), 70 deletions(-)

diff --git a/scripts/create.sh b/scripts/create.sh
index d7cfdbe..34fefdc 100755
--- a/scripts/create.sh
+++ b/scripts/create.sh
@@ -1,88 +1,261 @@
-#!/bin/sh
+#!/bin/bash
 #
-#A simple script to batch generate all release-able images for MeeGo. 
+# A simple script to batch generate all release-able images for MeeGo.
 #
-#This script will check out all MeeGo Image Kickstart files and execute 
-#image generation based on repository type selected for all release-able 
images. 
+# This script will check out all MeeGo Image Kickstart files and execute
+# image generation based on repository type selected for all release-able
+# images.
 #
-# Written for MeeGo by Chris Ferron <[email protected]> based on 
an initial
-# effort buy Anas Nashif.
-
-
-ID=$1
-REPOTYPE=$2
-RELEASE=$3
+# Written for MeeGo by Chris Ferron <[email protected]> based on
+# an initial effort buy Anas Nashif.
+#
+# Modified by Nishanth Menon <[email protected]> for a bit more flexibility
 
-# Preparation Section
-#export http_proxy= http://XXX.XXX.XXX.XXX:XXXX/
+# Modifiable params
+# XXX: New platform build option is added here
+# Builds supported: These are organized as:
+# build_name | ks file | build options
+Build_Options=( \
+ "core-armv7l-n900|core/core-armv7l-n900.ks|-f raw --save-kernel  --arch 
armv7" \
+ "core-armv7l-madde-sysroot|SDK/core-armv7l-madde-sysroot.ks|--format=fs 
--package=tar.bz2 --run-mode=0 --arch=armv7l --save-kernel" \
+ "core-ia32-madde-sysroot.ks|SDK/core-ia32-madde-sysroot.ks|--format=fs 
--package=tar.bz2" \
+ "netboot-ia32 | netbook/netbook-ia32.ks |-f livecd" \
+ "netbook-ia32-qemu | SDK/netbook-ia32-qemu.ks | --format=raw 
--package=tar.bz2" \
+ "ivi-ia32|ivi/ivi-ia32.ks| -f livecd" \
+ "handset-ia32|handset/handset-ia32-mtf.ks| -f nand" \
+ "handset-ia32-mtf-devel|handset/handset-ia32-mtf-devel.ks|-f nand" \
+ "handset-armv7l-n900|handset/handset-armv7l-n900.ks| -f raw --save-kernel 
--arch=armv7l" \
+ "handset-armv7l-n900-devel|handset/handset-armv7l-n900-devel.ks| -f raw 
--save-kernel --arch=armv7l" \
+ "handset-ia32-pinetrail|handset/handset-ia32-pinetrail-mtf.ks| -f livecd" \
+ "handset-armv7l-qemu |SDK/handset-armv7l-qemu.ks|--format=raw 
--package=tar.bz2 --run-mode=0 --arch=armv7l --save-kernel"\
+ "handset-ia32-qemu|SDK/handset-ia32-qemu.ks| --format=raw --package=tar.bz2" \
+)
+# What releases do we support - and corresponding git branches
+Release_Name_ARRAY=( "MeeGo1.1" "Trunk" )
+Release_Branch_ARRAY=( "MeeGo1.1" "master" )
+# Repositories supported
+Repo_Name_Array=( "daily" "weekly" "preview")
 
-rm -f *.log
+usage(){
+       cat << USAGE >&2
+Error: $*
+Usage: $0 [-r release] -R repo [-i id] [-n] [-b build_name]
 
-if [ "$RELEASE" = "MeeGo1.1" ]; then
-   git checkout -f MeeGo1.1 
-elif [ "$RELEASE" = "Trunk" ]; then 
-   git checkout -f master
-else
-   git checkout -f master
-   echo "No release type given, default to Trunk. Current support is for Trunk 
and MeeGo1.1"
-fi
+Where:
+ -r release - release of MeeGo - ${Release_Name_ARRAY[*]} [Default: Trunk]
+ -R repo    - repo: ${Repo_Name_Array[*]} [Default: none]
+ -i ID     - ID of the build if you choose weekly build [Default: none]
+ -n         - Dont update git [Default: updates git to latest]
+ -f         - Stop if any mic creation failed [Default: false]
+ -b build_name - what images to build :  [Default: all - builds all]
+       $BuildNamesPrint
+       all
 
-git pull
+Example usage:
+Build a preview version of MeeGo1.1 release:
+ $0 -r MeeGo1.1 -R preview
+Build a daily version of MeeGo from Trunk:
+ $0 -r Trunk -R daily
+Choose a weekly build version:
+ $0 -r Trunk -R weekly -i 1.1.80.4.20101102.1
+Build a weekly build version for just N900 handset devel image:
+ $0 -r Trunk -R weekly -i 1.1.80.4.20101102.1 -b handset-armv7l-n900-devel
+Build a weekly build version for multiple N900 images:
+ $0 -r Trunk -R weekly -i 1.1.80.4.20101102.1 -b "handset-armv7l-n900-devel 
core-armv7l-n900"
 
-if [ "$REPOTYPE" = "1" ]; then
-  str="s/\...@build_id\@/$ID/"
-elif [ "$REPOTYPE" = "2" ]; then 
-  str="s/\...@build_id\@/preview/"
-elif [ "$REPOTYPE" = "3" ]; then 
-  str="s/\...@build_id\@/daily/" 
-else
- echo " Repository Type needs to be 1 for Weekly or 2 for Preview or 3 for 
Daily" 
- exit 1 
-fi
-
-find -name \*.ks -exec perl  -pi -e $str '{}' \;
+USAGE
+       exit 1
+}
 
 # mk_image expects at minimal, one arg- the first arg must be the path to the 
ks file.
 # all further args are passed through to 'mic create'
 # finally, a --release argument is automatically prepended.
 mk_image() {
-   local ks="$1";
-   shift
-   local name="meego-$(basename "$ks")"
-   name="${name%.ks}"
-   local dirname="$(dirname "$ks")"
-   rm -rf "${ID}/${dirname}/images/${name}"
-   mic create -c "$ks" --release="${ID}" "$@" 2>&1 | tee "${name}-${ID}.log"
-   if [ ! -d "${ID}/${dirname}/images/${name}" ]; then
-      echo "error: no ${ID}/${dirname}/images/${name} directory created"
-      return 1
-   fi
-   md5sum "${name}-${ID}.log" >> "${ID}/${dirname}/images/${name}/MANIFEST"
-   cp "${name}-${ID}.log" "$ID/${dirname}/images/${name}/"
+       local ks="$1";
+       shift
+       local name="meego-$(basename "$ks")"
+       name="${name%.ks}"
+       local dirname="$(dirname "$ks")"
+       rm -rf "${ID}/${dirname}/images/${name}"
+       mic create -c "$ks" --release="${ID}" "$@" 2>&1 | tee 
"${name}-${ID}.log"
+       if [ ! -d "${ID}/${dirname}/images/${name}" ]; then
+               echo "error: no ${ID}/${dirname}/images/${name} directory 
created"
+               return 1
+       fi
+       md5sum "${name}-${ID}.log" >> "${ID}/${dirname}/images/${name}/MANIFEST"
+       cp "${name}-${ID}.log" "$ID/${dirname}/images/${name}/"
+       return 0
 }
 
+# Defaults
+GIT_UPDATE=1
+RELEASE=Trunk
+STOP_FAIL=0
+
+BUILD_PLATFORMS=all
+idx=0
+BuildNames=""
+while [ $idx -lt ${#build_optio...@]} ]
+do
+       name=`echo "${Build_Options[$idx]}"|cut -d '|' -f1`
+       BuildNames="$BuildNames $name"
+       idx=$((idx + 1))
+done
+BuildNamesPrint=`echo $BuildNames|sed -e "s/ /\n\t/g"`
+
+# Drag the options in
+while getopts ":nfr:i:R:b:" opt; do
+       case $opt in
+       r) RELEASE=$OPTARG ;;
+       n) GIT_UPDATE=0 ;;
+       f) STOP_FAIL=1 ;;
+       i) ID=$OPTARG ;;
+       R) REPOTYPE=$OPTARG ;;
+       b) BUILD_PLATFORMS=$OPTARG ;;
+       \?)
+               usage "Invalid option: -$OPTARG"
+               exit 1
+               ;;
+       :)
+               usage "Option -$OPTARG requires an argument."
+               exit 1
+               ;;
+       esac
+done
+
+# Verify the RELEASE
+if [ ${#release_name_arr...@]} -ne ${#release_branch_arr...@]} ]; then
+       echo "OUCH! SOMEONE CORRUPTED THE ARRAYS!!! please report" >&2
+       exit 1
+fi
+idx=0
+orname=$RELEASE
+rname=`echo $RELEASE|tr 'A-Z' 'a-z'`
+RELEASE=""
+while [ $idx -lt ${#release_name_arr...@]} ]
+do
+       name=`echo "${Release_Name_ARRAY[$idx]}"|tr 'A-Z' 'a-z' `
+       if [ "$name" = "$rname" ]; then
+               RELEASE=${Release_Name_ARRAY[$idx]}
+               BRANCH=${Release_Branch_ARRAY[$idx]}
+               break;
+       fi
+       idx=$((idx + 1))
+done
+if [ -z "$RELEASE" ]; then
+       usage "Unknown Release '$orname' - supported:(${Release_Name_ARRAY[*]})"
+       exit 1
+fi
+
+# Verify Repo type
+idx=0
+orname=$REPOTYPE
+rname=`echo $REPOTYPE|tr 'A-Z' 'a-z'`
+REPOTYPE=""
+while [ $idx -lt ${#repo_name_arr...@]} ]
+do
+       name=`echo "${Repo_Name_Array[$idx]}"|tr 'A-Z' 'a-z' `
+       if [ "$name" = "$rname" ]; then
+               REPOTYPE=${Repo_Name_Array[$idx]}
+               break;
+       fi
+       idx=$((idx + 1))
+done
+if [ -z "$REPOTYPE" ]; then
+       usage "Unknown Repo '$orname' - supported:(${Repo_Name_Array[*]})"
+       exit 1
+fi
+
+# Special Check for ID if weekly build is selected
+if [ "$REPOTYPE" == "weekly"  -a -z "$ID" ]; then
+       usage "Weekly build selected without ID! please provide ID"
+       exit 1
+fi
+if [ "$REPOTYPE" != "weekly" -a -z "$ID" ]; then
+       ID="$RELEASE-$REPOTYPE"
+fi
+
+# Create the BUILDID
+str=""
+case $REPOTYPE in
+       weekly)  str="s/\...@build_id\@/$ID/";;
+       preview) str="s/\...@build_id\@/preview/";;
+       daily)   str="s/\...@build_id\@/daily/";;
+       *)
+               usage "errk.. !I should'nt be here"
+               exit 1;;
+esac
+
+# Check if we have a valid build platform
+if [ "$BUILD_PLATFORMS" = "all" ]; then
+       BUILD_PLATFORMS="$BuildNames"
+fi
+
+# Verify the build platforms before attempting builds!
+VALID_BUILD_PLATFORMS=""
+for build in $BUILD_PLATFORMS
+do
+       idx=0
+       bname=`echo $build|tr 'A-Z' 'a-z'`
+       valid=0
+       while [ $idx -lt ${#build_optio...@]} ]
+       do
+               name=`echo "${Build_Options[$idx]}"|cut -d '|' -f1`
+               lname=`echo $name|tr 'A-Z' 'a-z'`
+               if [ "$lname" = "$bname" ]; then
+                       valid=1
+                       break;
+               fi
+               idx=$((idx + 1))
+       done
+       if [ $valid -eq 1 ]; then
+               echo "$name is valid"
+               VALID_BUILD_PLATFORMS="$VALID_BUILD_PLATFORMS $name"
+       else
+               usage "Unknown build platform $build!"
+               exit 1
+       fi
+done
+
+# Time for action
+if [ $GIT_UPDATE -eq 1 ]; then
+       git checkout -f $BRANCH
+       git pull
+else
+       echo "WARNING: BUILDING WITHOUT GIT UPDATE!!!! - BEWARE OF STALE 
FILES!" >&2
+fi
+
+# Start build
+rm -f *.log
 
-#Core Image Section
-mk_image core/core-armv7l-n900.ks -f raw --save-kernel --arch armv7
-mk_image SDK/core-armv7l-madde-sysroot.ks --format=fs --package=tar.bz2 
--run-mode=0 --arch=armv7l --save-kernel
-mk_image SDK/core-ia32-madde-sysroot.ks --format=fs --package=tar.bz2
-
-#Netbook Image Section
-mk_image netbook/netbook-ia32.ks -f livecd
-mk_image SDK/netbook-ia32-qemu.ks --format=raw --package=tar.bz2
-
-#IVI Image Section
-mk_image ivi/ivi-ia32.ks -f livecd
-
-#Handset Image Section
-#mk_image handset/handset-ia32-aava-mtf.ks -f nand
-mk_image handset/handset-ia32-mtf.ks -f nand
-#mk_image handset/handset-ia32-aava-mtf-devel.ks -f nand
-mk_image handset/handset-ia32-mtf-devel.ks -f nand
-mk_image handset/handset-armv7l-n900.ks -f raw --save-kernel --arch=armv7l
-mk_image handset/handset-armv7l-n900-devel.ks -f raw --save-kernel 
--arch=armv7l
-mk_image handset/handset-ia32-pinetrail-mtf.ks -f livecd
-mk_image SDK/handset-armv7l-qemu.ks --format=raw --package=tar.bz2 
--run-mode=0 --arch=armv7l --save-kernel
-mk_image SDK/handset-ia32-qemu.ks --format=raw --package=tar.bz2
+for build in $VALID_BUILD_PLATFORMS
+do
+       idx=0
+       bname=`echo $build|tr 'A-Z' 'a-z'`
+       match=0
+       while [ $idx -lt ${#build_optio...@]} ]
+       do
+               name=`echo "${Build_Options[$idx]}"|cut -d '|' -f1`
+               lname=`echo $name|tr 'A-Z' 'a-z'`
+               if [ "$lname" = "$bname" ]; then
+                       match=1
+                       break;
+               fi
+               idx=$((idx + 1))
+       done
+       if [ $match -eq 1 ]; then
+               name=`echo "${Build_Options[$idx]}"|cut -d '|' -f1`
+               ks=`echo "${Build_Options[$idx]}"|cut -d '|' -f2`
+               options=`echo "${Build_Options[$idx]}"|cut -d '|' -f3`
+               # Lets modify the ks for this
+               sed -e "$str" -i $ks || usage "$ks: build replacement"\
+                       "failed!-please report" || exit 1
+               mk_image $ks $options
+               if [ $? -ne 0 -a "$STOP_FAIL" -eq 1 ]; then
+                       usage "build failed for $name"
+                       exit 1
+               fi
+       fi
+done
 
 exit 0
-- 
1.6.3.3

_______________________________________________
MeeGo-dev mailing list
[email protected]
http://lists.meego.com/listinfo/meego-dev

Reply via email to