From 8525782c7afb3f805a110533327e9eef278a3ecd Mon Sep 17 00:00:00 2001 From: Ciaran Gultnieks Date: Sun, 9 Jan 2011 15:52:00 +0000 Subject: [PATCH] Lots of mad hacks to make com.funambol.android auto-build --- README | 27 ++++++++- build.py | 143 +++++++++++++++++++++++++++++++++++++++-------- config.sample.py | 5 +- 3 files changed, 149 insertions(+), 26 deletions(-) diff --git a/README b/README index b3b99722..48ef06f1 100644 --- a/README +++ b/README @@ -15,6 +15,22 @@ 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 @@ -111,7 +127,11 @@ configuration to the build. These are: 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= - Specifies a particular SDK target, when the source doesn't + 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= - 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 @@ -122,6 +142,11 @@ configuration to the build. These are: 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: diff --git a/build.py b/build.py index 9ae276ba..417229c5 100644 --- a/build.py +++ b/build.py @@ -167,14 +167,15 @@ for app in apps: 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... @@ -186,21 +187,22 @@ for app in apps: # 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'): @@ -227,6 +229,94 @@ for app in apps: 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@' + + '' + + '@' + + '' + + '' + + '' + + '' + + '' + + '@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, @@ -252,7 +342,12 @@ for app in apps: 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) diff --git a/config.sample.py b/config.sample.py index ac6b2b09..7bd574c6 100644 --- a/config.sample.py +++ b/config.sample.py @@ -3,9 +3,12 @@ #your system configuration. aapt_path = "/path/to/android-sdk-linux_86/platforms/android-4/tools/aapt" - +sdk_path = "/path/to/android-sdk-linux_86" ndk_path = "/path/to/android-ndk-r5" +#You probably don't need to change this... +javacc_path = "/usr/share/java" + repo_url = "http://f-droid.org/repo" repo_name = "FDroid" repo_icon = "fdroid-icon.png"