diff options
Diffstat (limited to 'asmack-master/build.bash')
-rwxr-xr-x | asmack-master/build.bash | 570 |
1 files changed, 570 insertions, 0 deletions
diff --git a/asmack-master/build.bash b/asmack-master/build.bash new file mode 100755 index 0000000..874f238 --- /dev/null +++ b/asmack-master/build.bash @@ -0,0 +1,570 @@ +#!/bin/bash + +svnfetch() { + REV="${3:-HEAD}" + echo "Fetching from ${1} to ${2} at revision ${REV}" + cd $SRC_DIR + if ! [ -f "${2}/.svn/entries" ]; then + mkdir "${2}" + cd "${2}" + svn co --non-interactive --trust-server-cert "${1}" -r "${REV}" "." + else + cd "${2}" + svn cleanup + svn up -r "${REV}" + fi +} + +gitfetch() { + echo "Fetching ${2} branch/commit from ${1} to ${3} via git" + cd $SRC_DIR + if ! [ -f "${3}/.git/config" ]; then + git clone "${1}" "${3}" + cd "${3}" + git checkout "${2}" + else + cd "${3}" + git fetch + git checkout "${2}" + fi + + if [ $? -ne 0 ]; then + exit + fi +} + +hgfetch() { +( + echo "Fetching ${2} branch from ${1} to ${3} via mercurial" + cd src + if [ -e "${2}/.hg" ] ; then + cd ${2} + hg pull + else + hg clone "${1}" "${2}" + fi + hg up -r ${3} +) + if [ $? -ne 0 ]; then + exit + fi +} + + +testsmackgit() { + cd $SRC_DIR + if [ -f .used-smack-git-repo ] && [ $(cat .used-smack-git-repo) != $SMACK_REPO ] ; then + echo "Used smack repository has changed!" + echo "Old: $(cat .used-smack-git-repo) New: ${SMACK_REPO}." + echo "Deleting old local copy" + rm -rf smack + fi + echo "${SMACK_REPO}" > .used-smack-git-repo +} + +fetchall() { + echo "## Step 15: fetching sources" + if $SMACK_LOCAL ; then + # always clean the local copy first + rm -rf ${SRC_DIR}/smack + mkdir ${SRC_DIR}/smack + cd $SMACK_REPO + git archive $SMACK_BRANCH | tar -x -C ${SRC_DIR}/smack + if [ $? -ne 0 ]; then + exit + fi + else + execute gitfetch "$SMACK_REPO" "$SMACK_BRANCH" "smack" + fi + + if ! $UPDATE_REMOTE ; then + echo "Won't update or fetch third party resources" + wait + return + fi + + execute svnfetch "http://svn.apache.org/repos/asf/qpid/trunk/qpid/java/management/common/src/main/" "qpid" + execute svnfetch "http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/auth/src/main/java/common/" "harmony" + execute svnfetch "https://dnsjava.svn.sourceforge.net/svnroot/dnsjava/trunk" "dnsjava" + execute gitfetch "git://kenai.com/jbosh~origin" "master" "jbosh" + # jldap doesn't compile with the latest version (missing deps?), therefore it's a fixed version for now + # execute gitfetch "git://git.openldap.org/openldap-jldap.git" "master" "novell-openldap-jldap" + wait +} + +createVersionTag() { + # Skip this step is no version tag is given + [[ -z $VERSION_TAG ]] && return + + local v + cat <<EOF > $TAG_FILE +#!/bin/bash + +# This file contains the version information of the components that +# were used to build this aSmack version + +declare -g -A COMPONENT_VERSIONS +EOF + + for d in $(ls $SRC_DIR) ; do + cd $SRC_DIR + + # Don't record the components version for static-src + for static in $(ls ${ASMACK_BASE}/static-src) ; do + # Don't record the version if it's from the static sources + [ $d == $static ] && continue + done + + if [[ -d $d/.git ]] ; then + v=$(cd $d && git rev-parse HEAD) + key=$d + COMPONENT_VERSIONS["$d"]=$v + elif [[ -d $d/.svn ]] ; then + v=$(cd $d && svn info |grep Revision |cut -f 2 -d ' ') + key=$d + COMPONENT_VERSIONS["$d"]=$v + fi + done + + if $SMACK_LOCAL ; then + cd $SMACK_REPO + v=$(git rev-parse HEAD) + COMPONENT_VERSIONS[smack]=$v + fi + + cd ${ASMACK_BASE} + v=$(git rev-parse HEAD) + COMPONENT_VERSIONS[asmack]=$v + + for i in "${!COMPONENT_VERSIONS[@]}" ; do + echo "COMPONENT_VERSIONS[$i]=${COMPONENT_VERSIONS[$i]}" >> $TAG_FILE + done +} + +copyfolder() { + cd ${ASMACK_BASE} + ( + cd "${1}" + tar -cSsp --exclude-vcs "${3}" + ) | ( + cd "${2}" + tar -xSsp + ) + wait +} + +createbuildsrc() { + echo "## Step 20: creating build/src" + cd "${ASMACK_BASE}" + rm -rf build/src + mkdir -p build/src/trunk + + execute copyfolder "src/smack/source/" "build/src/trunk" "." + execute copyfolder "src/qpid/java" "build/src/trunk" "org/apache/qpid/management/common/sasl" + execute copyfolder "src/novell-openldap-jldap" "build/src/trunk" "." + execute copyfolder "src/dnsjava" "build/src/trunk" "org" + execute copyfolder "src/harmony" "build/src/trunk" "." + execute copyfolder "src/jbosh/src/main/java" "build/src/trunk" "." + if $BUILD_JINGLE ; then + execute copyfolder "src/smack/jingle/extension/source/" "build/src/trunk" "." + fi + wait + # custom overwrites some files from smack, so this has to be done as last + copyfolder "src/custom" "build/src/trunk" "." +} + +patchsrc() { + echo "## Step 25: patch build/src" + cd ${ASMACK_BASE}/build/src/trunk/ + for PATCH in `(cd "../../../${1}" ; find -maxdepth 1 -type f)|sort` ; do + echo $PATCH + if [[ $PATCH == *.sh ]]; then + "../../../${1}/$PATCH" || exit 1 + elif [[ $PATCH == *.patch ]]; then + patch -p0 < "../../../${1}/$PATCH" || exit 1 + fi + done +} + +build() { + echo "## Step 30: compile" + buildandroid + if [ $? -ne 0 ]; then + exit 1 + fi +} + +buildandroid() { + local sdklocation + local version + local sdks + local minSdkVer=8 + + cd $ASMACK_BASE + + if [ ! -f local.properties ] ; then + echo "Could not find local.properties file" + echo "See local.properties.example" + exit 1 + fi + + sdklocation=$(grep sdk-location local.properties| cut -d= -f2) + if [ -z "$sdklocation" ] ; then + echo "Android SDK not found. Don't build android version" + exit 1 + fi + for f in ${sdklocation/\$\{user.home\}/$HOME}/platforms/* ; do + version=`basename $f` + if [[ "$version" != android-* ]] ; then + echo "$sdklocation contains no Android SDKs" + exit 1 + fi + if [[ ${version#android-} -ge $minSdkVer ]] ; then + if [ -n $BUILD_ANDROID_VERSIONS ] ; then + for build_version in $BUILD_ANDROID_VERSIONS ; do + [ ${version#android-} != $build_version ] && continue 2 + done + fi + echo "Building for ${version}" + sdks="${sdks} ${version}\n" + fi + + done + + if [ -z "${sdks}" ] ; then + echo "No SDKs of a suitable minimal API (${minSdkVer}) version found" + exit 1 + fi + + local asmack_suffix + if [[ -n ${VERSION_TAG} ]] && [[ -n ${1} ]] ; then + asmack_suffix="${1}-${VERSION_TAG}" + elif [[ -n ${VERSION_TAG} ]] ; then + asmack_suffix="-${VERSION_TAG}" + else + asmack_suffix="${1}" + fi + if ! echo -e ${sdks} \ + | xargs -I{} -n 1 $XARGS_ARGS ant \ + -Dandroid.version={} \ + -Djar.suffix="${asmack_suffix}" \ + compile-android ; then + exit 1 + fi +} + +buildcustom() { + for dir in `find patch -maxdepth 1 -mindepth 1 -type d`; do + buildsrc + patchsrc "patch" + if $BUILD_JINGLE ; then + patchsrc "jingle" + JINGLE_ARGS="-Djingle=lib/jstun.jar" + fi + patchsrc "${dir}" + local custom + custom=$(echo ${dir} | sed 's:patch/:-:') + ant -Djar.suffix="${custom}" $JINGLE_ARGS + buildandroid "${custom}" + done +} + +parseopts() { + while getopts a:b:r:t:cdhjpux OPTION "$@"; do + case $OPTION in + a) + BUILD_ANDROID_VERSIONS="${OPTARG}" + ;; + r) + SMACK_REPO="${OPTARG}" + ;; + b) + SMACK_BRANCH="${OPTARG}" + ;; + d) + set -x + XARGS_ARGS="-t" + ;; + j) + BUILD_JINGLE=true + ;; + u) + UPDATE_REMOTE=false + ;; + c) + BUILD_CUSTOM=true + ;; + p) + PARALLEL_BUILD=true + ;; + t) + VERSION_TAG="${OPTARG}" + ;; + x) + PUBLISH_RELEASE=true + ;; + h) + echo "$0 -d -c -u -j -r <repo> -b <branch>" + echo "-d: Enable debug" + echo "-j: Build jingle code" + echo "-c: Apply custom patchs from patch directory" + echo "-u: DON'T update remote third party resources" + echo "-r <repo>: Git repository (can be local or remote) for underlying smack repository" + echo "-b <branch>: Git branch used to build aSmack from underlying smack repository" + echo "-p use parallel build where possible" + echo "-t <version>: Create a new version tag. You should build aSmack before calling this" + echo "-x: Publish the release" + echo "-a <SDK Version(s)>: Build only for the given Android SDK versions" + exit + ;; + esac + done +} + +prepareRelease() { + if [[ -z ${VERSION_TAG} ]]; then + echo "Version tag is not set. Not going to prepare a release" + return + fi + + if [ -d $RELEASE_DIR ] ; then + rm -rf $RELEASE_DIR + fi + mkdir -p $RELEASE_DIR + + mv ${ASMACK_BASE}/build/*.{jar,zip} ${RELEASE_DIR}/ + cp $TAG_FILE ${RELEASE_DIR}/ + cp ${ASMACK_BASE}/CHANGELOG ${RELEASE_DIR} + + if [ -n $GPG_KEY ] ; then + find $RELEASE_DIR -maxdepth 1 -and \( -name '*.jar' -or -name '*.zip' \) -print0 \ + | xargs -n 1 -0 $XARGS_ARGS gpg --local-user $GPG_KEY --detach-sign + fi + + find $RELEASE_DIR -maxdepth 1 -and \( -name '*.jar' -or -name '*.zip' \) -print0 \ + | xargs -I{} -n 1 -0 $XARGS_ARGS sh -c 'md5sum {} > {}.md5' + + local release_readme + release_readme=${RELEASE_DIR}/README + + sed \ + -e "s/\$VERSION_TAG/${VERSION_TAG}/" \ + -e "s/\$BUILD_DATE/${BUILD_DATE}/" \ + README.asmack > $release_readme + + # Pretty print the component versions at the end of README + # Note that there is an exclamation mark at the beginning of the + # associative array to access the keys + for i in "${!COMPONENT_VERSIONS[@]}" ; do + local tabs + if [[ ${#i} -le 6 ]] ; then + tabs="\t\t" + else + tabs="\t" + fi + echo -e "${i}:${tabs}${COMPONENT_VERSIONS[$i]}" >> $release_readme + done +} + +publishRelease() { + if [[ -z ${VERSION_TAG} ]]; then + echo "Version tag is not set. Not going to prepare a release" + return + fi + + if [[ -z ${PUBLISH_RELEASE} ]]; then + echo "User doesn't want to publish this release" + return + fi + + if [[ -z $PUBLISH_HOST || -z $PUBLISH_DIR ]]; then + echo "WARNING: Not going to publish this release as either $PUBLISH_HOST or $PUBLISH_DIR is not set" + return + fi + + cd ${ASMACK_RELEASES} + cat <<EOF | sftp $PUBLISH_HOST +rm ${PUBLISH_DIR}/${VERSION_TAG}/* +mkdir ${PUBLISH_DIR}/${VERSION_TAG} +put -r $VERSION_TAG $PUBLISH_DIR +EOF +} + +islocalrepo() { + local R="^(git|ssh)" + if [[ $1 =~ $R ]]; then + return 1 + else + return 0 + fi +} + +initialize() { + echo "## Step 00: initialize" + if ! [ -d build/src/trunk ]; then + mkdir -p build/src/trunk + fi + if [ ! -d src/ ]; then + mkdir src + fi + find build \( -name '*.jar' -or -name '*.zip' \) -print0 | xargs -0 rm -f + rm -rf src/custom +} + +cleanup() { + echo "## Deleting all temporary files" + rm -rf build + rm -rf src +} + +copystaticsrc() { + cp -ur static-src/* src/ +} + +cmdExists() { + command -v $1 &> /dev/null + return $? +} + +prettyPrintSeconds() { + local ttime + if (( $1 > 59 )); then + ttime=$(printf "%dm %ds\n" $(($1/60%60)) $(($1%60)) ) + else + ttime=$(printf "%ds\n" $(($1)) ) + fi + echo "Execution took $ttime" +} + +execute() { + if [ -n "$BACKGROUND" ]; then + "$@" & + else + "$@" + fi +} + +setdefaults() { + # Default configuration, can be changed with script arguments + SMACK_REPO=git://github.com/Flowdalic/smack.git + SMACK_BRANCH=master + SMACK_LOCAL=false + UPDATE_REMOTE=true + BUILD_CUSTOM=false + BUILD_JINGLE=false + JINGLE_ARGS="" + PARALLEL_BUILD=false + VERSION_TAG="" + PUBLISH_RELEASE="" + PUBLISH_HOST="" + PUBLISH_DIR="" + BUILD_ANDROID_VERSIONS="" + + # Often used variables + ASMACK_BASE=$(pwd) + ASMACK_RELEASES=${ASMACK_BASE}/releases + SRC_DIR=${ASMACK_BASE}/src + VERSION_TAG_DIR=${ASMACK_BASE}/version-tags + STARTTIME=$(date -u "+%s") + BUILD_DATE=$(date) + # Declare an associative array that is in global scope ('-g') + declare -g -A COMPONENT_VERSIONS +} + +parseconfig() { + if [ -f ${ASMACK_BASE}/config ]; then + source ${ASMACK_BASE}/config + fi +} + +setconfig() { + if [ ${PARALLEL_BUILD} == "true" ]; then + XARGS_ARGS="${XARGS_ARGS} -P4" + BACKGROUND="true" + else + XARGS_ARGS="" + BACKGROUND="" + fi + + if islocalrepo $SMACK_REPO; then + SMACK_LOCAL=true + SMACK_REPO=`readlink -f $SMACK_REPO` + fi + + if [[ -n ${VERSION_TAG} ]]; then + if ! grep ${VERSION_TAG} CHANGELOG; then + echo "Could not find the tag in the CHANGELOG file. Please write a short summary of changes" + exit 1 + fi + if ! git diff --exit-code; then + echo "Unstaged changes found, please stages your changes" + exit 1 + fi + if ! git diff --cached --exit-code; then + echo "Staged, but uncommited changes found, please commit" + exit 1 + fi + RELEASE_DIR=${ASMACK_RELEASES}/${VERSION_TAG} + TAG_FILE=${VERSION_TAG_DIR}/${VERSION_TAG}.tag + fi +} + +printconfig() { + echo "Smack git repository $SMACK_REPO with branch $SMACK_BRANCH" + echo -e "SMACK_LOCAL:$SMACK_LOCAL\tUPDATE_REMOTE:$UPDATE_REMOTE\tBUILD_CUSTOM:$BUILD_CUSTOM\tBUILD_JINGLE:$BUILD_JINGLE" + echo -e "PARALLEL_BUILD:$PARALLEL_BUILD\tBASE:$ASMACK_BASE" +} + +checkPrerequisites() { + if [[ $BASH_VERSION < 4 ]] ; then + echo "aSmack's build.bash needs at least bash version 4" + exit 1 + fi + + if ! tar --version |grep GNU &> /dev/null ; then + echo "aSmack's build.bash needs GNU tar" + exit 1 + fi +} + +# Main + +setdefaults +parseopts $@ +checkPrerequisites +parseconfig +setconfig +printconfig +initialize +copystaticsrc +testsmackgit +fetchall +createVersionTag +createbuildsrc +patchsrc "patch" +if $BUILD_JINGLE ; then + patchsrc "jingle" + JINGLE_ARGS="-Djingle=lib/jstun.jar" +fi +build + +if $BUILD_CUSTOM ; then + buildcustom +fi + +if cmdExists advzip ; then + echo "advzip found, compressing files" + find build \( -name '*.jar' -or -name '*.zip' \) -print0 | xargs -n 1 -0 $XARGS_ARGS advzip -z4 +else + echo "Could not find the advzip command." + echo "advzip will further reduce the size of the generated jar and zip files," + echo "consider installing advzip" +fi + +prepareRelease +publishRelease + +STOPTIME=$(date -u "+%s") +RUNTIME=$(( $STOPTIME - $STARTTIME )) +prettyPrintSeconds $RUNTIME +printconfig |