diff --git a/build.py b/build.py index 81c68c64..c341dda5 100755 --- a/build.py +++ b/build.py @@ -149,10 +149,18 @@ def build_local(app, thisbuild, vcs, build_dir, output_dir, extlib_dir, tmp_dir, tarball.close() # Build native stuff if required... - if thisbuild.get('buildjni', 'no') == 'yes': + if thisbuild.get('buildjni') not in (None, 'no'): + jni_components = thisbuild.get('buildjni') + if jni_components == 'yes': + jni_components = [''] + else: + jni_components = jni_components.split(';') ndkbuild = os.path.join(ndk_path, "ndk-build") - p = subprocess.Popen([ndkbuild], cwd=root_dir, - stdout=subprocess.PIPE) + for d in jni_components: + if options.verbose: + print "Running ndk-build in " + root_dir + '/' + d + p = subprocess.Popen([ndkbuild], cwd=root_dir + '/' + d, + stdout=subprocess.PIPE) output = p.communicate()[0] if p.returncode != 0: print output @@ -327,9 +335,11 @@ def parse_commandline(): return options, args +options = None def main(): + global options # Read configuration... execfile('config.py', globals()) options, args = parse_commandline() diff --git a/common.py b/common.py index 978ecf98..a20da969 100644 --- a/common.py +++ b/common.py @@ -713,7 +713,7 @@ def prepare_source(vcs, app, build, build_dir, extlib_dir, sdk_path, ndk_path, j raise BuildException("Error running init command") # Generate (or update) the ant build file, build.xml... - if (build.get('update', 'yes') != 'no' and + if (build.get('update', '.') != 'no' and not build.has_key('maven')): parms = [os.path.join(sdk_path, 'tools', 'android'), 'update', 'project', '-p', '.'] @@ -721,14 +721,17 @@ def prepare_source(vcs, app, build, build_dir, extlib_dir, sdk_path, ndk_path, j if build.has_key('target'): parms.append('-t') parms.append(build['target']) + update_dirs = build.get('update', '.').split(';') # Force build.xml update if necessary... - if build.get('update', 'yes') == 'force' or build.has_key('target'): + if build.get('update', '.') == 'force' or build.has_key('target'): + update_dirs = ['.'] buildxml = os.path.join(root_dir, 'build.xml') if os.path.exists(buildxml): print 'Force-removing old build.xml' os.remove(buildxml) - if subprocess.call(parms, cwd=root_dir) != 0: - raise BuildException("Failed to update project") + for d in update_dirs: + if subprocess.call(parms, cwd=root_dir + '/' + d) != 0: + raise BuildException("Failed to update project") # If the app has ant set up to sign the release, we need to switch # that off, because we want the unsigned apk... @@ -1000,7 +1003,7 @@ def scan_source(build_dir, root_dir, thisbuild): # Presence of a jni directory without buildjni=yes might # indicate a problem... if (os.path.exists(os.path.join(root_dir, 'jni')) and - thisbuild.get('buildjni', 'no') == 'no'): + thisbuild.get('buildjni') is None): msg = 'Found jni directory, but buildjni is not enabled' problems.append(msg) diff --git a/docs/fdroid.texi b/docs/fdroid.texi index 3729a46f..297b2220 100644 --- a/docs/fdroid.texi +++ b/docs/fdroid.texi @@ -614,23 +614,34 @@ build.xml file. Specifying update=no bypasses that. Specifiying update=force forces rebuilding of the build.xml file at the same time - this is frequently needed with r14 of the Android platform -tools. +tools. Be aware of any customisations in build.xml when using +update=force. -Be aware of any customisations in build.xml when using update=force. +Otherwise, value can be a semicol-separated list of directories in +which to run 'android update project' relative to the main +application directory (which may include '@code{subdir}' parameter). +Default value is '@code{.}', and passing non-default value may be +useful for multi-component projects. Note that @code{--subprojects} +switch is automatically passed to 'android update project', so using +explicit list may be needed only for peculiar source layouts. @item initfun=yes Enables a selection of mad hacks to make com.funambol.android build. Probably not useful for any other application. -@item buildjni=[no|yes|force] +@item buildjni=[yes|no|] Enables building of native code via the ndk-build script before doing -the main ant build. The default is @code{no}. +the main ant build. The value may be a list of directories relative +to the main application directory in which to run ndk-build, or 'yes' +which corresponds to '.' . Using explicit list may be useful to build +multi-component projects. -The build and scan processes will complain (refuse to build) if this is set -to @code{no}, but there is a @code{jni} directory present. If the native code -is being built by other means, you can specify @code{manual} here to avoid -that. However, if the native code is actually not required, remove the -directory instead. +The build and scan processes will complain (refuse to build) if this +parameter is not defined, but there is a @code{jni} directory present. +If the native code is being built by other means, you can specify +@code{no} here to avoid that. However, if the native code is actually +not required, remove the directory instead (using @code{prebuild} for +example). @item submodules=yes Use if the project (git only) has submodules - causes git submodule