chiark / gitweb /
Support for source libraries
authorCiaran Gultnieks <ciaran@ciarang.com>
Sat, 28 Jan 2012 00:05:30 +0000 (00:05 +0000)
committerCiaran Gultnieks <ciaran@ciarang.com>
Sat, 28 Jan 2012 00:05:30 +0000 (00:05 +0000)
README
build.py
build/extlib/.gitignore
common.py

diff --git a/README b/README
index e3824d51733e70f65c96667327262cc9b326afe9..33e27942e15fa166b5b0832d2946336dfb7acdf4 100644 (file)
--- a/README
+++ b/README
@@ -204,6 +204,16 @@ configuration to the build. These are:
                    files within a directory below the metadata, with the same
                    name as the metadata file but without the extension. Each of
                    these patches is applied to the code in turn.
+ extlibs=a;b;c     Specifies a list of external libraries (jar files) from the
+                   build/extlib library, which will be placed in the libs
+                  directory of the project. Separate items with semicolons.
+ srclibs=a@r;b@r1  Specifies a list of source libraries (kept up to date using
+                   version control) from a predefined set. Separate items with
+                  semicolons, and each item is of the form name@rev where name
+                  is the predefined source library name and rev is the
+                  revision in source control to use. You can then also use
+                  $$name$$ in the prebuild command to substitute the relative
+                  path to the library directory.
 
 Another example, using extra parameters:
 
index 9588b1bfa79f13540ecb35f209f85e9ae69b1fa7..f084a80b622b86b31317f1621de43575b7e08131 100755 (executable)
--- a/build.py
+++ b/build.py
@@ -78,16 +78,6 @@ if not os.path.isdir(build_dir):
     os.makedirs(build_dir)
 extlib_dir = os.path.join(build_dir, 'extlib')
 
-# Update extlib directory...
-if False:  # Don't need this yet!
-    greendroid_dir = os.path.join(extlib_dir, 'GreenDroid')
-    greendroid_vcs = common.getvcs('git',
-            'https://github.com/cyrilmottier/GreenDroid.git', greendroid_dir)
-    greendroid_vcs.gotorevision('5f92227c959d51e1d7220199135c2c239eabd4d2')
-    subprocess.call(['android', 'update', 'project', '-p',
-        os.path.join(greendroid_dir, 'GreenDroid')])
-
-
 # Build applications...
 for app in apps:
 
@@ -290,7 +280,7 @@ for app in apps:
 
                     # Move the source tarball into the output directory...
                     if output_dir != tmp_dir:
-                        shutil.movefile(os.path.join(tmp_dir, tarname + '.tar.gz'),
+                        shutil.move(os.path.join(tmp_dir, tarname + '.tar.gz'),
                             os.path.join(output_dir, tarname + '.tar.gz'))
 
                     build_succeeded.append(app)
index 396c9aa4d71e367e7e2eaf4f11dadaa191175eef..c18d20da0f84ae48a73dee237b09d0a3b868b402 100644 (file)
@@ -1,2 +1,3 @@
 !*/
 GreenDroid/
+ActionBarSherlock/
index 76ab74ca5ed275115a85880e36e23101273ca8f5..3b0929c2642476e8cd47dbf71b470937cd564ef4 100644 (file)
--- a/common.py
+++ b/common.py
@@ -540,6 +540,32 @@ class MetaDataException(Exception):
         return repr(self.value)
 
 
+# Get the specified source library.
+# Returns the path to it.
+def getsrclib(spec, extlib_dir):
+    name, ref = spec.split('@')
+
+    if name == 'GreenDroid':
+        sdir = os.path.join(extlib_dir, 'GreenDroid')
+        vcs = getvcs('git',
+            'https://github.com/cyrilmottier/GreenDroid.git', sdir)
+        vcs.gotorevision(ref)
+        return os.path.join(sdir, 'GreenDroid')
+
+    if name == 'ActionBarSherlock':
+        sdir = os.path.join(extlib_dir, 'ActionBarSherlock')
+        vcs = getvcs('git',
+            'https://github.com/JakeWharton/ActionBarSherlock.git', sdir)
+        vcs.gotorevision(ref)
+        libdir = os.path.join(sdir, 'library')
+        if subprocess.call(['android', 'update', 'project', '-p',
+            libdir]) != 0:
+            raise BuildException('Error updating ActionBarSherlock project')
+        return libdir
+
+    raise BuildException('Unknown srclib ' + name)
+
+
 # Prepare the source code for a particular build
 #  'vcs'         - the appropriate vcs object for the application
 #  'app'         - the application details from the metadata
@@ -696,16 +722,26 @@ def prepare_source(vcs, app, build, build_dir, extlib_dir, sdk_path, ndk_path, j
         libsdir = os.path.join(root_dir, 'libs')
         if not os.path.exists(libsdir):
             os.mkdir(libsdir)
-        libs = build['extlibs'].split(';')
-        for lib in libs:
+        for lib in build['extlibs'].split(';'):
             libf = os.path.basename(lib)
             shutil.copyfile(os.path.join(extlib_dir, lib),
                     os.path.join(libsdir, libf))
 
+    # Get required source libraries...
+    srclibpaths = []
+    if build.has_key('srclibs'):
+        for lib in build['srclibs'].split(';'):
+            name, _ = lib.split('@')
+            srclibpaths.append((name, getsrclib(lib, extlib_dir)))
+
     # Run a pre-build command if one is required...
     if build.has_key('prebuild'):
-        if subprocess.call(build['prebuild'],
-                cwd=root_dir, shell=True) != 0:
+        prebuild = build['prebuild']
+        # Substitute source library paths into prebuild commands...
+        for name, libpath in srclibpaths:
+            libpath = os.path.relpath(libpath, root_dir)
+            prebuild = prebuild.replace('$$' + name + '$$', libpath)
+        if subprocess.call(prebuild, cwd=root_dir, shell=True) != 0:
             raise BuildException("Error running pre-build command")
 
     # Apply patches if any