blob: d2912204b51ba995f2c394e29d8ea54665b141c3 [file] [log] [blame]
Shuyi Chen8f4ce9e2013-05-22 13:10:40 -07001#!/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"
Shuyi Chend7955ce2013-05-22 14:51:55 -0700545
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
Shuyi Chen8f4ce9e2013-05-22 13:10:40 -0700555if $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