chiark / gitweb /
Lots of mad hacks to make com.funambol.android auto-build
authorCiaran Gultnieks <ciaran@ciarang.com>
Sun, 9 Jan 2011 15:52:00 +0000 (15:52 +0000)
committerCiaran Gultnieks <ciaran@ciarang.com>
Sun, 9 Jan 2011 15:52:00 +0000 (15:52 +0000)
README
build.py
config.sample.py

diff --git a/README b/README
index b3b997221fb3995a5691cd6138454f6b24d4fd83..48ef06f13f0ceb820337ef59794b020c60d174d2 100644 (file)
--- a/README
+++ b/README
 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=<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
@@ -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:
 
index 9ae276babe3effbdfdfd33fd18c529f7ca09a6c9..417229c5dfa105d683a8836670896b96d7911112 100644 (file)
--- 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@' +
+                            '<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,
@@ -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)
 
index ac6b2b090bb94befca304ab07b9c8471b84c2c3d..7bd574c6e94461bcd973ec9faa54326ebdd64ba4 100644 (file)
@@ -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"