line with the next. It has no special meaning in other contexts; in
particular, literal backslashes should not be escaped.
+Note that nothing should be build during this prebuild phase - scanning
+of the code and building of the source tarball, for example, take place
+after this. For custom actions that actually build things, use 'build'
+instead.
+
You can use $$name$$ to substitute the path to a referenced srclib - see
the @code{srclib} directory for details of this.
You can use $$SDK$$, $$NDK$$ and $$MVN3$$ to substitute the paths to the
android SDK and NDK directories, and maven 3 executable respectively.
+@item build=xxxx
+As for 'prebuild', but runs during the actual build phase (but before the
+main ant/maven build). Use this only for actions that do actual building.
+Any prepartion of the source code should be done using 'init' or 'prebuild'.
+
+You can use $$SDK$$, $$NDK$$ and $$MVN3$$ to substitute the paths to the
+android SDK and NDK directories, and maven 3 executable respectively.
+
+
@item novcheck=yes
Don't check that the version name and code in the resulting apk are
correct by looking at the build output - assume the metadata is
"""Do a build locally."""
# Prepare the source code...
- root_dir = common.prepare_source(vcs, app, thisbuild,
+ root_dir, srclibpaths = common.prepare_source(vcs, app, thisbuild,
build_dir, extlib_dir, sdk_path, ndk_path,
javacc_path, mvn3, verbose)
tarball.add(build_dir, tarname, exclude=tarexc)
tarball.close()
+ # Run a build command if one is required...
+ if 'build' in thisbuild:
+ prebuild = build['build']
+ # Substitute source library paths into prebuild commands...
+ for name, libpath in srclibpaths:
+ libpath = os.path.relpath(libpath, root_dir)
+ prebuild = prebuild.replace('$$' + name + '$$', libpath)
+ prebuild = prebuild.replace('$$SDK$$', sdk_path)
+ prebuild = prebuild.replace('$$NDK$$', ndk_path)
+ prebuild = prebuild.replace('$$MVN3$$', mvn3)
+ p = subprocess.Popen(prebuild, cwd=root_dir, shell=True,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ if p.returncode != 0:
+ raise BuildException("Error running build command", out, err)
+
# Build native stuff if required...
if thisbuild.get('buildjni') not in (None, 'no'):
jni_components = thisbuild.get('buildjni')
# 'javacc_path' - the path to javacc
# 'mvn3' - the path to the maven 3 executable
# 'verbose' - optional: verbose or not (default=False)
-# Returns the root directory, which may be the same as 'build_dir' or may
-# be a subdirectory of it.
+# Returns the (root, srclibpaths) where:
+# 'root' is the root directory, which may be the same as 'build_dir' or may
+# be a subdirectory of it.
+# 'srclibpaths' is information on the srclibs being used
def prepare_source(vcs, app, build, build_dir, extlib_dir, sdk_path, ndk_path, javacc_path, mvn3, verbose=False):
# Optionally, the actual app source can be in a subdirectory...
'build.properties'], cwd=root_dir) !=0:
raise BuildException("Failed to amend build.properties")
- return root_dir
+ return (root_dir, srclibpaths)
# Scan the source code in the given directory (and all subdirectories)
print "..scanning version " + thisbuild['version']
# Prepare the source code...
- root_dir = common.prepare_source(vcs, app, thisbuild,
+ root_dir, _ = common.prepare_source(vcs, app, thisbuild,
build_dir, extlib_dir, sdk_path, ndk_path, javacc_path, mvn3, options.verbose)
# Do the scan...