#!/bin/sh # # Build everything! [ -z "$BUNDLETEMPLATE" ] && BUNDLETEMPLATE="`pwd`/tools/bundle/TEMPLATE" [ -z "$BUNDLEDIR" ] && BUNDLEDIR="ccm-ldn-aplaws/ccm-ldn-aplaws" [ -z "$BUNDLES" ] && BUNDLES="standard complete demo devel" set -e #set -v #set -x PACKAGE_ARG=0 BUILD_ARG=0 DOCS_ARG=0 NO_JAVADOC_ARG=0 export AUTO_BUILD_ROOT=/var/tmp/$USER-auto-build-root rm -rf $AUTO_BUILD_ROOT && mkdir $AUTO_BUILD_ROOT; function display_usage() { cat < block by expanding # the for each required CCM app in turn. # The actual expansion work will be done by a perl script. # However we must deal with the relation="eq,gt,ge,lt,le" as well. # This is where life gets interesting. This shell function will # use: # 1. the output of the perl script, which looks like: # ccm-core -> version="6.1.1" relation="ge" # ccm-forum -> version="1.4.2" # 2. local rpm database # to find out which RPM packages (installed in scratch RPM # database, and which have been built during the execution of # this very script) can satisfy the dependencies listed. function write_project_xml() { rm -f project.xml cat > project.xml < EOF # Here's how we deal with eq,lt,le,gt,ge relations: # # [eq]: - easiest, we look for the exact match # # [ge]: we compose the list which is made up from # installed version(s) of the required packages and the required # version. # # An example: # # Now suppose that we have following ccm-core available in our local rpm db: # ccm-core-6.1.1 # ccm-core-6.1.3 # # We now construct a list of versions: # # 6.1.1 # 6.1.3 # 6.1.2.-1 # # First two are installed ones, the last is one mentioned in Requires: # We call that one the 'tagged' version. # We append '.-1' b/c we're just about to sort numerically that list, which # will put the tagged version before the 6.1.2, if such exists. Sorting is # performed numerically with field delimiter being period (.), so the sorted # list looks like: # # 6.1.1 # 6.1.2.-1 # 6.1.3 # # We now grep this list for the tagged version (6.1.2.-1), and take the first line *below* # the match. In the case 6.1.2 was available, it will yield a match, since it will be # the first one below the tag 6.1.2.-1. However, in our example, the match is '6.1.3'. # In case there are no lines after the tagged version, dependencies can't be met. # # [le]: similar to [ge], except that the tagged version carries the .001 suffix. # We proceed with composing the list and sorting it as above, but we take the first # line *above* the tagged version. If no line exists above the tagged version, # dependencies can't be met. # # [gt,lt]: similar to [ge,le] respectively, except that we do no funky suffixes to # the tagged version. Every time we sort, we use '-u' to supress duplicate lines. # We then grep for the tagged version and take the first one below or above it, # respectively. $BUILD_HOME/tools/misc/expand-dependencies $BUILD_HOME $CCM_APP | while read app_dep do echo -n "Processing dependency: $app_dep" app_name=$(expr match "$app_dep" '\([^ ]*\) *->') app_version=$(expr match "$app_dep" '.*version="\([^"]*\)"') app_relation=$(expr match "$app_dep" '.*relation="\([^"]*\)"') if [ "$app_relation" = "" ] then app_relation=eq fi app_tagged_version="$app_version" # Mangle the tagged version case $app_relation in le) app_tagged_version="${app_version}.001";; ge) app_tagged_version="${app_version}.-1";; esac output=$(rpm $RPM_ARGS -q --queryformat '%{VERSION}\n' $app_name | grep -v 'is not installed') sortedoutput=$(echo -e "$output\n$app_tagged_version") sortedoutput=$(echo "$sortedoutput" | sort -u -n -t. -k1,1 -k2,2 -k3,3 -k4,4 -k5,5) # echo -e "output: \n$output" # echo -e "sortedoutput: \n$sortedoutput" case $app_relation in eq) match=$(echo "$output" | grep -F -x "$app_version") ;; le|lt) match=$(echo "$sortedoutput" | grep -B1 -F -x "$app_tagged_version" | head --lines=-1) ;; ge|gt) match=$(echo "$sortedoutput" | grep -A1 -F -x "$app_tagged_version" | tail --lines=+2) ;; esac if [ "$(echo "$match" | sed 's/ //g')" = "" ] then echo " ... unsatisfied!" if [ "$output" != "" ] then echo " Found only: $output, check $APPS_FILE and $CCM_APP/$CCM_APP/application.xml" else echo echo -n " Application $app_name not built at all" if echo " ${APPS} " | grep -F " ${app_name} " > /dev/null then : else echo -n ", please add it to $APPS_FILE" fi echo echo " Restart the build process with '-r $app_name'" echo fi exit 1 fi echo " ... found '$match'" echo "" >> project.xml done if [ "$?" == 1 ] then exit 1 fi cat >> project.xml << EOF2 EOF2 } # Gets svn revision for app whose tree starts in current dir. function get_svn_revision { SVN_REVISION="" revision=$(svn info . | grep -i '^last changed rev' | cut '-d ' -f4) ccm_app=$(pwd | sed 's!.*/!!') if [ -z "$revision" ]; then echo "Could not find the most recent svn revision number for $ccm_app" exit 1 fi # Woo hoo, we have revision number now! echo "Found the svn revision number for $ccm_app: $revision" SVN_REVISION=".r$revision" } # Bails out if uncommitted svn changes found in current dir function check_svn_clean { echo "Running 'svn status' in $(pwd)" svnstatus=$(svn st | grep -v '^\?') if [ -n "$svnstatus" ]; then echo "$svnstatus" echo "Uncommited changes exist. Bailing out." exit 1 fi } function check_svn_tagged { SVN_REVISION= if [ -n "$SVN_TAGGED" ]; then check_svn_clean && get_svn_revision fi export SVN_REVISION } while getopts r:qpdbvj opt; do case $opt in r) RESTART_FROM=$OPTARG;; p) PACKAGE_ARG=1;; d) DOCS_ARG=1;; b) BUILD_ARG=1;; j) export CCM_BUILD_NO_DOCS=1;; q) export CCM_DIST_NOZIPS=1;; v) set -v;; [?]) display_usage esac done if [ $PACKAGE_ARG == 1 -o $BUILD_ARG == 1 -o $DOCS_ARG == 1 ]; then DO_BUILD=0 DO_DOCS=0 DO_PACKAGE=0 if [ $PACKAGE_ARG == 1 ]; then DO_PACKAGE=1 fi if [ $DOCS_ARG == 1 ]; then DO_DOCS=1 fi if [ $BUILD_ARG == 1 ]; then DO_BUILD=1 fi else DO_BUILD=1 DO_DOCS=1 DO_PACKAGE=1 fi echo "Building apps: $DO_BUILD" echo "Building docs: $DO_DOCS" echo "Building ISOs: $DO_PACKAGE" echo "Skipping Javadoc RPMs: ${CCM_BUILD_NO_DOCS:-0}" shift $(($OPTIND-1)) APPS_FILE=$1 if [ -z $APPS_FILE ]; then display_usage fi if [ ! -e $APPS_FILE ]; then echo "$APPS_FILE doesn't exist" display_usage fi # get rid of newlines apps=$(echo $(cat $APPS_FILE)) APPS="" # First, reorder the supplied list of apps in proper dependency order app_build_order=$(grep ccm:requires */*/application.xml | sed 's!^\(ccm-[^/]*\)/.*name="\([^"]*\)".*!\2 \1!' | tsort) for app in $app_build_order do if echo " ${apps} " | grep -F " ${app} " > /dev/null then APPS="$APPS $app" fi done for app in $apps do if ! echo " ${APPS} " | grep -F " ${app} " > /dev/null then echo "Could not read $app/*/application.xml." echo "Make sure to include a copy or symbolic link of this application in the build area." exit 1 fi done BUILD_APPS="" BOOTSTRAP=1 for app in $APPS do if [ "x$RESTART_FOUND" = "x1" -o "x$RESTART_FROM" = "x$app" ]; then RESTART_FOUND=1; BOOTSTRAP=0 BUILD_APPS="$BUILD_APPS $app"; fi done if [ -z "$BUILD_APPS" ]; then BUILD_APPS=$APPS fi if [ ! -z $RESTART_FROM ] && [ -z $RESTART_FOUND ] && [ $DO_BUILD = 1 ]; then echo "$RESTART_FROM not found in app list"; display_usage fi echo "Processing apps: $apps" echo "Building apps in order: $BUILD_APPS" BUILD_HOME=`pwd` VIRTUAL_ROOT=$BUILD_HOME/root if [ -f $BUILD_HOME/rpm ] then RPM="$BUILD_HOME/rpm" else RPM="$(which rpm)" fi RPM_DB=$VIRTUAL_ROOT/rpmdb RPM_ARGS="--dbpath $RPM_DB" HOMETOPDIR="$(echo ~/rpm)" HOMERPMDIR="$HOMETOPDIR/RPMS/noarch" HOMESRPMDIR="$HOMETOPDIR/SRPMS" HOMEBUILDDIR="$HOMETOPDIR/BUILD" PATH=$VIRTUAL_ROOT/usr/bin:$PATH RUNTIME_DOCS="core/developer-guide" RUNTIME_DOCS="$RUNTIME_DOCS core/install-guide" RUNTIME_DOCS="$RUNTIME_DOCS cms/developer-guide" RUNTIME_DOCS="$RUNTIME_DOCS cms/deployment-guide" RUNTIME_DOCS="$RUNTIME_DOCS cms/admin-guide" APLAWS_DOCS="aplaws/quick-start" APLAWS_DOCS="$APLAWS_DOCS aplaws/admin-guide" APLAWS_DOCS="$APLAWS_DOCS themes" ALL_DOCS="$RUNTIME_DOCS $APLAWS_DOCS" ALL_DOCS="$ALL_DOCS aplaws/config-reference/complete" ALL_DOCS="$ALL_DOCS aplaws/config-reference/standard" ALL_DOCS="$ALL_DOCS aplaws/config-reference/demo" ALL_DOCS="$ALL_DOCS aplaws/config-reference/devel" set_application_properties() { APP=$1 if [ ! -e $APP/project.xml ]; then echo "project.xml doesn't exist"; exit 1; fi VERSION_FROM=`grep "versionFrom=\".*\"" $APP/project.xml | sed 's/.*versionFrom="\(.*\)"/\1/'` if [ -z $VERSION_FROM ]; then echo "versionFrom not found"; fi if [ ! -e $APP/$VERSION_FROM/application.xml ]; then echo "application.xml doesn't exist for $VERSION_FROM"; exit 1 fi cat $APP/$VERSION_FROM/application.xml | awk 'BEGIN { inTag = 0; } // { inTag = 0; }' > application.xml.frag APP_VERSION=`grep 'version=\"[^"]*\"' application.xml.frag | sed 's/.*version="\([^\"]*\)".*/\1/'` RELEASE=`grep 'release=\"[^"]*\"' application.xml.frag | sed 's/.*release="\([^\"]*\)".*/\1/'` if [ -n "$SVN_TAGGED" ]; then cd $APP/$APP get_svn_revision cd ../.. RELEASE="${RELEASE}${SVN_REVISION}" fi APP_NAME=`grep 'name=\"[^"]*\"' application.xml.frag | sed 's/.*name="\([^\"]*\)".*/\1/'` rm application.xml.frag } if [ $DO_BUILD = 1 -a $BOOTSTRAP = 1 ]; then echo "Starting build" rm -rf $VIRTUAL_ROOT mkdir $VIRTUAL_ROOT mkdir $VIRTUAL_ROOT/rpmdb # (20041108 Seb) # This directory must exist because 'rpm -i' of httpunit and friends will fail. # In a real world, this dir would have been already created by the packages httpunit at ali depend on. mkdir -p $VIRTUAL_ROOT/usr/share/java mkdir -p $VIRTUAL_ROOT/etc/ccm mkdir -p $VIRTUAL_ROOT/etc/profile.d mkdir -p $VIRTUAL_ROOT/usr/share/ccm-tools mkdir -p $VIRTUAL_ROOT/usr/share/doc mkdir -p $VIRTUAL_ROOT/usr/bin mkdir -p $VIRTUAL_ROOT/var/cache mkdir -p $VIRTUAL_ROOT/var/lib/ccm mkdir -p $VIRTUAL_ROOT/var/lib/ccm-devel mkdir -p $VIRTUAL_ROOT/var/log mkdir -p $VIRTUAL_ROOT/var/opt/ccm/data $RPM $RPM_ARGS --initdb cat > fake.spec < task). # It is no longer present in the ccm-devel, so the appropriate # RPM must be installed beforehand. if rpm -q ant-contrib | grep 'not installed' then echo "Please install ant-contrib RPM, the build system depends on it." exit 1 else for file in $(rpm -ql ant-contrib) do if [ -f $file ] then dir=$VIRTUAL_ROOT${file%/*} mkdir -p $dir cp -f $file $dir fi done fi export CCM_RPM_DIR=$HOMETOPDIR export CCM_RPMBUILD_FLAGS="$RPM_ARGS" export CLASSPATH="$CLASSPATH:$VIRTUAL_ROOT/usr/share/java/ccm-servlet-2.3.jar" for i in $BUILD_APPS do export CCM_APP=$i ( set -e cd $i echo "BUILDING $i in directory `pwd`" write_project_xml export CCM_APPS=$i rm -rf rollingbuild build MANIFEST MANIFEST.SKIP cd $CCM_APP check_svn_tagged cd .. if [ "x$AUTO_BUILD_COUNTER" != "x" ]; then CCM_BUILD_COUNTER=$AUTO_BUILD_COUNTER export CCM_BUILD_COUNTER fi CCM_SHARED_LIB_DIST_DIR=$VIRTUAL_ROOT/usr/share/java CCM_CONFIG_LIB_DIR=$VIRTUAL_ROOT/usr/share/java CCM_TOOLS_HOME=$VIRTUAL_ROOT/usr/share/ccm-tools CCM_SCRIPTS_HOME=$VIRTUAL_ROOT/usr/share/ccm-scripts CCM_CONFIG_HOME=$VIRTUAL_ROOT/usr/share/ccm-devel $VIRTUAL_ROOT/usr/share/ccm-scripts/bin/build.sh ) || exit $? ( set -e set_application_properties $i $RPM $RPM_ARGS --replacefiles --replacepkgs --relocate /usr=$VIRTUAL_ROOT/usr --relocate /etc=$VIRTUAL_ROOT/etc -Uvh $HOMERPMDIR/$APP_NAME-$APP_VERSION-$RELEASE.noarch.rpm ) || exit $? done for BUNDLE in $BUNDLES do ( set -e cd $BUNDLEDIR/bundles/$BUNDLE check_svn_tagged $BUNDLETEMPLATE/rollingbuild.sh ) || exit $? done fi # Documentation build if [ $DO_DOCS == 1 ]; then for DOC in $ALL_DOCS do ( set -e cd doc/$DOC make make zip ) done fi # End of package build process if [ $DO_PACKAGE == 1 ]; then # Start of packaging proces rm -rf dist mkdir dist # The distribution for runtime mkdir dist/runtime mkdir dist/runtime/RPMS mkdir dist/runtime/SRPMS mkdir dist/runtime/ZIPS mkdir dist/runtime/doc mkdir dist/bundles ( set -e BUNDLE_RADIX=`rpm -q --specfile tools/bundle/ccm-tools-bundle.spec` TOOLS_RADIX=`rpm -q --specfile tools/tools/ccm-tools.spec` DEVEL_RADIX=`rpm -q --specfile tools/devel/ccm-devel.spec` SCRIPTS_RADIX=`rpm -q --specfile tools/scripts/ccm-scripts.spec` JUNIT_RADIX=`rpm -q --specfile tools/rpms/junit/junit.spec` JUNITPERF_RADIX=`rpm -q --specfile tools/rpms/junitperf/junitperf.spec` HTTPUNIT_RADIX=`rpm -q --specfile tools/rpms/httpunit/httpunit.spec` CCM_JAVA_RADIX=`rpm -q --specfile tools/rpms/ccm-java/ccm-java.spec` SERVLET_RADIX=`rpm -q --specfile tools/rpms/servlet/servlet.spec` tools_chop=${TOOLS_RADIX%-*} TOOLS_VERSION=${tools_chop##*-} devel_chop=${DEVEL_RADIX%-*} DEVEL_VERSION=${devel_chop##*-} scripts_chop=${SCRIPTS_RADIX%-*} SCRIPTS_VERSION=${scripts_chop##*-} for radix in $BUNDLE_RADIX $TOOLS_RADIX $DEVEL_RADIX $SCRIPTS_RADIX $JUNIT_RADIX $JUNITPERF_RADIX $HTTPUNIT_RADIX $CCM_JAVA_RADIX $SERVLET_RADIX do cp ${HOMERPMDIR}/${radix}.noarch.rpm ${BUILD_HOME}/dist/runtime/RPMS if [ -f ${HOMESRPMDIR}/${radix}.src.rpm ] then cp ${HOMESRPMDIR}/${radix}.src.rpm ${BUILD_HOME}/dist/runtime/SRPMS fi done if [ "x$CCM_DIST_NOZIPS" != "x1" ]; then cp tools/tools/ccm-tools-$TOOLS_VERSION.zip $BUILD_HOME/dist/runtime/ZIPS cp tools/tools/ccm-tools-servlet-tomcat-$TOOLS_VERSION.zip $BUILD_HOME/dist/runtime/ZIPS cp tools/tools/ccm-tools-servlet-resin-$TOOLS_VERSION.zip $BUILD_HOME/dist/runtime/ZIPS cp tools/devel/ccm-devel-$DEVEL_VERSION.zip $BUILD_HOME/dist/runtime/ZIPS cp tools/scripts/ccm-scripts-$SCRIPTS_VERSION.zip $BUILD_HOME/dist/runtime/ZIPS fi ) for DOC in $RUNTIME_DOCS do ( set -e cd doc/$DOC DOC_VERSION=`grep 'Version: ' *.spec | sed -e 's/Version://' | sed -e 's/ //g'` DOC_RELEASE=`grep 'Release: ' *.spec | sed -e 's/Release://' | sed -e 's/ //g'` DOC_NAME=`grep 'Name: ' *.spec | sed -e 's/Name://' | sed -e 's/ //g'` cp $DOC_NAME-$DOC_VERSION-$DOC_RELEASE.ps $BUILD_HOME/dist/runtime/doc cp $DOC_NAME-$DOC_VERSION-$DOC_RELEASE.pdf $BUILD_HOME/dist/runtime/doc cp $DOC_NAME-$DOC_VERSION.tbz $BUILD_HOME/dist/runtime/doc cp $DOC_NAME-$DOC_VERSION.zip $BUILD_HOME/dist/runtime/doc cp -a $DOC_NAME-$DOC_VERSION $BUILD_HOME/dist/runtime/doc cp $HOMERPMDIR/$DOC_NAME-$DOC_VERSION-$DOC_RELEASE.noarch.rpm $BUILD_HOME/dist/runtime/RPMS ) done ( set -e cd dist mkisofs -r -J -v -o ccm-runtime.iso runtime/ ) # Now the per-bundle distributions for BUNDLE in $BUNDLES do mkdir -p dist/bundles/$BUNDLE/RPMS mkdir -p dist/bundles/$BUNDLE/SRPMS mkdir -p dist/bundles/$BUNDLE/ZIPS mkdir -p dist/bundles/$BUNDLE/doc for i in `cat $BUNDLEDIR/bundles/$BUNDLE/cfg/applications.cfg | grep -v '#' | grep -v '^\s*$'` do echo "$BUNDLE -> $i" APP=`ls */*/src/$i.load | sed -e 's/\/.*$//'` set_application_properties $APP # Copy binary, documentation & source RPMs cp $HOMERPMDIR/$APP_NAME-$APP_VERSION-$RELEASE.noarch.rpm $BUILD_HOME/dist/bundles/$BUNDLE/RPMS cp $HOMERPMDIR/$APP_NAME-doc-$APP_VERSION-$RELEASE.noarch.rpm $BUILD_HOME/dist/bundles/$BUNDLE/RPMS cp $HOMESRPMDIR/$APP_NAME-$APP_VERSION-$RELEASE.src.rpm $BUILD_HOME/dist/bundles/$BUNDLE/SRPMS # Copy binary ZIP if [ "x$CCM_DIST_NOZIPS" != "x1" ]; then cp $BUILD_HOME/$APP/rollingbuild/dist/zips/$APP_NAME-$APP_VERSION-$RELEASE-bin.zip $BUILD_HOME/dist/bundles/$BUNDLE/ZIPS fi done ( set -e cd $BUNDLEDIR/bundles/$BUNDLE check_svn_tagged BUNDLE_VERSION=`grep 'VERSION=' bundle.in | sed -e 's/VERSION=//'` BUNDLE_RELEASE="`grep 'RELEASE=' bundle.in | sed -e 's/RELEASE=//'`${SVN_REVISION}" cp $HOMERPMDIR/ccm-bundle-aplaws-plus-$BUNDLE-$BUNDLE_VERSION-$BUNDLE_RELEASE.noarch.rpm $BUILD_HOME/dist/bundles/$BUNDLE/RPMS cp $HOMESRPMDIR/ccm-bundle-aplaws-plus-$BUNDLE-$BUNDLE_VERSION-$BUNDLE_RELEASE.src.rpm $BUILD_HOME/dist/bundles/$BUNDLE/SRPMS ) ( set -e cd doc/aplaws/config-reference/$BUNDLE DOC_VERSION=`grep 'Version: ' *.spec | sed -e 's/Version://' | sed -e 's/ //g'` DOC_RELEASE=`grep 'Release: ' *.spec | sed -e 's/Release://' | sed -e 's/ //g'` DOC_NAME=`grep 'Name: ' *.spec | sed -e 's/Name://' | sed -e 's/ //g'` cp $DOC_NAME-$DOC_VERSION-$DOC_RELEASE.ps $BUILD_HOME/dist/bundles/$BUNDLE/doc cp $DOC_NAME-$DOC_VERSION-$DOC_RELEASE.pdf $BUILD_HOME/dist/bundles/$BUNDLE/doc cp $DOC_NAME-$DOC_VERSION.tbz $BUILD_HOME/dist/bundles/$BUNDLE/doc cp $DOC_NAME-$DOC_VERSION.zip $BUILD_HOME/dist/bundles/$BUNDLE/doc cp -a $DOC_NAME-$DOC_VERSION $BUILD_HOME/dist/bundles/$BUNDLE/doc cp $HOMERPMDIR/$DOC_NAME-$DOC_VERSION-$DOC_RELEASE.noarch.rpm $BUILD_HOME/dist/bundles/$BUNDLE/RPMS ) echo "APLAWS $APLAWS_DOCS" for DOC in $APLAWS_DOCS do ( set -e cd doc/$DOC DOC_VERSION=`grep 'Version: ' *.spec | sed -e 's/Version://' | sed -e 's/ //g'` DOC_RELEASE=`grep 'Release: ' *.spec | sed -e 's/Release://' | sed -e 's/ //g'` DOC_NAME=`grep 'Name: ' *.spec | sed -e 's/Name://' | sed -e 's/ //g'` cp $DOC_NAME-$DOC_VERSION-$DOC_RELEASE.ps $BUILD_HOME/dist/bundles/$BUNDLE/doc cp $DOC_NAME-$DOC_VERSION-$DOC_RELEASE.pdf $BUILD_HOME/dist/bundles/$BUNDLE/doc cp $DOC_NAME-$DOC_VERSION.tbz $BUILD_HOME/dist/bundles/$BUNDLE/doc cp $DOC_NAME-$DOC_VERSION.zip $BUILD_HOME/dist/bundles/$BUNDLE/doc cp -a $DOC_NAME-$DOC_VERSION $BUILD_HOME/dist/bundles/$BUNDLE/doc cp $HOMERPMDIR/$DOC_NAME-$DOC_VERSION-$DOC_RELEASE.noarch.rpm $BUILD_HOME/dist/bundles/$BUNDLE/RPMS ) done ( cd dist/bundles mkisofs -r -J -v -o ccm-aplaws-$BUNDLE.iso $BUNDLE ) done fi # End of packaging