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:
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:
# 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)
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
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