8. Transfer the repo directory to the appropriate http server. The script
in upload.sh is an example of how to do this.
+=Build System Requirements=
+
+To be able to auto-build packages, you're going to need:
+
+*Linux
+*Python
+*A fully functional Android SDK with all SDK platforms and tools
+*The Android NDK
+*Ant
+*Ant Contrib Tasks (Debian package ant-contrib)
+*JavaCC (Debian package javacc)
+*A keystore for holding release keys. (Safe, secure and well backed up!)
+
+You then need to create a config.py (copy config.sample.py and follow the
+instructions) to specify the locations of some of these things.
+
=MetaData=
Information used by update.py to compile the public index comes from two
is configured to put it elsewhere, that can be specified
here, relative to the base of the checked out repo..
oldsdkloc=yes - The sdk location in the repo is in an old format
- target=<target> - Specifies a particular SDK target, when the source doesn't
+ target=<target> - Specifies a particular SDK target, when the source doesn't.
+ This is likely to cause the whole build.xml to be rewritten,
+ which is fine if it's a 'standard' android file or doesn't
+ already exist, but not a good idea if it's heavily
+ customised.
rm=<relpath> - Specifies the relative path of file to delete before the
build is done. The path is relative to the base of the
build directory - i.e. the directory that contains
replaced with the version number for the build.
insertvercode=x - If specified, the pattern 'x' in the AndroidManifest.xml is
replaced with the version code for the build.
+ update=no By default, 'android update project' is used to generate or
+ update the build.xml file. Specifying update=no bypasses
+ that.
+ initfun=yes Enables a selection of mad hacks to make com.funambol.android
+ build. Probably not useful for any other application.
Another example, using extra parameters:
sys.exit(1)
# Generate (or update) the ant build file, build.xml...
- parms = ['android','update','project','-p','.']
- parms.append('--subprojects')
- if thisbuild.has_key('target'):
- parms.append('-t')
- parms.append(thisbuild['target'])
- if subprocess.call(parms, cwd=root_dir) != 0:
- print "Failed to update project"
- sys.exit(1)
+ if (not thisbuild.has_key('update')) or thisbuild['update'] == 'yes':
+ parms = ['android','update','project','-p','.']
+ parms.append('--subprojects')
+ if thisbuild.has_key('target'):
+ parms.append('-t')
+ parms.append(thisbuild['target'])
+ if subprocess.call(parms, cwd=root_dir) != 0:
+ print "Failed to update project"
+ sys.exit(1)
# If the app has ant set up to sign the release, we need to switch
# that off, because we want the unsigned apk...
# Update the local.properties file...
locprops = os.path.join(root_dir, 'local.properties')
- f = open(locprops, 'r')
- props = f.read()
- f.close()
- # Fix old-fashioned 'sdk-location' by copying
- # from sdk.dir, if necessary...
- if (thisbuild.has_key('oldsdkloc') and
- thisbuild['oldsdkloc'] == "yes"):
- sdkloc = re.match(r".*^sdk.dir=(\S+)$.*", props,
- re.S|re.M).group(1)
- props += "\nsdk-location=" + sdkloc + "\n"
- # Add ndk location...
- props+= "\nndk.dir=" + ndk_path + "\n"
- f = open(locprops, 'w')
- f.write(props)
- f.close()
+ if os.path.exists(locprops):
+ f = open(locprops, 'r')
+ props = f.read()
+ f.close()
+ # Fix old-fashioned 'sdk-location' by copying
+ # from sdk.dir, if necessary...
+ if (thisbuild.has_key('oldsdkloc') and
+ thisbuild['oldsdkloc'] == "yes"):
+ sdkloc = re.match(r".*^sdk.dir=(\S+)$.*", props,
+ re.S|re.M).group(1)
+ props += "\nsdk-location=" + sdkloc + "\n"
+ # Add ndk location...
+ props+= "\nndk.dir=" + ndk_path + "\n"
+ f = open(locprops, 'w')
+ f.write(props)
+ f.close()
# Insert version code and number into the manifest if necessary...
if thisbuild.has_key('insertversion'):
print "Error running pre-build command"
sys.exit(1)
+ # Special case init functions for funambol...
+ if (thisbuild.has_key('initfun') and
+ thisbuild['initfun'] == "yes"):
+
+ if subprocess.call(['sed','-i','s@' +
+ '<taskdef resource="net/sf/antcontrib/antcontrib.properties" />' +
+ '@' +
+ '<taskdef resource="net/sf/antcontrib/antcontrib.properties">' +
+ '<classpath>' +
+ '<pathelement location="/usr/share/java/ant-contrib.jar"/>' +
+ '</classpath>' +
+ '</taskdef>' +
+ '@g',
+ 'build.xml'], cwd=root_dir) !=0:
+ print "Failed to amend build.xml"
+ sys.exit(1)
+
+ if subprocess.call(['sed','-i','s@' +
+ '\${user.home}/funambol/build/android/build.properties' +
+ '@' +
+ 'build.properties' +
+ '@g',
+ 'build.xml'], cwd=root_dir) !=0:
+ print "Failed to amend build.xml"
+ sys.exit(1)
+
+ buildxml = os.path.join(root_dir, 'build.xml')
+ f = open(buildxml, 'r')
+ xml = f.read()
+ f.close()
+ xmlout = ""
+ mode = 0
+ for line in xml.splitlines():
+ if mode == 0:
+ if line.find("jarsigner") != -1:
+ mode = 1
+ else:
+ xmlout += line + "\n"
+ else:
+ if line.find("/exec") != -1:
+ mode += 1
+ if mode == 3:
+ mode =0
+ f = open(buildxml, 'w')
+ f.write(xmlout)
+ f.close()
+
+ if subprocess.call(['sed','-i','s@' +
+ 'platforms/android-2.0' +
+ '@' +
+ 'platforms/android-8' +
+ '@g',
+ 'build.xml'], cwd=root_dir) !=0:
+ print "Failed to amend build.xml"
+ sys.exit(1)
+
+ shutil.copyfile(
+ os.path.join(root_dir, "build.properties.example"),
+ os.path.join(root_dir, "build.properties"))
+
+ if subprocess.call(['sed','-i','s@' +
+ 'javacchome=.*'+
+ '@' +
+ 'javacchome=' + javacc_path +
+ '@g',
+ 'build.properties'], cwd=root_dir) !=0:
+ print "Failed to amend build.properties"
+ sys.exit(1)
+
+ if subprocess.call(['sed','-i','s@' +
+ 'sdk-folder=.*'+
+ '@' +
+ 'sdk-folder=' + sdk_path +
+ '@g',
+ 'build.properties'], cwd=root_dir) !=0:
+ print "Failed to amend build.properties"
+ sys.exit(1)
+
+ if subprocess.call(['sed','-i','s@' +
+ 'android.sdk.version.*'+
+ '@' +
+ 'android.sdk.version=2.0' +
+ '@g',
+ 'build.properties'], cwd=root_dir) !=0:
+ print "Failed to amend build.properties"
+ sys.exit(1)
+
+
# Build the source tarball right before we build the release...
tarname = app['id'] + '_' + thisbuild['vercode'] + '_src'
tarball = tarfile.open(os.path.join(built_dir,
bindir = os.path.join(build_dir, thisbuild['bindir'])
else:
bindir = os.path.join(root_dir, 'bin')
- src = re.match(r".*^.*Creating (\S+) for release.*$.*", output,
+ if thisbuild.has_key('initfun') and thisbuild['initfun'] == "yes":
+ # Special case (again!) for funambol...
+ src = ("funambol-android-sync-client-" +
+ thisbuild['version'] + "-unsigned.apk")
+ else:
+ src = re.match(r".*^.*Creating (\S+) for release.*$.*", output,
re.S|re.M).group(1)
src = os.path.join(bindir, src)