• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2
3svnfetch() {
4    REV="${3:-HEAD}"
5    echo "Fetching from ${1} to ${2} at revision ${REV}"
6    cd $SRC_DIR
7    if ! [ -f "${2}/.svn/entries" ]; then
8	mkdir "${2}"
9	cd "${2}"
10	svn co --non-interactive --trust-server-cert "${1}" -r "${REV}" "."
11    else
12	cd "${2}"
13	svn cleanup
14	svn up -r "${REV}"
15    fi
16}
17
18gitfetch() {
19    echo "Fetching ${2} branch/commit from ${1} to ${3} via git"
20    cd $SRC_DIR
21    if ! [ -f "${3}/.git/config" ]; then
22	git clone "${1}" "${3}"
23	cd "${3}"
24	git checkout "${2}"
25    else
26	cd "${3}"
27	git fetch
28	git checkout "${2}"
29    fi
30
31    if [ $? -ne 0 ]; then
32	exit
33    fi
34}
35
36hgfetch() {
37(
38  echo "Fetching ${2} branch from ${1} to ${3} via mercurial"
39  cd src
40  if [ -e "${2}/.hg" ] ; then
41      cd ${2}
42      hg pull
43  else
44      hg clone "${1}" "${2}"
45  fi
46  hg up -r ${3}
47)
48    if [ $? -ne 0 ]; then
49	exit
50    fi
51}
52
53
54testsmackgit() {
55    cd $SRC_DIR
56    if [ -f .used-smack-git-repo ] && [ $(cat .used-smack-git-repo) != $SMACK_REPO ] ; then
57	    echo "Used smack repository has changed!"
58	    echo "Old: $(cat .used-smack-git-repo) New: ${SMACK_REPO}."
59	    echo "Deleting old local copy"
60	    rm -rf smack
61    fi
62    echo "${SMACK_REPO}" > .used-smack-git-repo
63}
64
65fetchall() {
66    echo "## Step 15: fetching sources"
67    if $SMACK_LOCAL ; then
68	# always clean the local copy first
69	rm -rf ${SRC_DIR}/smack
70	mkdir ${SRC_DIR}/smack
71	cd $SMACK_REPO
72	git archive $SMACK_BRANCH | tar -x -C ${SRC_DIR}/smack
73	if [ $? -ne 0 ]; then
74	    exit
75	fi
76    else
77	execute gitfetch "$SMACK_REPO" "$SMACK_BRANCH" "smack"
78    fi
79
80    if ! $UPDATE_REMOTE ; then
81	echo "Won't update or fetch third party resources"
82	wait
83	return
84    fi
85
86    execute svnfetch "http://svn.apache.org/repos/asf/qpid/trunk/qpid/java/management/common/src/main/" "qpid"
87    execute svnfetch "http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/auth/src/main/java/common/" "harmony"
88    execute svnfetch "https://dnsjava.svn.sourceforge.net/svnroot/dnsjava/trunk" "dnsjava"
89    execute gitfetch "git://kenai.com/jbosh~origin" "master" "jbosh"
90    # jldap doesn't compile with the latest version (missing deps?), therefore it's a fixed version for now
91    #  execute gitfetch "git://git.openldap.org/openldap-jldap.git" "master" "novell-openldap-jldap"
92    wait
93}
94
95createVersionTag() {
96    # Skip this step is no version tag is given
97    [[ -z $VERSION_TAG ]] && return
98
99    local v
100    cat <<EOF  > $TAG_FILE
101#!/bin/bash
102
103# This file contains the version information of the components that
104# were used to build this aSmack version
105
106declare -g -A COMPONENT_VERSIONS
107EOF
108
109    for d in $(ls $SRC_DIR) ; do
110	cd $SRC_DIR
111
112	# Don't record the components version for static-src
113	for static in $(ls ${ASMACK_BASE}/static-src) ; do
114	    # Don't record the version if it's from the static sources
115	    [ $d == $static ] && continue
116	done
117
118	if [[ -d $d/.git ]] ; then
119	    v=$(cd $d && git rev-parse HEAD)
120	    key=$d
121	    COMPONENT_VERSIONS["$d"]=$v
122	elif [[ -d $d/.svn ]] ; then
123	    v=$(cd $d && svn info |grep Revision |cut -f 2 -d ' ')
124	    key=$d
125	    COMPONENT_VERSIONS["$d"]=$v
126	fi
127    done
128
129    if $SMACK_LOCAL ; then
130	cd $SMACK_REPO
131	v=$(git rev-parse HEAD)
132	COMPONENT_VERSIONS[smack]=$v
133    fi
134
135    cd ${ASMACK_BASE}
136    v=$(git rev-parse HEAD)
137    COMPONENT_VERSIONS[asmack]=$v
138
139    for i in "${!COMPONENT_VERSIONS[@]}" ; do
140	echo "COMPONENT_VERSIONS[$i]=${COMPONENT_VERSIONS[$i]}" >> $TAG_FILE
141    done
142}
143
144copyfolder() {
145  cd ${ASMACK_BASE}
146  (
147    cd "${1}"
148    tar -cSsp --exclude-vcs "${3}"
149  ) | (
150    cd "${2}"
151    tar -xSsp
152  )
153  wait
154}
155
156createbuildsrc() {
157  echo "## Step 20: creating build/src"
158  cd "${ASMACK_BASE}"
159  rm -rf build/src
160  mkdir -p build/src/trunk
161
162  execute copyfolder "src/smack/source/" "build/src/trunk" "."
163  execute copyfolder "src/qpid/java" "build/src/trunk" "org/apache/qpid/management/common/sasl"
164  execute copyfolder "src/novell-openldap-jldap" "build/src/trunk" "."
165  execute copyfolder "src/dnsjava"  "build/src/trunk" "org"
166  execute copyfolder "src/harmony" "build/src/trunk" "."
167  execute copyfolder "src/jbosh/src/main/java" "build/src/trunk" "."
168  if $BUILD_JINGLE ; then
169    execute copyfolder "src/smack/jingle/extension/source/" "build/src/trunk" "."
170  fi
171  wait
172  # custom overwrites some files from smack, so this has to be done as last
173  copyfolder "src/custom" "build/src/trunk" "."
174}
175
176patchsrc() {
177    echo "## Step 25: patch build/src"
178    cd ${ASMACK_BASE}/build/src/trunk/
179    for PATCH in `(cd "../../../${1}" ; find -maxdepth 1 -type f)|sort` ; do
180	echo $PATCH
181	if [[ $PATCH == *.sh ]]; then
182	    "../../../${1}/$PATCH" || exit 1
183	elif [[ $PATCH == *.patch ]]; then
184	    patch -p0 < "../../../${1}/$PATCH" || exit 1
185	fi
186    done
187}
188
189build() {
190  echo "## Step 30: compile"
191  buildandroid
192  if [ $? -ne 0 ]; then
193      exit 1
194  fi
195}
196
197buildandroid() {
198    local sdklocation
199    local version
200    local sdks
201    local minSdkVer=8
202
203    cd $ASMACK_BASE
204
205    if [ ! -f local.properties ] ; then
206	echo "Could not find local.properties file"
207	echo "See local.properties.example"
208	exit 1
209    fi
210
211    sdklocation=$(grep sdk-location local.properties| cut -d= -f2)
212    if [ -z "$sdklocation" ] ; then
213	echo "Android SDK not found. Don't build android version"
214	exit 1
215    fi
216    for f in ${sdklocation/\$\{user.home\}/$HOME}/platforms/* ; do
217	version=`basename $f`
218	if [[ "$version" != android-* ]] ; then
219	    echo "$sdklocation contains no Android SDKs"
220	    exit 1
221	fi
222	if [[ ${version#android-} -ge $minSdkVer ]] ; then
223	    if [ -n $BUILD_ANDROID_VERSIONS ] ; then
224		for build_version in $BUILD_ANDROID_VERSIONS ; do
225		    [ ${version#android-} != $build_version ] && continue 2
226		done
227	    fi
228	    echo "Building for ${version}"
229	    sdks="${sdks} ${version}\n"
230	fi
231
232    done
233
234    if [ -z "${sdks}" ] ; then
235	echo "No SDKs of a suitable minimal API (${minSdkVer}) version found"
236	exit 1
237    fi
238
239    local asmack_suffix
240    if [[ -n ${VERSION_TAG} ]] && [[ -n ${1} ]] ; then
241	asmack_suffix="${1}-${VERSION_TAG}"
242    elif [[ -n ${VERSION_TAG} ]] ; then
243	asmack_suffix="-${VERSION_TAG}"
244    else
245	asmack_suffix="${1}"
246    fi
247    if ! echo -e ${sdks} \
248	| xargs -I{} -n 1 $XARGS_ARGS ant \
249		-Dandroid.version={} \
250		-Djar.suffix="${asmack_suffix}" \
251		compile-android ; then
252	exit 1
253    fi
254}
255
256buildcustom() {
257  for dir in `find patch -maxdepth 1 -mindepth 1 -type d`; do
258    buildsrc
259    patchsrc "patch"
260    if $BUILD_JINGLE ; then
261      patchsrc "jingle"
262      JINGLE_ARGS="-Djingle=lib/jstun.jar"
263    fi
264    patchsrc "${dir}"
265    local custom
266    custom=$(echo ${dir} | sed 's:patch/:-:')
267    ant -Djar.suffix="${custom}" $JINGLE_ARGS
268    buildandroid "${custom}"
269  done
270}
271
272parseopts() {
273    while getopts a:b:r:t:cdhjpux OPTION "$@"; do
274	case $OPTION in
275	    a)
276		BUILD_ANDROID_VERSIONS="${OPTARG}"
277		;;
278	    r)
279		SMACK_REPO="${OPTARG}"
280		;;
281	    b)
282		SMACK_BRANCH="${OPTARG}"
283		;;
284	    d)
285		set -x
286		XARGS_ARGS="-t"
287		;;
288	    j)
289		BUILD_JINGLE=true
290		;;
291	    u)
292		UPDATE_REMOTE=false
293		;;
294	    c)
295		BUILD_CUSTOM=true
296		;;
297	    p)
298		PARALLEL_BUILD=true
299		;;
300	    t)
301		VERSION_TAG="${OPTARG}"
302		;;
303	    x)
304		PUBLISH_RELEASE=true
305		;;
306	    h)
307		echo "$0 -d -c -u -j -r <repo> -b <branch>"
308		echo "-d: Enable debug"
309		echo "-j: Build jingle code"
310		echo "-c: Apply custom patchs from patch directory"
311		echo "-u: DON'T update remote third party resources"
312		echo "-r <repo>: Git repository (can be local or remote) for underlying smack repository"
313		echo "-b <branch>: Git branch used to build aSmack from underlying smack repository"
314		echo "-p use parallel build where possible"
315		echo "-t <version>: Create a new version tag. You should build aSmack before calling this"
316		echo "-x: Publish the release"
317		echo "-a <SDK Version(s)>: Build only for the given Android SDK versions"
318		exit
319		;;
320	esac
321    done
322}
323
324prepareRelease() {
325    if [[ -z ${VERSION_TAG} ]]; then
326	echo "Version tag is not set. Not going to prepare a release"
327	return
328    fi
329
330    if [ -d $RELEASE_DIR ] ; then
331	rm -rf $RELEASE_DIR
332    fi
333    mkdir -p $RELEASE_DIR
334
335    mv ${ASMACK_BASE}/build/*.{jar,zip} ${RELEASE_DIR}/
336    cp $TAG_FILE ${RELEASE_DIR}/
337    cp ${ASMACK_BASE}/CHANGELOG ${RELEASE_DIR}
338
339    if [ -n $GPG_KEY ] ; then
340	find $RELEASE_DIR -maxdepth 1 -and \( -name '*.jar' -or -name '*.zip' \) -print0 \
341	    | xargs -n 1 -0 $XARGS_ARGS gpg --local-user $GPG_KEY --detach-sign
342    fi
343
344    find $RELEASE_DIR -maxdepth 1 -and \( -name '*.jar' -or -name '*.zip' \) -print0 \
345	| xargs -I{} -n 1 -0 $XARGS_ARGS sh -c 'md5sum {} > {}.md5'
346
347    local release_readme
348    release_readme=${RELEASE_DIR}/README
349
350    sed \
351	-e "s/\$VERSION_TAG/${VERSION_TAG}/" \
352	-e "s/\$BUILD_DATE/${BUILD_DATE}/" \
353	README.asmack > $release_readme
354
355    # Pretty print the component versions at the end of README
356    # Note that there is an exclamation mark at the beginning of the
357    # associative array to access the keys
358    for i in "${!COMPONENT_VERSIONS[@]}" ; do
359	local tabs
360	if [[ ${#i} -le 6 ]] ; then
361	    tabs="\t\t"
362	else
363	    tabs="\t"
364	fi
365	echo -e "${i}:${tabs}${COMPONENT_VERSIONS[$i]}" >> $release_readme
366    done
367}
368
369publishRelease() {
370    if [[ -z ${VERSION_TAG} ]]; then
371	echo "Version tag is not set. Not going to prepare a release"
372	return
373    fi
374
375    if [[ -z ${PUBLISH_RELEASE} ]]; then
376	echo "User doesn't want to publish this release"
377	return
378    fi
379
380    if [[ -z $PUBLISH_HOST || -z $PUBLISH_DIR ]]; then
381	echo "WARNING: Not going to publish this release as either $PUBLISH_HOST or $PUBLISH_DIR is not set"
382	return
383    fi
384
385    cd ${ASMACK_RELEASES}
386    cat <<EOF | sftp $PUBLISH_HOST
387rm ${PUBLISH_DIR}/${VERSION_TAG}/*
388mkdir ${PUBLISH_DIR}/${VERSION_TAG}
389put -r $VERSION_TAG $PUBLISH_DIR
390EOF
391}
392
393islocalrepo() {
394    local R="^(git|ssh)"
395    if [[ $1 =~ $R ]]; then
396	return 1
397    else
398	return 0
399    fi
400}
401
402initialize() {
403    echo "## Step 00: initialize"
404    if ! [ -d build/src/trunk ]; then
405	mkdir -p build/src/trunk
406    fi
407    if [ ! -d src/ ]; then
408	mkdir src
409    fi
410    find build \( -name '*.jar' -or -name '*.zip' \) -print0 | xargs -0 rm -f
411    rm -rf src/custom
412}
413
414cleanup() {
415    echo "## Deleting all temporary files"
416    rm -rf build
417    rm -rf src
418}
419
420copystaticsrc() {
421    cp -ur static-src/* src/
422}
423
424cmdExists() {
425    command -v $1 &> /dev/null
426    return $?
427}
428
429prettyPrintSeconds() {
430    local ttime
431    if (( $1 > 59 )); then
432	ttime=$(printf "%dm %ds\n" $(($1/60%60)) $(($1%60)) )
433    else
434	ttime=$(printf "%ds\n" $(($1)) )
435    fi
436    echo "Execution took $ttime"
437}
438
439execute() {
440    if [ -n "$BACKGROUND" ]; then
441	"$@" &
442    else
443	"$@"
444    fi
445}
446
447setdefaults() {
448    # Default configuration, can be changed with script arguments
449    SMACK_REPO=git://github.com/Flowdalic/smack.git
450    SMACK_BRANCH=master
451    SMACK_LOCAL=false
452    UPDATE_REMOTE=true
453    BUILD_CUSTOM=false
454    BUILD_JINGLE=false
455    JINGLE_ARGS=""
456    PARALLEL_BUILD=false
457    VERSION_TAG=""
458    PUBLISH_RELEASE=""
459    PUBLISH_HOST=""
460    PUBLISH_DIR=""
461    BUILD_ANDROID_VERSIONS=""
462
463    # Often used variables
464    ASMACK_BASE=$(pwd)
465    ASMACK_RELEASES=${ASMACK_BASE}/releases
466    SRC_DIR=${ASMACK_BASE}/src
467    VERSION_TAG_DIR=${ASMACK_BASE}/version-tags
468    STARTTIME=$(date -u "+%s")
469    BUILD_DATE=$(date)
470    # Declare an associative array that is in global scope ('-g')
471    declare -g -A COMPONENT_VERSIONS
472}
473
474parseconfig() {
475    if [ -f ${ASMACK_BASE}/config ]; then
476	source ${ASMACK_BASE}/config
477    fi
478}
479
480setconfig() {
481    if [ ${PARALLEL_BUILD} == "true" ]; then
482	XARGS_ARGS="${XARGS_ARGS} -P4"
483	BACKGROUND="true"
484    else
485	XARGS_ARGS=""
486	BACKGROUND=""
487    fi
488
489    if islocalrepo $SMACK_REPO; then
490	SMACK_LOCAL=true
491	SMACK_REPO=`readlink -f $SMACK_REPO`
492    fi
493
494    if [[ -n ${VERSION_TAG} ]]; then
495	if ! grep ${VERSION_TAG} CHANGELOG; then
496	    echo "Could not find the tag in the CHANGELOG file. Please write a short summary of changes"
497	    exit 1
498	fi
499	if ! git diff --exit-code; then
500	    echo "Unstaged changes found, please stages your changes"
501	    exit 1
502	fi
503	if ! git diff --cached --exit-code; then
504	    echo "Staged, but uncommited changes found, please commit"
505	    exit 1
506	fi
507	RELEASE_DIR=${ASMACK_RELEASES}/${VERSION_TAG}
508	TAG_FILE=${VERSION_TAG_DIR}/${VERSION_TAG}.tag
509    fi
510}
511
512printconfig() {
513    echo "Smack git repository $SMACK_REPO with branch $SMACK_BRANCH"
514    echo -e "SMACK_LOCAL:$SMACK_LOCAL\tUPDATE_REMOTE:$UPDATE_REMOTE\tBUILD_CUSTOM:$BUILD_CUSTOM\tBUILD_JINGLE:$BUILD_JINGLE"
515    echo -e "PARALLEL_BUILD:$PARALLEL_BUILD\tBASE:$ASMACK_BASE"
516}
517
518checkPrerequisites() {
519    if [[ $BASH_VERSION < 4 ]] ; then
520	echo "aSmack's build.bash needs at least bash version 4"
521	exit 1
522    fi
523
524    if ! tar --version |grep GNU &> /dev/null ; then
525	echo "aSmack's build.bash needs GNU tar"
526	exit 1
527    fi
528}
529
530# Main
531
532setdefaults
533parseopts $@
534checkPrerequisites
535parseconfig
536setconfig
537printconfig
538initialize
539copystaticsrc
540testsmackgit
541fetchall
542createVersionTag
543createbuildsrc
544patchsrc "patch"
545
546##
547## BEGIN Modification for android platform build system
548##
549echo done with android modifications
550exit
551##
552## END Modification for android platform build system
553##
554
555if $BUILD_JINGLE ; then
556  patchsrc "jingle"
557  JINGLE_ARGS="-Djingle=lib/jstun.jar"
558fi
559build
560
561if $BUILD_CUSTOM ; then
562    buildcustom
563fi
564
565if cmdExists advzip ; then
566  echo "advzip found, compressing files"
567  find build \( -name '*.jar' -or -name '*.zip' \) -print0 | xargs -n 1 -0 $XARGS_ARGS advzip -z4
568else
569  echo "Could not find the advzip command."
570  echo "advzip will further reduce the size of the generated jar and zip files,"
571  echo "consider installing advzip"
572fi
573
574prepareRelease
575publishRelease
576
577STOPTIME=$(date -u "+%s")
578RUNTIME=$(( $STOPTIME - $STARTTIME ))
579prettyPrintSeconds $RUNTIME
580printconfig
581