Index: build/android/gyp/create_device_library_links.py |
diff --git a/build/android/gyp/create_device_library_links.py b/build/android/gyp/create_device_library_links.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..3e630b67c9f1a2459e4c16fdb77d01eaa87672d5 |
--- /dev/null |
+++ b/build/android/gyp/create_device_library_links.py |
@@ -0,0 +1,114 @@ |
+#!/usr/bin/env python |
+# |
+# Copyright 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Creates symlinks to native libraries for an APK. |
+ |
+The native libraries should have previously been pushed to the device (in |
+options.target_dir). This script then creates links in an apk's lib/ folder to |
+those native libraries. |
+""" |
+ |
+import optparse |
+import os |
+import sys |
+ |
+from util import build_device |
+from util import build_utils |
+ |
+BUILD_ANDROID_DIR = os.path.join(os.path.dirname(__file__), '..') |
+sys.path.append(BUILD_ANDROID_DIR) |
+ |
+from pylib import constants |
+from pylib.utils import apk_helper |
+ |
+def RunShellCommand(device, cmd): |
+ output = device.RunShellCommand(cmd) |
+ |
+ if output: |
+ raise Exception( |
+ 'Unexpected output running command: ' + cmd + '\n' + |
+ '\n'.join(output)) |
+ |
+ |
+def CreateSymlinkScript(options): |
+ libraries = build_utils.ParseGypList(options.libraries) |
+ |
+ link_cmd = ( |
+ 'rm $APK_LIBRARIES_DIR/%(lib_basename)s > /dev/null 2>&1 \n' |
+ 'ln -s $STRIPPED_LIBRARIES_DIR/%(lib_basename)s ' |
+ '$APK_LIBRARIES_DIR/%(lib_basename)s \n' |
+ ) |
+ |
+ script = '#!/bin/sh \n' |
+ |
+ for lib in libraries: |
+ script += link_cmd % { 'lib_basename': lib } |
+ |
+ with open(options.script_host_path, 'w') as scriptfile: |
+ scriptfile.write(script) |
+ |
+ |
+def TriggerSymlinkScript(options): |
+ device = build_device.GetBuildDeviceFromPath( |
+ options.build_device_configuration) |
+ if not device: |
+ return |
+ |
+ apk_package = apk_helper.GetPackageName(options.apk) |
+ apk_libraries_dir = '/data/data/%s/lib' % apk_package |
+ |
+ device_dir = os.path.dirname(options.script_device_path) |
+ mkdir_cmd = ('if [ ! -e %(dir)s ]; then mkdir -p %(dir)s; fi ' % |
+ { 'dir': device_dir }) |
+ RunShellCommand(device, mkdir_cmd) |
+ device.PushChangedFiles([(options.script_host_path, |
+ options.script_device_path)]) |
+ |
+ trigger_cmd = ( |
+ 'APK_LIBRARIES_DIR=%(apk_libraries_dir)s; ' |
+ 'STRIPPED_LIBRARIES_DIR=%(target_dir)s; ' |
+ '. %(script_device_path)s' |
+ ) % { |
+ 'apk_libraries_dir': apk_libraries_dir, |
+ 'target_dir': options.target_dir, |
+ 'script_device_path': options.script_device_path |
+ } |
+ RunShellCommand(device, trigger_cmd) |
+ |
+ |
+def main(args): |
+ args = build_utils.ExpandFileArgs(args) |
+ parser = optparse.OptionParser() |
+ parser.add_option('--apk', help='Path to the apk.') |
+ parser.add_option('--script-host-path', |
+ help='Path on the host for the symlink script.') |
+ parser.add_option('--script-device-path', |
+ help='Path on the device to push the created symlink script.') |
+ parser.add_option('--libraries', |
+ help='List of native libraries.') |
+ parser.add_option('--target-dir', |
+ help='Device directory that contains the target libraries for symlinks.') |
+ parser.add_option('--stamp', help='Path to touch on success.') |
+ parser.add_option('--build-device-configuration', |
+ help='Path to build device configuration.') |
+ parser.add_option('--configuration-name', |
+ help='The build CONFIGURATION_NAME') |
+ options, _ = parser.parse_args(args) |
+ |
+ required_options = ['apk', 'libraries', 'script_host_path', |
+ 'script_device_path', 'target_dir', 'configuration_name'] |
+ build_utils.CheckOptions(options, parser, required=required_options) |
+ constants.SetBuildType(options.configuration_name) |
+ |
+ CreateSymlinkScript(options) |
+ TriggerSymlinkScript(options) |
+ |
+ if options.stamp: |
+ build_utils.Touch(options.stamp) |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main(sys.argv[1:])) |