diff --git a/docs/fdroid.texi b/docs/fdroid.texi index 3cc1f5f7..09c57380 100644 --- a/docs/fdroid.texi +++ b/docs/fdroid.texi @@ -772,6 +772,11 @@ insert literal commas, or as the last character on a line to join that 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. @@ -785,6 +790,15 @@ takes place. 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 diff --git a/fdroidserver/build.py b/fdroidserver/build.py index c2e2fb84..40d1e987 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -265,7 +265,7 @@ def build_local(app, thisbuild, vcs, build_dir, output_dir, extlib_dir, tmp_dir, """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) @@ -291,6 +291,22 @@ def build_local(app, thisbuild, vcs, build_dir, output_dir, extlib_dir, tmp_dir, 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') diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a948f821..050a0fa8 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1642,8 +1642,10 @@ def getsrclib(spec, extlib_dir, sdk_path, basepath=False): # '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... @@ -1970,7 +1972,7 @@ def prepare_source(vcs, app, build, build_dir, extlib_dir, sdk_path, ndk_path, j '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) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 2d307a32..9af74da9 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -98,7 +98,7 @@ def main(): 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...