summaryrefslogtreecommitdiff
path: root/chromium/build
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-09-18 14:34:04 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-10-04 11:15:27 +0000
commite6430e577f105ad8813c92e75c54660c4985026e (patch)
tree88115e5d1fb471fea807111924dcccbeadbf9e4f /chromium/build
parent53d399fe6415a96ea6986ec0d402a9c07da72453 (diff)
downloadqtwebengine-chromium-e6430e577f105ad8813c92e75c54660c4985026e.tar.gz
BASELINE: Update Chromium to 61.0.3163.99
Change-Id: I8452f34574d88ca2b27af9bd56fc9ff3f16b1367 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/build')
-rw-r--r--chromium/build/OWNERS1
-rw-r--r--chromium/build/PRESUBMIT.py26
-rw-r--r--chromium/build/android/BUILD.gn4
-rwxr-xr-xchromium/build/android/adb_command_line.py2
-rwxr-xr-xchromium/build/android/adb_gdb129
-rwxr-xr-xchromium/build/android/adb_install_apk.py4
-rw-r--r--chromium/build/android/apk_operations.py346
-rwxr-xr-xchromium/build/android/binary_size/apk_downloader.py4
-rw-r--r--chromium/build/android/binary_size/apks/Android_Builder/60/ChromeModernPublic.apk.sha11
-rw-r--r--chromium/build/android/binary_size/apks/Android_Builder/60/ChromePublic.apk.sha11
-rw-r--r--chromium/build/android/binary_size/apks/Android_Builder/60/MonochromePublic.apk.sha11
-rw-r--r--chromium/build/android/binary_size/apks/Android_arm64_Builder/60/ChromeModernPublic.apk.sha11
-rw-r--r--chromium/build/android/binary_size/apks/Android_arm64_Builder/60/ChromePublic.apk.sha11
-rwxr-xr-xchromium/build/android/emma_coverage_stats.py2
-rwxr-xr-xchromium/build/android/emma_coverage_stats_test.py2
-rwxr-xr-xchromium/build/android/envsetup.sh44
-rwxr-xr-xchromium/build/android/gradle/generate_gradle.py5
-rw-r--r--chromium/build/android/gradle/root.jinja2
-rwxr-xr-xchromium/build/android/gyp/apk_install.py115
-rwxr-xr-xchromium/build/android/gyp/create_apk_operations_script.py72
-rwxr-xr-xchromium/build/android/gyp/java_google_api_keys.py1
-rwxr-xr-xchromium/build/android/gyp/lint.py13
-rwxr-xr-xchromium/build/android/gyp/merge_manifest.py100
-rwxr-xr-xchromium/build/android/gyp/package_resources.py84
-rwxr-xr-xchromium/build/android/gyp/process_resources.py7
-rwxr-xr-xchromium/build/android/gyp/proguard.py3
-rw-r--r--chromium/build/android/gyp/util/build_utils.py22
-rw-r--r--chromium/build/android/gyp/util/proguard_util.py22
-rwxr-xr-xchromium/build/android/gyp/write_build_config.py18
-rwxr-xr-xchromium/build/android/incremental_install/installer.py8
-rw-r--r--chromium/build/android/lint/OWNERS2
-rwxr-xr-xchromium/build/android/lint/suppress.py30
-rw-r--r--chromium/build/android/lint/suppressions.xml31
-rwxr-xr-xchromium/build/android/play_services/update.py7
-rw-r--r--chromium/build/android/pylib/constants/__init__.py2
-rw-r--r--chromium/build/android/pylib/instrumentation/instrumentation_test_instance.py129
-rwxr-xr-xchromium/build/android/pylib/instrumentation/instrumentation_test_instance_test.py130
-rw-r--r--chromium/build/android/pylib/instrumentation/render_test.html.jinja1
-rw-r--r--chromium/build/android/pylib/local/device/local_device_environment.py47
-rw-r--r--chromium/build/android/pylib/local/device/local_device_gtest_run.py19
-rw-r--r--chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py151
-rw-r--r--chromium/build/android/pylib/local/device/local_device_test_run.py6
-rw-r--r--chromium/build/android/pylib/local/machine/local_machine_junit_test_run.py14
-rw-r--r--chromium/build/android/pylib/results/presentation/__init__.py3
-rwxr-xr-xchromium/build/android/pylib/results/presentation/standard_gtest_merge.py164
-rwxr-xr-xchromium/build/android/pylib/results/presentation/test_results_presentation.py27
-rwxr-xr-xchromium/build/android/pylib/utils/decorators_test.py2
-rw-r--r--chromium/build/android/pylib/utils/device_dependencies.py3
-rw-r--r--chromium/build/android/pylib/utils/instrumentation_tracing.py186
-rw-r--r--chromium/build/android/pylib/utils/logging_utils.py53
-rw-r--r--chromium/build/android/pylib/utils/proguard.py1
-rw-r--r--chromium/build/android/pylib/utils/shared_preference_utils.py88
-rwxr-xr-xchromium/build/android/resource_sizes.py133
-rw-r--r--chromium/build/android/stacktrace/BUILD.gn17
-rw-r--r--chromium/build/android/stacktrace/README.md18
-rwxr-xr-xchromium/build/android/stacktrace/java_deobfuscate.py60
-rwxr-xr-xchromium/build/android/test_runner.py60
-rw-r--r--chromium/build/android/test_runner.pydeps49
-rw-r--r--chromium/build/args/headless.gn7
-rw-r--r--chromium/build/build_config.h14
-rwxr-xr-xchromium/build/check_gn_headers.py118
-rwxr-xr-xchromium/build/check_gn_headers_unittest.py32
-rw-r--r--chromium/build/check_gn_headers_whitelist.txt387
-rw-r--r--chromium/build/config/BUILD.gn25
-rw-r--r--chromium/build/config/BUILDCONFIG.gn6
-rw-r--r--chromium/build/config/allocator.gni2
-rw-r--r--chromium/build/config/android/BUILD.gn7
-rw-r--r--chromium/build/config/android/config.gni21
-rw-r--r--chromium/build/config/android/internal_rules.gni99
-rw-r--r--chromium/build/config/android/rules.gni196
-rw-r--r--chromium/build/config/c++/BUILD.gn56
-rw-r--r--chromium/build/config/c++/c++.gni23
-rw-r--r--chromium/build/config/compiler/BUILD.gn225
-rw-r--r--chromium/build/config/compiler/compiler.gni38
-rw-r--r--chromium/build/config/features.gni7
-rw-r--r--chromium/build/config/fuchsia/BUILD.gn13
-rw-r--r--chromium/build/config/fuchsia/rules.gni78
-rw-r--r--chromium/build/config/gcc/BUILD.gn12
-rw-r--r--chromium/build/config/ios/BUILD.gn13
-rw-r--r--chromium/build/config/ios/Module-Info.plist4
-rw-r--r--chromium/build/config/ios/codesign.py49
-rw-r--r--chromium/build/config/ios/dummy.py15
-rw-r--r--chromium/build/config/ios/imageset.gni159
-rw-r--r--chromium/build/config/ios/ios_sdk.gni2
-rw-r--r--chromium/build/config/ios/rules.gni436
-rw-r--r--chromium/build/config/jumbo.gni246
-rw-r--r--chromium/build/config/linux/BUILD.gn5
-rwxr-xr-xchromium/build/config/linux/pkg-config.py8
-rw-r--r--chromium/build/config/linux/pkg_config.gni12
-rw-r--r--chromium/build/config/mac/BuildInfo.plist8
-rw-r--r--chromium/build/config/mac/base_rules.gni5
-rw-r--r--chromium/build/config/mac/compile_ib_files.py14
-rw-r--r--chromium/build/config/mac/mac_sdk.gni18
-rw-r--r--chromium/build/config/mac/mac_sdk_overrides.gni22
-rw-r--r--chromium/build/config/mac/plist_util.py88
-rw-r--r--chromium/build/config/mac/sdk_info.py6
-rwxr-xr-xchromium/build/config/merge_for_jumbo.py93
-rw-r--r--chromium/build/config/mips.gni6
-rw-r--r--chromium/build/config/nacl/rules.gni18
-rw-r--r--chromium/build/config/sanitizers/BUILD.gn66
-rw-r--r--chromium/build/config/sanitizers/sanitizers.gni27
-rw-r--r--chromium/build/config/sysroot.gni5
-rwxr-xr-xchromium/build/download_gold_plugin.py44
-rwxr-xr-xchromium/build/env_dump.py2
-rwxr-xr-xchromium/build/find_depot_tools.py12
-rw-r--r--chromium/build/fuchsia/OWNERS9
-rwxr-xr-xchromium/build/fuchsia/create_test_runner_script.py114
-rwxr-xr-xchromium/build/fuchsia/test_runner.py350
-rwxr-xr-xchromium/build/get_landmines.py11
-rwxr-xr-xchromium/build/install-build-deps.sh7
-rwxr-xr-xchromium/build/ios/clean_env.py2
-rwxr-xr-xchromium/build/landmines.py10
-rw-r--r--chromium/build/linux/BUILD.gn15
-rw-r--r--chromium/build/linux/bin/eu-strip.sha11
-rwxr-xr-xchromium/build/linux/sysroot_scripts/build_and_upload.py8
-rw-r--r--chromium/build/linux/sysroot_scripts/debian-archive-jessie-stable.gpgbin23738 -> 31378 bytes
-rwxr-xr-xchromium/build/linux/sysroot_scripts/install-sysroot.py20
-rw-r--r--chromium/build/linux/sysroot_scripts/packagelist.jessie.amd64420
-rw-r--r--chromium/build/linux/sysroot_scripts/packagelist.jessie.arm414
-rw-r--r--chromium/build/linux/sysroot_scripts/packagelist.jessie.arm64418
-rw-r--r--chromium/build/linux/sysroot_scripts/packagelist.jessie.i386416
-rw-r--r--chromium/build/linux/sysroot_scripts/packagelist.jessie.mipsel404
-rwxr-xr-xchromium/build/linux/sysroot_scripts/sysroot-creator-jessie.sh9
-rw-r--r--chromium/build/linux/sysroot_scripts/sysroot-creator.sh96
-rw-r--r--chromium/build/linux/sysroot_scripts/sysroots.json20
-rw-r--r--chromium/build/linux/unbundle/icu.gn28
-rwxr-xr-xchromium/build/mac/should_use_hermetic_xcode.py15
-rwxr-xr-xchromium/build/mac_toolchain.py18
-rwxr-xr-xchromium/build/package_mac_toolchain.py1
-rw-r--r--chromium/build/sanitizers/sanitizer_options.cc20
-rw-r--r--chromium/build/sanitizers/tsan_suppressions.cc5
-rw-r--r--chromium/build/secondary/third_party/catapult/devil/BUILD.gn19
-rw-r--r--chromium/build/secondary/third_party/libjpeg_turbo/BUILD.gn5
-rw-r--r--chromium/build/toolchain/gcc_toolchain.gni3
-rw-r--r--chromium/build/toolchain/linux/BUILD.gn74
-rw-r--r--chromium/build/toolchain/mac/BUILD.gn5
-rw-r--r--chromium/build/toolchain/mac/compile_xcassets.py124
-rw-r--r--chromium/build/toolchain/mac/compile_xcassets_unittests.py126
-rw-r--r--chromium/build/toolchain/toolchain.gni27
-rw-r--r--chromium/build/toolchain/win/BUILD.gn11
-rw-r--r--chromium/build/toolchain/win/setup_toolchain.py9
-rw-r--r--chromium/build/util/LASTCHANGE2
-rw-r--r--chromium/build/util/LASTCHANGE.blink2
-rwxr-xr-xchromium/build/util/java_action.py2
-rwxr-xr-xchromium/build/vs_toolchain.py30
-rw-r--r--chromium/build/whitespace_file.txt2
-rwxr-xr-xchromium/build/win/merge_pgc_files.py97
147 files changed, 6167 insertions, 2425 deletions
diff --git a/chromium/build/OWNERS b/chromium/build/OWNERS
index c644ca7d5fd..991d98db3c5 100644
--- a/chromium/build/OWNERS
+++ b/chromium/build/OWNERS
@@ -7,6 +7,7 @@ thakis@chromium.org
brucedawson@chromium.org
per-file .gitignore=*
+per-file check_gn_headers_whitelist.txt=*
per-file mac_toolchain.py=erikchen@chromium.org
per-file mac_toolchain.py=justincohen@chromium.org
per-file package_mac_toolchain.py=erikchen@chromium.org
diff --git a/chromium/build/PRESUBMIT.py b/chromium/build/PRESUBMIT.py
new file mode 100644
index 00000000000..60d00288729
--- /dev/null
+++ b/chromium/build/PRESUBMIT.py
@@ -0,0 +1,26 @@
+# Copyright (c) 2017 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.
+
+"""Presubmit script for //build.
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
+for more details about the presubmit API built into depot_tools.
+"""
+
+def PostUploadHook(cl, change, output_api):
+ """git cl upload will call this hook after the issue is created/modified.
+
+ This hook modifies the CL description in order to run extra tests.
+ """
+
+ def affects_gn_checker(f):
+ return 'check_gn_headers' in f.LocalPath()
+ if not change.AffectedFiles(file_filter=affects_gn_checker):
+ return []
+ return output_api.EnsureCQIncludeTrybotsAreAdded(
+ cl,
+ [
+ 'master.tryserver.chromium.linux:linux_chromium_dbg_ng',
+ ],
+ 'Automatically added tests to run on CQ.')
diff --git a/chromium/build/android/BUILD.gn b/chromium/build/android/BUILD.gn
index 4720c8a1b0f..bb3a5aae6b9 100644
--- a/chromium/build/android/BUILD.gn
+++ b/chromium/build/android/BUILD.gn
@@ -50,11 +50,13 @@ if (enable_java_templates) {
rebase_path(android_sdk_build_tools, root_build_dir) + CR
_data += "android_sdk_build_tools_version=$android_sdk_build_tools_version$CR"
_data +=
+ "android_sdk_tools_version_suffix=$android_sdk_tools_version_suffix$CR"
+ _data +=
"android_sdk_root=" + rebase_path(android_sdk_root, root_build_dir) + CR
_data += "android_sdk_version=$android_sdk_version$CR"
_data += "android_tool_prefix=" +
rebase_path(android_tool_prefix, root_build_dir) + CR
- write_file("$root_build_dir/build_vars.txt", _data)
+ write_file(android_build_vars, _data)
}
# Copy to the lib.unstripped directory so that gdb can easily find it.
diff --git a/chromium/build/android/adb_command_line.py b/chromium/build/android/adb_command_line.py
index bf6a65eefe9..78e9e508f76 100755
--- a/chromium/build/android/adb_command_line.py
+++ b/chromium/build/android/adb_command_line.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright 2015 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.
diff --git a/chromium/build/android/adb_gdb b/chromium/build/android/adb_gdb
index f9e372617f0..a72b90a4ed2 100755
--- a/chromium/build/android/adb_gdb
+++ b/chromium/build/android/adb_gdb
@@ -33,10 +33,12 @@ clean_exit () {
if [ "$GDBSERVER_PID" ]; then
log "Killing background gdbserver process: $GDBSERVER_PID"
kill -9 $GDBSERVER_PID >/dev/null 2>&1
+ rm -f "$GDBSERVER_PIDFILE"
fi
if [ "$TARGET_GDBSERVER" ]; then
log "Removing target gdbserver binary: $TARGET_GDBSERVER."
- "$ADB" shell "$COMMAND_PREFIX" rm "$TARGET_GDBSERVER" "$COMMAND_SUFFIX" >/dev/null 2>&1
+ "$ADB" shell "$COMMAND_PREFIX" rm "$TARGET_GDBSERVER" \
+ "$TARGET_DOMAIN_SOCKET" "$COMMAND_SUFFIX" >/dev/null 2>&1
fi
log "Cleaning up: $TMPDIR"
rm -rf "$TMPDIR"
@@ -87,6 +89,7 @@ ADB=
ANNOTATE=
FORCE=
GDBEXEPOSTFIX=gdb
+CGDB=
GDBINIT=
GDBSERVER=
HELP=
@@ -206,6 +209,12 @@ for opt; do
--ui)
GDBEXEPOSTFIX=gdbtui
;;
+ --cgdb)
+ CGDB=cgdb
+ ;;
+ --cgdb=*)
+ CGDB=$optarg
+ ;;
--verbose)
VERBOSE=$(( $VERBOSE + 1 ))
;;
@@ -306,6 +315,7 @@ Valid options:
--help|-h|-? Print this message.
--verbose Increase verbosity.
+ --cgdb[=<file>] Use cgdb (an interface for gdb that shows the code).
--sandboxed Debug first sandboxed process we find.
--sandboxed=<num> Debug specific sandboxed process.
--symbol-dir=<path> Specify directory with symbol shared libraries.
@@ -361,6 +371,11 @@ if [[ -z "$SYMBOL_DIR" && -z "$CHROMIUM_OUTPUT_DIR" ]]; then
fi
fi
+if ls *.so >/dev/null 2>&1; then
+ panic ".so files found in your working directory. These will conflict with " \
+ "library lookup logic. Change your working directory and try again."
+fi
+
# Detect the build type and symbol directory. This is done by finding
# the most recent sub-directory containing debug shared libraries under
# $CHROMIUM_OUTPUT_DIR.
@@ -475,7 +490,8 @@ adb_shell () {
# This returns an NDK-compatible architecture name.
# out: NDK Architecture name, or empty string.
get_gyp_target_arch () {
- local RANDOM_LIB=$(ls "$SYMBOL_DIR"/lib*.so | head -n1)
+ # ls prints a broken pipe error when there are a lot of libs.
+ local RANDOM_LIB=$(ls "$SYMBOL_DIR"/lib*.so 2>/dev/null| head -n1)
local SO_DESC=$(file $RANDOM_LIB)
case $ARCH in
*32-bit*ARM,*) echo "arm";;
@@ -748,7 +764,8 @@ get_file_timestamp () {
}
# Allow several concurrent debugging sessions
-TARGET_GDBSERVER=/data/data/$PACKAGE_NAME/gdbserver-adb-gdb-$TMP_ID
+APP_DATA_DIR=$("$ADB" shell run-as $PACKAGE_NAME /system/bin/sh -c pwd)
+TARGET_GDBSERVER="$APP_DATA_DIR/gdbserver-adb-gdb-$TMP_ID"
TMP_TARGET_GDBSERVER=/data/local/tmp/gdbserver-adb-gdb-$TMP_ID
# Return the build fingerprint contained in a build.prop file.
@@ -922,6 +939,7 @@ fi
# so we can add them to solib-search-path later.
SOLIB_DIRS=$(find $PULL_LIBS_DIR -mindepth 1 -maxdepth 4 -type d | \
grep -v "^$" | tr '\n' ':')
+SOLIB_DIRS=${SOLIB_DIRS%:} # Strip trailing :
# This is a re-implementation of gdbclient, where we use compatible
# versions of gdbserver and $GDBNAME to ensure that everything works
@@ -930,22 +948,23 @@ SOLIB_DIRS=$(find $PULL_LIBS_DIR -mindepth 1 -maxdepth 4 -type d | \
# Push gdbserver to the device
log "Pushing gdbserver $GDBSERVER to $TARGET_GDBSERVER"
-"$ADB" push $GDBSERVER $TMP_TARGET_GDBSERVER &>/dev/null
-"$ADB" shell $COMMAND_PREFIX cp $TMP_TARGET_GDBSERVER $TARGET_GDBSERVER $COMMAND_SUFFIX
-"$ADB" shell rm $TMP_TARGET_GDBSERVER
+"$ADB" push $GDBSERVER $TMP_TARGET_GDBSERVER >/dev/null && \
+ adb_shell $COMMAND_PREFIX cp $TMP_TARGET_GDBSERVER $TARGET_GDBSERVER $COMMAND_SUFFIX && \
+ adb_shell rm $TMP_TARGET_GDBSERVER
fail_panic "Could not copy gdbserver to the device!"
if [ -z "$PORT" ]; then
- PORT=5039
+ # Random port to allow multiple concurrent sessions.
+ PORT=$(( $RANDOM % 1000 + 5039 ))
fi
HOST_PORT=$PORT
-TARGET_PORT=$PORT
+TARGET_DOMAIN_SOCKET=$APP_DATA_DIR/gdb-socket-$HOST_PORT
# Select correct app_process for architecture.
case $TARGET_ARCH in
arm|x86|mips) GDBEXEC=app_process32;;
arm64|x86_64) GDBEXEC=app_process64;;
- *) fail_panic "Unknown app_process for architecture!";;
+ *) panic "Unknown app_process for architecture!";;
esac
# Default to app_process if bit-width specific process isn't found.
@@ -968,10 +987,10 @@ log "Pulling $GDBEXEC from device"
fail_panic "Could not retrieve $GDBEXEC from the device!"
# Setup network redirection
-log "Setting network redirection (host:$HOST_PORT -> device:$TARGET_PORT)"
-"$ADB" forward tcp:$HOST_PORT tcp:$TARGET_PORT
+log "Setting network redirection (host:$HOST_PORT -> device:$TARGET_DOMAIN_SOCKET)"
+"$ADB" forward tcp:$HOST_PORT localfilesystem:$TARGET_DOMAIN_SOCKET
fail_panic "Could not setup network redirection from \
-host:localhost:$HOST_PORT to device:localhost:$TARGET_PORT!"
+host:localhost:$HOST_PORT to device:$TARGET_DOMAIN_SOCKET"
# Start gdbserver in the background
# Note that using run-as requires the package to be debuggable.
@@ -982,9 +1001,11 @@ host:localhost:$HOST_PORT to device:localhost:$TARGET_PORT!"
#
log "Starting gdbserver in the background:"
GDBSERVER_LOG=$TMPDIR/gdbserver-$TMP_ID.log
-log "adb shell $COMMAND_PREFIX $TARGET_GDBSERVER :$TARGET_PORT \
+log "adb shell $COMMAND_PREFIX $TARGET_GDBSERVER \
+ --once +$TARGET_DOMAIN_SOCKET \
--attach $PID $COMMAND_SUFFIX"
-"$ADB" shell $COMMAND_PREFIX $TARGET_GDBSERVER :$TARGET_PORT \
+"$ADB" shell $COMMAND_PREFIX $TARGET_GDBSERVER \
+ --once +$TARGET_DOMAIN_SOCKET \
--attach $PID $COMMAND_SUFFIX > $GDBSERVER_LOG 2>&1 &
GDBSERVER_PID=$!
echo "$GDBSERVER_PID" > $GDBSERVER_PIDFILE
@@ -992,49 +1013,57 @@ log "background job pid: $GDBSERVER_PID"
# Sleep to allow gdbserver to attach to the remote process and be
# ready to connect to.
-log "Sleeping ${ATTACH_DELAY}s to allow gdbserver to attach."
+log "Sleeping ${ATTACH_DELAY}s to ensure gdbserver is alive"
sleep "$ATTACH_DELAY"
log "Job control: $(jobs -l)"
STATE=$(jobs -l | awk '$2 == "'$GDBSERVER_PID'" { print $3; }')
if [ "$STATE" != "Running" ]; then
echo "ERROR: GDBServer either failed to run or attach to PID $PID!"
- if [ $(adb_shell su -c getenforce) != "Permissive" ]; then
- echo "Device mode is Enforcing. Changing Device mode to Permissive "
- $(adb_shell su -c setenforce 0)
- if [ $(adb_shell su -c getenforce) != "Permissive" ]; then
- echo "ERROR: Failed to Change Device mode to Permissive"
- echo "Failure log (use --verbose for more information):"
- cat $GDBSERVER_LOG
- exit 1
- fi
- else
- echo "Failure log (use --verbose for more information):"
- cat $GDBSERVER_LOG
- exit 1
- fi
+ echo "Here is the output from gdbserver (also try --verbose for more):"
+ echo "===== gdbserver.log start ====="
+ cat $GDBSERVER_LOG
+ echo ="===== gdbserver.log end ======"
+ exit 1
fi
# Generate a file containing useful GDB initialization commands
readonly COMMANDS=$TMPDIR/gdb.init
log "Generating GDB initialization commands file: $COMMANDS"
-echo -n "" > $COMMANDS
-echo "set print pretty 1" >> $COMMANDS
-echo "python" >> $COMMANDS
-echo "import sys" >> $COMMANDS
-echo "sys.path.insert(0, '$CHROMIUM_SRC/tools/gdb/')" >> $COMMANDS
-echo "try:" >> $COMMANDS
-echo " import gdb_chrome" >> $COMMANDS
-echo "finally:" >> $COMMANDS
-echo " sys.path.pop(0)" >> $COMMANDS
-echo "end" >> $COMMANDS
-echo "file $TMPDIR/$GDBEXEC" >> $COMMANDS
-echo "directory $CHROMIUM_SRC" >> $COMMANDS
-echo "set solib-absolute-prefix $PULL_LIBS_DIR" >> $COMMANDS
-echo "set solib-search-path $SOLIB_DIRS:$PULL_LIBS_DIR:$SYMBOL_DIR" \
- >> $COMMANDS
-echo "echo Attaching and reading symbols, this may take a while.." \
- >> $COMMANDS
-echo "target remote :$HOST_PORT" >> $COMMANDS
+cat > $COMMANDS <<EOF
+set print pretty 1
+python
+import sys
+sys.path.insert(0, '$CHROMIUM_SRC/tools/gdb/')
+try:
+ import gdb_chrome
+finally:
+ sys.path.pop(0)
+end
+file $TMPDIR/$GDBEXEC
+directory $CHROMIUM_SRC
+set solib-absolute-prefix $PULL_LIBS_DIR
+set solib-search-path $SOLIB_DIRS:$PULL_LIBS_DIR:$SYMBOL_DIR
+echo Attaching and reading symbols, this may take a while.."
+python
+# Copied from ndk-gdb.py:
+def target_remote_with_retry(target, timeout_seconds):
+ import time
+ end_time = time.time() + timeout_seconds
+ while True:
+ try:
+ gdb.execute('target remote ' + target)
+ return True
+ except gdb.error as e:
+ time_left = end_time - time.time()
+ if time_left < 0 or time_left > timeout_seconds:
+ print("Error: unable to connect to device.")
+ print(e)
+ return False
+ time.sleep(min(0.25, time_left))
+
+target_remote_with_retry(':$HOST_PORT', 5)
+end
+EOF
if [ "$GDBINIT" ]; then
cat "$GDBINIT" >> $COMMANDS
@@ -1047,5 +1076,9 @@ if [ "$VERBOSE" -gt 0 ]; then
fi
log "Launching gdb client: $GDB $GDB_ARGS -x $COMMANDS"
-$GDB $GDB_ARGS -x $COMMANDS &&
+if [ "$CGDB" ]; then
+ $CGDB -d $GDB -- $GDB_ARGS -x $COMMANDS
+else
+ $GDB $GDB_ARGS -x $COMMANDS
+fi
rm -f "$GDBSERVER_PIDFILE"
diff --git a/chromium/build/android/adb_install_apk.py b/chromium/build/android/adb_install_apk.py
index fd8b8d7630b..f17143a2a3d 100755
--- a/chromium/build/android/adb_install_apk.py
+++ b/chromium/build/android/adb_install_apk.py
@@ -115,12 +115,12 @@ def main():
timeout=args.timeout)
except (device_errors.CommandFailedError,
device_errors.DeviceUnreachableError):
- logging.exception('Failed to install %s', args.apk_name)
+ logging.exception('Failed to install %s', apk)
if blacklist:
blacklist.Extend([str(device)], reason='install_failure')
logging.warning('Blacklisting %s', str(device))
except device_errors.CommandTimeoutError:
- logging.exception('Timed out while installing %s', args.apk_name)
+ logging.exception('Timed out while installing %s', apk)
if blacklist:
blacklist.Extend([str(device)], reason='install_timeout')
logging.warning('Blacklisting %s', str(device))
diff --git a/chromium/build/android/apk_operations.py b/chromium/build/android/apk_operations.py
new file mode 100644
index 00000000000..e1c33ae5d0c
--- /dev/null
+++ b/chromium/build/android/apk_operations.py
@@ -0,0 +1,346 @@
+# Copyright 2017 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.
+
+import argparse
+import imp
+import logging
+import os
+import pipes
+import shlex
+
+import devil_chromium
+from devil.android import apk_helper
+from devil.android import device_errors
+from devil.android import device_utils
+from devil.android import flag_changer
+from devil.android.sdk import intent
+from devil.android.sdk import adb_wrapper
+from devil.utils import run_tests_helper
+
+from pylib import constants
+
+
+def _InstallApk(install_incremental, inc_install_script, devices_obj,
+ apk_to_install):
+ if install_incremental:
+ helper = apk_helper.ApkHelper(apk_to_install)
+ try:
+ install_wrapper = imp.load_source('install_wrapper', inc_install_script)
+ except IOError:
+ raise Exception('Incremental install script not found: %s\n' %
+ inc_install_script)
+ params = install_wrapper.GetInstallParameters()
+
+ def install_incremental_apk(device):
+ from incremental_install import installer
+ installer.Install(device, helper, split_globs=params['splits'],
+ native_libs=params['native_libs'],
+ dex_files=params['dex_files'], permissions=None)
+ devices_obj.pMap(install_incremental_apk)
+ else:
+ # Install the regular apk on devices.
+ def install(device):
+ device.Install(apk_to_install)
+ devices_obj.pMap(install)
+
+
+def _UninstallApk(install_incremental, devices_obj, apk_package):
+ if install_incremental:
+ def uninstall_incremental_apk(device):
+ from incremental_install import installer
+ installer.Uninstall(device, apk_package)
+ devices_obj.pMap(uninstall_incremental_apk)
+ else:
+ # Uninstall the regular apk on devices.
+ def uninstall(device):
+ device.Uninstall(apk_package)
+ devices_obj.pMap(uninstall)
+
+
+def _LaunchUrl(devices_obj, input_args, device_args_file, url, apk_package):
+ if input_args and device_args_file is None:
+ raise Exception("This apk does not support any flags.")
+ def launch(device):
+ # The flags are first updated with input args.
+ changer = flag_changer.FlagChanger(device, device_args_file)
+ flags = []
+ if input_args:
+ flags = shlex.split(input_args)
+ changer.ReplaceFlags(flags)
+ # Then launch the apk.
+ if url is None:
+ # Simulate app icon click if no url is present.
+ cmd = ['monkey', '-p', apk_package, '-c',
+ 'android.intent.category.LAUNCHER', '1']
+ device.RunShellCommand(cmd, check_return=True)
+ else:
+ launch_intent = intent.Intent(
+ action='android.intent.action.VIEW', package=apk_package, data=url)
+ device.StartActivity(launch_intent)
+ devices_obj.pMap(launch)
+
+
+def _ChangeFlags(devices, devices_obj, input_args, device_args_file):
+ if input_args is None:
+ _DisplayArgs(devices, device_args_file)
+ else:
+ flags = shlex.split(input_args)
+ def update(device):
+ flag_changer.FlagChanger(device, device_args_file).ReplaceFlags(flags)
+ devices_obj.pMap(update)
+
+
+# TODO(Yipengw):add "--all" in the MultipleDevicesError message and use it here.
+def _GenerateMissingAllFlagMessage(devices, devices_obj):
+ descriptions = devices_obj.pMap(lambda d: d.build_description).pGet(None)
+ msg = ('More than one device available. Use --all to select all devices, '
+ 'or use --device to select a device by serial.\n\nAvailable '
+ 'devices:\n')
+ for d, desc in zip(devices, descriptions):
+ msg += ' %s (%s)\n' % (d, desc)
+ return msg
+
+
+def _DisplayArgs(devices, device_args_file):
+ print 'Existing flags per-device (via /data/local/tmp/%s):' % device_args_file
+ for d in devices:
+ changer = flag_changer.FlagChanger(d, device_args_file)
+ flags = changer.GetCurrentFlags()
+ if flags:
+ quoted_flags = ' '.join(pipes.quote(f) for f in flags)
+ else:
+ quoted_flags = '( empty )'
+ print ' %s (%s): %s' % (d, d.build_description, quoted_flags)
+
+
+def _AddCommonOptions(parser):
+ parser.add_argument('--all',
+ action='store_true',
+ default=False,
+ help='Operate on all connected devices.',)
+ parser.add_argument('-d',
+ '--device',
+ action='append',
+ default=[],
+ dest='devices',
+ help='Target device for script to work on. Enter '
+ 'multiple times for multiple devices.')
+ parser.add_argument('--incremental',
+ action='store_true',
+ default=False,
+ help='Always install an incremental apk.')
+ parser.add_argument('--non-incremental',
+ action='store_true',
+ default=False,
+ help='Always install a non-incremental apk.')
+ parser.add_argument('-v',
+ '--verbose',
+ action='count',
+ default=0,
+ dest='verbose_count',
+ help='Verbose level (multiple times for more)')
+
+
+def _AddLaunchOptions(parser):
+ parser = parser.add_argument_group("launch arguments")
+ parser.add_argument('url',
+ nargs='?',
+ help='The URL this command launches.')
+
+
+def _AddArgsOptions(parser):
+ parser = parser.add_argument_group("argv arguments")
+ parser.add_argument('--args',
+ help='The flags set by the user.')
+
+
+def _DeviceCachePath(device):
+ file_name = 'device_cache_%s.json' % device.adb.GetDeviceSerial()
+ return os.path.join(constants.GetOutDirectory(), file_name)
+
+
+def Run(output_directory, apk_path, inc_apk_path, inc_install_script,
+ command_line_flags_file):
+ constants.SetOutputDirectory(output_directory)
+
+ parser = argparse.ArgumentParser()
+ command_parsers = parser.add_subparsers(title='Apk operations',
+ dest='command')
+ subp = command_parsers.add_parser('install', help='Install the apk.')
+ _AddCommonOptions(subp)
+
+ subp = command_parsers.add_parser('uninstall', help='Uninstall the apk.')
+ _AddCommonOptions(subp)
+
+ subp = command_parsers.add_parser('launch',
+ help='Launches the apk with the given '
+ 'command-line flags, and optionally the '
+ 'given URL')
+ _AddCommonOptions(subp)
+ _AddLaunchOptions(subp)
+ _AddArgsOptions(subp)
+
+ subp = command_parsers.add_parser('run', help='Install and launch.')
+ _AddCommonOptions(subp)
+ _AddLaunchOptions(subp)
+ _AddArgsOptions(subp)
+
+ subp = command_parsers.add_parser('stop', help='Stop apks on all devices')
+ _AddCommonOptions(subp)
+
+ subp = command_parsers.add_parser('clear-data',
+ help='Clear states for the given package')
+ _AddCommonOptions(subp)
+
+ subp = command_parsers.add_parser('argv',
+ help='Display and update flags on devices.')
+ _AddCommonOptions(subp)
+ _AddArgsOptions(subp)
+
+ subp = command_parsers.add_parser('gdb',
+ help='Run build/android/adb_gdb script.')
+ _AddCommonOptions(subp)
+ _AddArgsOptions(subp)
+
+ subp = command_parsers.add_parser('logcat',
+ help='Run the shell command "adb logcat".')
+ _AddCommonOptions(subp)
+
+ args = parser.parse_args()
+ run_tests_helper.SetLogLevel(args.verbose_count)
+ command = args.command
+
+ devil_chromium.Initialize()
+
+ devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices,
+ default_retries=0)
+ devices_obj = device_utils.DeviceUtils.parallel(devices)
+
+ if command in {'gdb', 'logcat'} and len(devices) > 1:
+ raise device_errors.MultipleDevicesError(devices)
+ if command in {'argv', 'stop', 'clear-data'} or len(args.devices) > 0:
+ args.all = True
+ if len(devices) > 1 and not args.all:
+ raise Exception(_GenerateMissingAllFlagMessage(devices, devices_obj))
+
+ if args.incremental and args.non_incremental:
+ raise Exception('--incremental and --non-incremental cannot be set at the '
+ 'same time.')
+ install_incremental = False
+ active_apk = None
+ apk_package = None
+ apk_name = os.path.basename(apk_path)
+ if apk_path and not os.path.exists(apk_path):
+ apk_path = None
+
+ if args.non_incremental:
+ if apk_path:
+ active_apk = apk_path
+ logging.info('Use the non-incremental apk.')
+ else:
+ raise Exception("No regular apk is available.")
+
+ if inc_apk_path and not os.path.exists(inc_apk_path):
+ inc_apk_path = None
+
+ if args.incremental:
+ if inc_apk_path:
+ active_apk = inc_apk_path
+ install_incremental = True
+ logging.info('Use the incremental apk.')
+ else:
+ raise Exception("No incremental apk is available.")
+
+ if not args.incremental and not args.non_incremental and command in {
+ 'install', 'run'}:
+ if apk_path and inc_apk_path:
+ raise Exception('Both incremental and non-incremental apks exist, please '
+ 'use --incremental or --non-incremental to select one.')
+ if not apk_path and not inc_apk_path:
+ raise Exception('Neither incremental nor non-incremental apk is '
+ 'available.')
+ if apk_path:
+ active_apk = apk_path
+ logging.info('Use the non-incremental apk.')
+ else:
+ active_apk = inc_apk_path
+ install_incremental = True
+ logging.info('Use the incremental apk.')
+
+ if apk_path is not None:
+ apk_package = apk_helper.GetPackageName(apk_path)
+ elif inc_apk_path is not None:
+ apk_package = apk_helper.GetPackageName(inc_apk_path)
+
+ # Use the cache if possible.
+ use_cache = True
+ if command in {'gdb', 'logcat'}:
+ # Only the current data is needed for these cmds.
+ use_cache = False
+ if use_cache:
+ for d in devices:
+ cache_path = _DeviceCachePath(d)
+ if os.path.exists(cache_path):
+ logging.info('Using device cache: %s', cache_path)
+ with open(cache_path) as f:
+ d.LoadCacheData(f.read())
+ # Delete the cached file so that any exceptions cause it to be cleared.
+ os.unlink(cache_path)
+ else:
+ logging.info('No cache present for device: %s', d)
+
+ if command == 'install':
+ _InstallApk(install_incremental, inc_install_script, devices_obj,
+ active_apk)
+ elif command == 'uninstall':
+ _UninstallApk(install_incremental, devices_obj, apk_package)
+ elif command == 'launch':
+ _LaunchUrl(devices_obj, args.args, command_line_flags_file,
+ args.url, apk_package)
+ elif command == 'run':
+ _InstallApk(install_incremental, inc_install_script, devices_obj,
+ active_apk)
+ devices_obj.pFinish(None)
+ _LaunchUrl(devices_obj, args.args, command_line_flags_file,
+ args.url, apk_package)
+ elif command == 'stop':
+ devices_obj.ForceStop(apk_package)
+ elif command == 'clear-data':
+ devices_obj.ClearApplicationState(apk_package)
+ elif command == 'argv':
+ _ChangeFlags(devices, devices_obj, args.args,
+ command_line_flags_file)
+ elif command == 'gdb':
+ gdb_script_path = os.path.dirname(__file__) + '/adb_gdb'
+ program_name = '--program-name=%s' % os.path.splitext(apk_name)[0]
+ package_name = '--package-name=%s' % apk_package
+ # The output directory is the one including lib* files.
+ output_dir = '--output-directory=%s' % os.path.abspath(
+ os.path.join(output_directory, os.pardir))
+ adb_path = '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath()
+ device = '--device=%s' % devices[0].adb.GetDeviceSerial()
+ flags = [gdb_script_path, program_name, package_name, output_dir, adb_path,
+ device]
+ if args.args:
+ flags += shlex.split(args.args)
+ # Enable verbose output of adb_gdb if it's set for this script.
+ if args.verbose_count > 0:
+ flags.append('--verbose')
+ logging.warning('Running: %s', ' '.join(pipes.quote(f) for f in flags))
+ os.execv(gdb_script_path, flags)
+ elif command == 'logcat':
+ adb_path = adb_wrapper.AdbWrapper.GetAdbPath()
+ flags = [adb_path, '-s', devices[0].adb.GetDeviceSerial(), 'logcat']
+ os.execv(adb_path, flags)
+
+ # Wait for all threads to finish.
+ devices_obj.pFinish(None)
+
+ # Save back to the cache.
+ if use_cache:
+ for d in devices:
+ cache_path = _DeviceCachePath(d)
+ with open(cache_path, 'w') as f:
+ f.write(d.DumpCacheData())
+ logging.info('Wrote device cache: %s', cache_path)
diff --git a/chromium/build/android/binary_size/apk_downloader.py b/chromium/build/android/binary_size/apk_downloader.py
index dcea458c15d..062930de0c6 100755
--- a/chromium/build/android/binary_size/apk_downloader.py
+++ b/chromium/build/android/binary_size/apk_downloader.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright 2017 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.
@@ -15,7 +15,7 @@ sys.path.append(os.path.join(host_paths.DIR_SOURCE_ROOT, 'build'))
import find_depot_tools # pylint: disable=import-error,unused-import
import download_from_google_storage
-CURRENT_MILESTONE = '59'
+CURRENT_MILESTONE = '60'
DEFAULT_BUCKET = 'gs://chromium-android-tools/apks'
DEFAULT_DOWNLOAD_PATH = os.path.join(os.path.dirname(__file__), 'apks')
DEFAULT_BUILDER = 'Android_Builder'
diff --git a/chromium/build/android/binary_size/apks/Android_Builder/60/ChromeModernPublic.apk.sha1 b/chromium/build/android/binary_size/apks/Android_Builder/60/ChromeModernPublic.apk.sha1
new file mode 100644
index 00000000000..add0d9eab5e
--- /dev/null
+++ b/chromium/build/android/binary_size/apks/Android_Builder/60/ChromeModernPublic.apk.sha1
@@ -0,0 +1 @@
+5ae5ce5404bd9b880cdda2f438b300a88d2b9dfe \ No newline at end of file
diff --git a/chromium/build/android/binary_size/apks/Android_Builder/60/ChromePublic.apk.sha1 b/chromium/build/android/binary_size/apks/Android_Builder/60/ChromePublic.apk.sha1
new file mode 100644
index 00000000000..79a98235e59
--- /dev/null
+++ b/chromium/build/android/binary_size/apks/Android_Builder/60/ChromePublic.apk.sha1
@@ -0,0 +1 @@
+4c3d75e982caab8e07aa3749e5a827c47cf7b8f8 \ No newline at end of file
diff --git a/chromium/build/android/binary_size/apks/Android_Builder/60/MonochromePublic.apk.sha1 b/chromium/build/android/binary_size/apks/Android_Builder/60/MonochromePublic.apk.sha1
new file mode 100644
index 00000000000..b9ed7b43fab
--- /dev/null
+++ b/chromium/build/android/binary_size/apks/Android_Builder/60/MonochromePublic.apk.sha1
@@ -0,0 +1 @@
+71f1826377f3fec2b43249a5b0215432882f7f3e \ No newline at end of file
diff --git a/chromium/build/android/binary_size/apks/Android_arm64_Builder/60/ChromeModernPublic.apk.sha1 b/chromium/build/android/binary_size/apks/Android_arm64_Builder/60/ChromeModernPublic.apk.sha1
new file mode 100644
index 00000000000..af25e0519e4
--- /dev/null
+++ b/chromium/build/android/binary_size/apks/Android_arm64_Builder/60/ChromeModernPublic.apk.sha1
@@ -0,0 +1 @@
+9bee475db96c3b63ec74d59f140c7ed6db58f2e5 \ No newline at end of file
diff --git a/chromium/build/android/binary_size/apks/Android_arm64_Builder/60/ChromePublic.apk.sha1 b/chromium/build/android/binary_size/apks/Android_arm64_Builder/60/ChromePublic.apk.sha1
new file mode 100644
index 00000000000..1a8800df5da
--- /dev/null
+++ b/chromium/build/android/binary_size/apks/Android_arm64_Builder/60/ChromePublic.apk.sha1
@@ -0,0 +1 @@
+360384a694b944560b83b2f721dc77648a1e00d4 \ No newline at end of file
diff --git a/chromium/build/android/emma_coverage_stats.py b/chromium/build/android/emma_coverage_stats.py
index 20ec8eae468..fe1775a8a24 100755
--- a/chromium/build/android/emma_coverage_stats.py
+++ b/chromium/build/android/emma_coverage_stats.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright 2015 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.
diff --git a/chromium/build/android/emma_coverage_stats_test.py b/chromium/build/android/emma_coverage_stats_test.py
index 30b409e2567..44f6dc3586a 100755
--- a/chromium/build/android/emma_coverage_stats_test.py
+++ b/chromium/build/android/emma_coverage_stats_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright 2015 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.
diff --git a/chromium/build/android/envsetup.sh b/chromium/build/android/envsetup.sh
index 0545330bb2b..701ae626c58 100755
--- a/chromium/build/android/envsetup.sh
+++ b/chromium/build/android/envsetup.sh
@@ -3,10 +3,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-# Sets up environment for building Chromium on Android.
+# Adds Android SDK tools and related helpers to PATH, useful for development.
+# Not used on bots. Use like `. build/android/envsetup.sh`.
-# Make sure we're being sourced (possibly by another script). Check for bash
-# since zsh sets $0 when sourcing.
+# Make sure we're being sourced.
if [[ -n "$BASH_VERSION" && "${BASH_SOURCE:-$0}" == "$0" ]]; then
echo "ERROR: envsetup must be sourced."
exit 1
@@ -16,47 +16,13 @@ fi
android_envsetup_main() {
local SCRIPT_PATH="$1"
local SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
+ local CHROME_SRC="$(readlink -f "${SCRIPT_DIR}/../../")"
+ local ANDROID_SDK_ROOT="${CHROME_SRC}/third_party/android_tools/sdk/"
- local CURRENT_DIR="$(readlink -f "${SCRIPT_DIR}/../../")"
- if [[ -z "${CHROME_SRC}" ]]; then
- # If $CHROME_SRC was not set, assume current directory is CHROME_SRC.
- local CHROME_SRC="${CURRENT_DIR}"
- fi
-
- if [[ "${CURRENT_DIR/"${CHROME_SRC}"/}" == "${CURRENT_DIR}" ]]; then
- # If current directory is not in $CHROME_SRC, it might be set for other
- # source tree. If $CHROME_SRC was set correctly and we are in the correct
- # directory, "${CURRENT_DIR/"${CHROME_SRC}"/}" will be "".
- # Otherwise, it will equal to "${CURRENT_DIR}"
- echo "Warning: Current directory is out of CHROME_SRC, it may not be \
- the one you want."
- echo "${CHROME_SRC}"
- fi
-
- # Allow the caller to override a few environment variables. If any of them is
- # unset, we default to a sane value that's known to work. This allows for
- # experimentation with a custom SDK.
- if [[ -z "${ANDROID_SDK_ROOT}" || ! -d "${ANDROID_SDK_ROOT}" ]]; then
- local ANDROID_SDK_ROOT="${CHROME_SRC}/third_party/android_tools/sdk/"
- fi
-
- # Add Android SDK tools to system path.
export PATH=$PATH:${ANDROID_SDK_ROOT}/platform-tools
-
- # Add Android utility tools to the system path.
export PATH=$PATH:${ANDROID_SDK_ROOT}/tools/
-
- # Add Chromium Android development scripts to system path.
- # Must be after CHROME_SRC is set.
export PATH=$PATH:${CHROME_SRC}/build/android
-
- export ENVSETUP_GYP_CHROME_SRC=${CHROME_SRC} # TODO(thakis): Remove.
}
# In zsh, $0 is the name of the file being sourced.
android_envsetup_main "${BASH_SOURCE:-$0}"
unset -f android_envsetup_main
-
-android_gyp() {
- echo "Please call build/gyp_chromium instead. android_gyp is going away."
- "${ENVSETUP_GYP_CHROME_SRC}/build/gyp_chromium" --depth="${ENVSETUP_GYP_CHROME_SRC}" --check "$@"
-}
diff --git a/chromium/build/android/gradle/generate_gradle.py b/chromium/build/android/gradle/generate_gradle.py
index 6269bfb681b..537a26adebe 100755
--- a/chromium/build/android/gradle/generate_gradle.py
+++ b/chromium/build/android/gradle/generate_gradle.py
@@ -44,6 +44,7 @@ _DEFAULT_TARGETS = [
# because it has resources as deps of android_apk() rather than using an
# android_library() intermediate target.
# '//android_webview:system_webview_apk',
+ '//android_webview/test/embedded_test_server:aw_net_test_support_apk',
'//android_webview/test:webview_instrumentation_apk',
'//android_webview/test:webview_instrumentation_test_apk',
'//base:base_junit_tests',
@@ -210,7 +211,7 @@ class _ProjectEntry(object):
def JavaFiles(self):
if self._java_files is None:
- java_sources_file = self.Gradle().get('java_sources_file')
+ java_sources_file = self.DepsInfo().get('java_sources_file')
java_files = []
if java_sources_file:
java_sources_file = _RebasePath(java_sources_file)
@@ -363,7 +364,7 @@ class _ProjectContextGenerator(object):
res_dirs.add(
os.path.join(self.EntryOutputDir(root_entry), _RES_SUBDIR))
variables['res_dirs'] = self._Relativize(root_entry, res_dirs)
- android_manifest = root_entry.Gradle().get('android_manifest')
+ android_manifest = root_entry.DepsInfo().get('android_manifest')
if not android_manifest:
android_manifest = self._GenCustomManifest(root_entry)
variables['android_manifest'] = self._Relativize(
diff --git a/chromium/build/android/gradle/root.jinja b/chromium/build/android/gradle/root.jinja
index 0d92ba5aac3..ba418b41b9e 100644
--- a/chromium/build/android/gradle/root.jinja
+++ b/chromium/build/android/gradle/root.jinja
@@ -8,6 +8,6 @@ buildscript {
jcenter()
}
dependencies {
- classpath "com.android.tools.build:gradle:2.3.2"
+ classpath "com.android.tools.build:gradle:2.3.3"
}
}
diff --git a/chromium/build/android/gyp/apk_install.py b/chromium/build/android/gyp/apk_install.py
deleted file mode 100755
index f43b0a17737..00000000000
--- a/chromium/build/android/gyp/apk_install.py
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/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.
-
-"""Installs an APK.
-
-"""
-
-import optparse
-import os
-import sys
-
-from util import build_device
-from util import build_utils
-from util import md5_check
-
-BUILD_ANDROID_DIR = os.path.abspath(
- os.path.join(os.path.dirname(__file__), '..'))
-sys.path.append(BUILD_ANDROID_DIR)
-
-import devil_chromium
-from devil.android import apk_helper
-from pylib import constants
-
-
-def HasInstallMetadataChanged(device, apk_package, metadata_path):
- """Checks if the metadata on the device for apk_package has changed."""
- if not os.path.exists(metadata_path):
- return True
-
- try:
- expected_metadata = build_utils.ReadJson(metadata_path)
- except ValueError: # File is not json encoded.
- return True
-
- return expected_metadata != device.GetInstallMetadata(apk_package)
-
-
-def RecordInstallMetadata(device, apk_package, metadata_path):
- """Records the metadata from the device for apk_package."""
- metadata = device.GetInstallMetadata(apk_package, refresh=True)
- if not metadata:
- raise Exception('APK install failed unexpectedly.')
-
- build_utils.WriteJson(metadata, metadata_path)
-
-
-def main():
- parser = optparse.OptionParser()
- parser.add_option('--apk-path',
- help='Path to .apk to install.')
- parser.add_option('--split-apk-path',
- help='Path to .apk splits (can specify multiple times, causes '
- '--install-multiple to be used.',
- action='append')
- parser.add_option('--android-sdk-tools',
- help='Path to the Android SDK build tools folder. ' +
- 'Required when using --split-apk-path.')
- parser.add_option('--install-record',
- help='Path to install record (touched only when APK is installed).')
- parser.add_option('--build-device-configuration',
- help='Path to build device configuration.')
- parser.add_option('--stamp',
- help='Path to touch on success.')
- parser.add_option('--configuration-name',
- help='The build CONFIGURATION_NAME')
- parser.add_option('--output-directory',
- help='The output directory.')
- options, _ = parser.parse_args()
-
- constants.SetBuildType(options.configuration_name)
-
- devil_chromium.Initialize(
- output_directory=os.path.abspath(options.output_directory))
-
- device = build_device.GetBuildDeviceFromPath(
- options.build_device_configuration)
- if not device:
- return
-
- serial_number = device.GetSerialNumber()
- apk_package = apk_helper.GetPackageName(options.apk_path)
-
- metadata_path = '%s.%s.device.time.stamp' % (options.apk_path, serial_number)
-
- # If the APK on the device does not match the one that was last installed by
- # the build, then the APK has to be installed (regardless of the md5 record).
- force_install = HasInstallMetadataChanged(device, apk_package, metadata_path)
-
-
- def Install():
- if options.split_apk_path:
- device.InstallSplitApk(options.apk_path, options.split_apk_path)
- else:
- device.Install(options.apk_path, reinstall=True)
-
- RecordInstallMetadata(device, apk_package, metadata_path)
- build_utils.Touch(options.install_record)
-
-
- record_path = '%s.%s.md5.stamp' % (options.apk_path, serial_number)
- md5_check.CallAndRecordIfStale(
- Install,
- record_path=record_path,
- input_paths=[options.apk_path],
- force=force_install)
-
- if options.stamp:
- build_utils.Touch(options.stamp)
-
-
-if __name__ == '__main__':
- sys.exit(main())
diff --git a/chromium/build/android/gyp/create_apk_operations_script.py b/chromium/build/android/gyp/create_apk_operations_script.py
new file mode 100755
index 00000000000..534b4cc076d
--- /dev/null
+++ b/chromium/build/android/gyp/create_apk_operations_script.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+# Copyright 2017 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.
+
+
+import argparse
+import os
+import string
+import sys
+
+
+SCRIPT_TEMPLATE = string.Template("""\
+#!/usr/bin/env python
+#
+# This file was generated by build/android/gyp/create_apk_operations_script.py
+
+import os
+import sys
+
+def main():
+ script_directory = os.path.dirname(__file__)
+ resolve = lambda p: p if p is None else os.path.abspath(os.path.join(
+ script_directory, p))
+ sys.path.append(resolve(${APK_OPERATIONS_DIR}))
+ import apk_operations
+ apk_operations.Run(output_directory=resolve(${OUTPUT_DIR}),
+ apk_path=resolve(${APK_PATH}),
+ inc_apk_path=resolve(${INC_APK_PATH}),
+ inc_install_script=resolve(${INC_INSTALL_SCRIPT}),
+ command_line_flags_file=${FLAGS_FILE})
+
+
+if __name__ == '__main__':
+ sys.exit(main())
+""")
+
+
+def main(args):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--script-output-path',
+ help='Output path for executable script.')
+ parser.add_argument('--apk-path')
+ parser.add_argument('--incremental-apk-path')
+ parser.add_argument('--incremental-install-script')
+ parser.add_argument('--command-line-flags-file')
+ args = parser.parse_args(args)
+
+ def relativize(path):
+ """Returns the path relative to the output script directory."""
+ if path is None:
+ return path
+ return os.path.relpath(path, os.path.dirname(args.script_output_path))
+ apk_operations_dir = os.path.join(os.path.dirname(__file__), os.path.pardir)
+ apk_operations_dir = relativize(apk_operations_dir)
+
+ with open(args.script_output_path, 'w') as script:
+ script_dict = {
+ 'APK_OPERATIONS_DIR': repr(apk_operations_dir),
+ 'OUTPUT_DIR': repr('.'),
+ 'APK_PATH': repr(relativize(args.apk_path)),
+ 'INC_APK_PATH': repr(relativize(args.incremental_apk_path)),
+ 'INC_INSTALL_SCRIPT': repr(relativize(args.incremental_install_script)),
+ 'FLAGS_FILE': repr(args.command_line_flags_file),
+ }
+ script.write(SCRIPT_TEMPLATE.substitute(script_dict))
+ os.chmod(args.script_output_path, 0750)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/chromium/build/android/gyp/java_google_api_keys.py b/chromium/build/android/gyp/java_google_api_keys.py
index 95cb416cd5c..e20d578e9ed 100755
--- a/chromium/build/android/gyp/java_google_api_keys.py
+++ b/chromium/build/android/gyp/java_google_api_keys.py
@@ -99,7 +99,6 @@ def _DoMain(argv):
values = {}
values['GOOGLE_API_KEY'] = google_api_keys.GetAPIKey()
- values['GOOGLE_API_KEY_REMOTING'] = google_api_keys.GetAPIKeyRemoting()
values['GOOGLE_API_KEY_PHYSICAL_WEB_TEST'] = (google_api_keys.
GetAPIKeyPhysicalWebTest())
values['GOOGLE_CLIENT_ID_MAIN'] = google_api_keys.GetClientID('MAIN')
diff --git a/chromium/build/android/gyp/lint.py b/chromium/build/android/gyp/lint.py
index ea9055cfb82..22d05061fba 100755
--- a/chromium/build/android/gyp/lint.py
+++ b/chromium/build/android/gyp/lint.py
@@ -23,7 +23,7 @@ _SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__),
def _OnStaleMd5(lint_path, config_path, processed_config_path,
manifest_path, result_path, product_dir, sources, jar_path,
- cache_dir, android_sdk_version, resource_sources,
+ cache_dir, android_sdk_version, srcjars, resource_sources,
disable=None, classpath=None, can_fail_build=False,
silent=False):
def _RebasePath(path):
@@ -150,6 +150,14 @@ def _OnStaleMd5(lint_path, config_path, processed_config_path,
cmd.extend(['--sources', _RebasePath(src_dir)])
os.symlink(os.path.abspath(src), PathInDir(src_dir, src))
+ if srcjars:
+ srcjar_paths = build_utils.ParseGnList(srcjars)
+ if srcjar_paths:
+ srcjar_dir = _NewTempSubdir('SRC_ROOT')
+ cmd.extend(['--sources', _RebasePath(srcjar_dir)])
+ for srcjar in srcjar_paths:
+ build_utils.ExtractAll(srcjar, path=srcjar_dir)
+
if disable:
cmd.extend(['--disable', ','.join(disable)])
@@ -287,6 +295,8 @@ def main():
help='Directories containing java files.')
parser.add_argument('--stamp',
help='Path to touch on success.')
+ parser.add_argument('--srcjars',
+ help='GN list of included srcjars.')
args = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:]))
@@ -358,6 +368,7 @@ def main():
args.jar_path,
args.cache_dir,
args.android_sdk_version,
+ args.srcjars,
resource_sources,
disable=disable,
classpath=classpath,
diff --git a/chromium/build/android/gyp/merge_manifest.py b/chromium/build/android/gyp/merge_manifest.py
new file mode 100755
index 00000000000..93769e19dc4
--- /dev/null
+++ b/chromium/build/android/gyp/merge_manifest.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+
+# Copyright 2017 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.
+
+"""Merges dependency Android manifests into a root manifest."""
+
+import argparse
+import contextlib
+import os
+import sys
+import tempfile
+import xml.dom.minidom as minidom
+
+from util import build_utils
+
+# Tools library directory - relative to Android SDK root
+SDK_TOOLS_LIB_DIR = os.path.join('tools', 'lib')
+
+MANIFEST_MERGER_MAIN_CLASS = 'com.android.manifmerger.Merger'
+MANIFEST_MERGER_JARS = [
+ 'common{suffix}.jar',
+ 'manifest-merger{suffix}.jar',
+ 'sdk-common{suffix}.jar',
+ 'sdklib{suffix}.jar',
+]
+
+TOOLS_NAMESPACE_PREFIX = 'tools'
+TOOLS_NAMESPACE = 'http://schemas.android.com/tools'
+
+
+@contextlib.contextmanager
+def _PatchedManifest(manifest_path):
+ """Patches an Android manifest to always include the 'tools' namespace
+ declaration, as it is not propagated by the manifest merger from the SDK.
+
+ See https://issuetracker.google.com/issues/63411481
+ """
+ doc = minidom.parse(manifest_path)
+ manifests = doc.getElementsByTagName('manifest')
+ assert len(manifests) == 1
+ manifest = manifests[0]
+
+ manifest.setAttribute('xmlns:%s' % TOOLS_NAMESPACE_PREFIX, TOOLS_NAMESPACE)
+
+ tmp_prefix = os.path.basename(manifest_path)
+ with tempfile.NamedTemporaryFile(prefix=tmp_prefix) as patched_manifest:
+ doc.writexml(patched_manifest)
+ patched_manifest.flush()
+ yield patched_manifest.name
+
+
+def _BuildManifestMergerClasspath(build_vars):
+ return ':'.join([
+ os.path.join(
+ build_vars['android_sdk_root'],
+ SDK_TOOLS_LIB_DIR,
+ jar.format(suffix=build_vars['android_sdk_tools_version_suffix']))
+ for jar in MANIFEST_MERGER_JARS
+ ])
+
+
+def main(argv):
+ argv = build_utils.ExpandFileArgs(argv)
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument('--build-vars',
+ help='Path to GN build vars file',
+ required=True)
+ parser.add_argument('--root-manifest',
+ help='Root manifest which to merge into',
+ required=True)
+ parser.add_argument('--output', help='Output manifest path', required=True)
+ parser.add_argument('--extras',
+ help='GN list of additional manifest to merge')
+ args = parser.parse_args(argv)
+
+ cmd = [
+ 'java',
+ '-cp',
+ _BuildManifestMergerClasspath(build_utils.ReadBuildVars(args.build_vars)),
+ MANIFEST_MERGER_MAIN_CLASS,
+ '--out', args.output,
+ ]
+
+ extras = build_utils.ParseGnList(args.extras)
+ if extras:
+ cmd += ['--libs', ':'.join(extras)]
+
+ with _PatchedManifest(args.root_manifest) as root_manifest:
+ cmd += ['--main', root_manifest]
+ build_utils.CheckOutput(cmd,
+ # https://issuetracker.google.com/issues/63514300: The merger doesn't set
+ # a nonzero exit code for failures.
+ fail_func=lambda returncode, stderr: returncode != 0 or
+ build_utils.IsTimeStale(args.output, [root_manifest] + extras))
+
+
+if __name__ == '__main__':
+ main(sys.argv[1:])
diff --git a/chromium/build/android/gyp/package_resources.py b/chromium/build/android/gyp/package_resources.py
index e5e91c90914..c2ba88938a8 100755
--- a/chromium/build/android/gyp/package_resources.py
+++ b/chromium/build/android/gyp/package_resources.py
@@ -13,10 +13,12 @@ https://android.googlesource.com/platform/sdk/+/master/files/ant/build.xml
"""
# pylint: enable=C0301
+import multiprocessing.pool
import optparse
import os
import re
import shutil
+import subprocess
import sys
import zipfile
@@ -88,6 +90,10 @@ DENSITY_SPLITS = {
}
+_PNG_TO_WEBP_ARGS = [
+ '-mt', '-quiet', '-m', '6', '-q', '100', '-lossless', '-o']
+
+
def _ParseArgs(args):
"""Parses command line options.
@@ -135,9 +141,18 @@ def _ParseArgs(args):
help='GN list of languages to include. All other language '
'configs will be stripped out. List may include '
'a combination of Android locales or Chrome locales.')
-
parser.add_option('--apk-path',
help='Path to output (partial) apk.')
+ parser.add_option('--exclude-xxxhdpi', action='store_true',
+ help='Do not include xxxhdpi drawables.')
+ parser.add_option('--xxxhdpi-whitelist',
+ default='[]',
+ help='GN list of globs that say which xxxhdpi images to '
+ 'include even when --exclude-xxxhdpi is set.')
+ parser.add_option('--png-to-webp', action='store_true',
+ help='Convert png files to webp format.')
+ parser.add_option('--webp-binary', default='',
+ help='Path to the cwebp binary.')
options, positional_args = parser.parse_args(args)
@@ -154,6 +169,7 @@ def _ParseArgs(args):
options.resource_zips = build_utils.ParseGnList(options.resource_zips)
options.language_splits = build_utils.ParseGnList(options.language_splits)
options.locale_whitelist = build_utils.ParseGnList(options.locale_whitelist)
+ options.xxxhdpi_whitelist = build_utils.ParseGnList(options.xxxhdpi_whitelist)
return options
@@ -208,7 +224,7 @@ def PackageArgsForExtractedZip(d):
"""
subdirs = [os.path.join(d, s) for s in os.listdir(d)]
subdirs = [s for s in subdirs if os.path.isdir(s)]
- is_multi = '0' in [os.path.basename(s) for s in subdirs]
+ is_multi = any(os.path.basename(s).isdigit() for s in subdirs)
if is_multi:
res_dirs = sorted(subdirs, key=lambda p : int(os.path.basename(p)))
else:
@@ -302,15 +318,68 @@ def _ConstructMostAaptArgs(options):
return package_command
+def _ResourceNameFromPath(path):
+ return os.path.splitext(os.path.basename(path))[0]
+
+
+def _CreateExtractPredicate(dep_zips, exclude_xxxhdpi, xxxhdpi_whitelist):
+ if not exclude_xxxhdpi:
+ # Do not extract dotfiles (e.g. ".gitkeep"). aapt ignores them anyways.
+ return lambda path: os.path.basename(path)[0] != '.'
+
+ # Returns False only for xxxhdpi non-mipmap, non-whitelisted drawables.
+ naive_predicate = lambda path: (
+ not re.search(r'[/-]xxxhdpi[/-]', path) or
+ re.search(r'[/-]mipmap[/-]', path) or
+ build_utils.MatchesGlob(path, xxxhdpi_whitelist))
+
+ # Build a set of all non-xxxhdpi drawables to ensure that we never exclude any
+ # xxxhdpi drawable that does not exist in other densities.
+ non_xxxhdpi_drawables = set()
+ for resource_zip_path in dep_zips:
+ with zipfile.ZipFile(resource_zip_path) as zip_file:
+ for path in zip_file.namelist():
+ if re.search(r'[/-]drawable[/-]', path) and naive_predicate(path):
+ non_xxxhdpi_drawables.add(_ResourceNameFromPath(path))
+
+ return lambda path: (naive_predicate(path) or
+ _ResourceNameFromPath(path) not in non_xxxhdpi_drawables)
+
+
+def _ConvertToWebP(webp_binary, png_files):
+ pool = multiprocessing.pool.ThreadPool(10)
+ def convert_image(png_path):
+ root = os.path.splitext(png_path)[0]
+ webp_path = root + '.webp'
+ args = [webp_binary, png_path] + _PNG_TO_WEBP_ARGS + [webp_path]
+ subprocess.check_call(args)
+ os.remove(png_path)
+ # Android requires pngs for 9-patch images.
+ pool.map(convert_image, [f for f in png_files if not f.endswith('.9.png')])
+ pool.close()
+ pool.join()
+
+
def _OnStaleMd5(package_command, options):
with build_utils.TempDir() as temp_dir:
if options.resource_zips:
dep_zips = options.resource_zips
+ extract_predicate = _CreateExtractPredicate(
+ dep_zips, options.exclude_xxxhdpi, options.xxxhdpi_whitelist)
+ png_paths = []
+ package_subdirs = []
for z in dep_zips:
subdir = os.path.join(temp_dir, os.path.basename(z))
if os.path.exists(subdir):
raise Exception('Resource zip name conflict: ' + os.path.basename(z))
- build_utils.ExtractAll(z, path=subdir)
+ extracted_files = build_utils.ExtractAll(
+ z, path=subdir, predicate=extract_predicate)
+ if extracted_files:
+ package_subdirs.append(subdir)
+ png_paths.extend(f for f in extracted_files if f.endswith('.png'))
+ if png_paths and options.png_to_webp:
+ _ConvertToWebP(options.webp_binary, png_paths)
+ for subdir in package_subdirs:
package_command += PackageArgsForExtractedZip(subdir)
build_utils.CheckOutput(
@@ -330,7 +399,7 @@ def main(args):
package_command = _ConstructMostAaptArgs(options)
- output_paths = [ options.apk_path ]
+ output_paths = [options.apk_path]
if options.create_density_splits:
for _, dst_path in _GenerateDensitySplitPaths(options.apk_path):
@@ -339,10 +408,13 @@ def main(args):
_GenerateLanguageSplitOutputPaths(options.apk_path,
options.language_splits))
- input_paths = [ options.android_manifest ] + options.resource_zips
+ input_paths = [options.android_manifest] + options.resource_zips
- input_strings = []
+ input_strings = [options.exclude_xxxhdpi] + options.xxxhdpi_whitelist
input_strings.extend(package_command)
+ if options.png_to_webp:
+ # This is necessary to ensure conversion if the option is toggled.
+ input_strings.extend("png_to_webp")
# The md5_check.py doesn't count file path in md5 intentionally,
# in order to repackage resources when assets' name changed, we need
diff --git a/chromium/build/android/gyp/process_resources.py b/chromium/build/android/gyp/process_resources.py
index 9174e095254..c7c0a56d906 100755
--- a/chromium/build/android/gyp/process_resources.py
+++ b/chromium/build/android/gyp/process_resources.py
@@ -550,10 +550,14 @@ def main(args):
input_paths.extend(options.dependencies_res_zips)
input_paths.extend(options.extra_r_text_files)
+ # Resource files aren't explicitly listed in GN. Listing them in the depfile
+ # ensures the target will be marked stale when resource files are removed.
+ depfile_deps = []
resource_names = []
for resource_dir in options.resource_dirs:
for resource_file in build_utils.FindInDirectory(resource_dir, '*'):
input_paths.append(resource_file)
+ depfile_deps.append(resource_file)
resource_names.append(os.path.relpath(resource_file, resource_dir))
# Resource filenames matter to the output, so add them to strings as well.
@@ -567,7 +571,8 @@ def main(args):
input_strings=input_strings,
output_paths=output_paths,
# TODO(agrieve): Remove R_dir when it's no longer used (used only by GYP).
- force=options.R_dir)
+ force=options.R_dir,
+ depfile_deps=depfile_deps)
if __name__ == '__main__':
diff --git a/chromium/build/android/gyp/proguard.py b/chromium/build/android/gyp/proguard.py
index 8cfa27b7da6..a15e5187da1 100755
--- a/chromium/build/android/gyp/proguard.py
+++ b/chromium/build/android/gyp/proguard.py
@@ -102,7 +102,8 @@ def main(args):
options,
input_paths=input_paths,
input_strings=proguard.build(),
- output_paths=[options.output_path])
+ output_paths=[options.output_path],
+ depfile_deps=proguard.GetDepfileDeps())
if __name__ == '__main__':
diff --git a/chromium/build/android/gyp/util/build_utils.py b/chromium/build/android/gyp/util/build_utils.py
index 7b2f48dd59b..95f81cd8a40 100644
--- a/chromium/build/android/gyp/util/build_utils.py
+++ b/chromium/build/android/gyp/util/build_utils.py
@@ -21,6 +21,7 @@ import zipfile
import md5_check # pylint: disable=relative-import
sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
+from pylib import constants
from pylib.constants import host_paths
sys.path.append(os.path.join(os.path.dirname(__file__),
@@ -81,6 +82,14 @@ def FindInDirectories(directories, filename_filter):
return all_files
+def ReadBuildVars(build_vars_path=None):
+ if not build_vars_path:
+ build_vars_path = os.path.join(constants.GetOutDirectory(),
+ "build_vars.txt")
+ with open(build_vars_path) as f:
+ return dict(l.rstrip().split('=', 1) for l in f)
+
+
def ParseGnList(gn_string):
"""Converts a command-line parameter into a list.
@@ -262,7 +271,7 @@ def AddToZipHermetic(zip_file, zip_path, src_path=None, data=None,
zip_path: Destination path within the zip file.
src_path: Path of the source file. Mutually exclusive with |data|.
data: File data as a string.
- compress: Whether to enable compression. Default is take from ZipFile
+ compress: Whether to enable compression. Default is taken from ZipFile
constructor.
"""
assert (src_path is None) != (data is None), (
@@ -294,13 +303,15 @@ def AddToZipHermetic(zip_file, zip_path, src_path=None, data=None,
zip_file.writestr(zipinfo, data, compress_type)
-def DoZip(inputs, output, base_dir=None):
+def DoZip(inputs, output, base_dir=None, compress_fn=None):
"""Creates a zip file from a list of files.
Args:
inputs: A list of paths to zip, or a list of (zip_path, fs_path) tuples.
output: Destination .zip file.
base_dir: Prefix to strip from inputs.
+ compress_fn: Applied to each input to determine whether or not to compress.
+ By default, items will be |zipfile.ZIP_STORED|.
"""
input_tuples = []
for tup in inputs:
@@ -312,16 +323,17 @@ def DoZip(inputs, output, base_dir=None):
input_tuples.sort(key=lambda tup: tup[0])
with zipfile.ZipFile(output, 'w') as outfile:
for zip_path, fs_path in input_tuples:
- AddToZipHermetic(outfile, zip_path, src_path=fs_path)
+ compress = compress_fn(zip_path) if compress_fn else None
+ AddToZipHermetic(outfile, zip_path, src_path=fs_path, compress=compress)
-def ZipDir(output, base_dir):
+def ZipDir(output, base_dir, compress_fn=None):
"""Creates a zip file from a directory."""
inputs = []
for root, _, files in os.walk(base_dir):
for f in files:
inputs.append(os.path.join(root, f))
- DoZip(inputs, output, base_dir)
+ DoZip(inputs, output, base_dir, compress_fn=compress_fn)
def MatchesGlob(path, filters):
diff --git a/chromium/build/android/gyp/util/proguard_util.py b/chromium/build/android/gyp/util/proguard_util.py
index 6fc57d9f160..dd1f06c202c 100644
--- a/chromium/build/android/gyp/util/proguard_util.py
+++ b/chromium/build/android/gyp/util/proguard_util.py
@@ -150,25 +150,35 @@ class ProguardCmdBuilder(object):
self._cmd = cmd
return self._cmd
- def GetInputs(self):
+ def GetDepfileDeps(self):
+ # The list of inputs that the GN target does not directly know about.
self.build()
- inputs = [self._proguard_jar_path] + self._configs + self._injars
- if self._mapping:
- inputs.append(self._mapping)
+ inputs = self._configs + self._injars
if self._libraries:
inputs += self._libraries
if self._tested_apk_info_path:
inputs += [self._tested_apk_info_path]
return inputs
+ def GetInputs(self):
+ inputs = self.GetDepfileDeps()
+ inputs += [self._proguard_jar_path]
+ if self._mapping:
+ inputs.append(self._mapping)
+ return inputs
+
def _WriteFlagsFile(self, out):
# Quite useful for auditing proguard flags.
- for config in self._configs:
+ for config in sorted(self._configs):
out.write('#' * 80 + '\n')
out.write(config + '\n')
out.write('#' * 80 + '\n')
with open(config) as config_file:
- out.write(config_file.read().rstrip())
+ contents = config_file.read().rstrip()
+ # Remove numbers from generated rule comments to make file more
+ # diff'able.
+ contents = re.sub(r' #generated:\d+', '', contents)
+ out.write(contents)
out.write('\n\n')
out.write('#' * 80 + '\n')
out.write('Command-line\n')
diff --git a/chromium/build/android/gyp/write_build_config.py b/chromium/build/android/gyp/write_build_config.py
index 2da62f84eb8..c2dee9a5156 100755
--- a/chromium/build/android/gyp/write_build_config.py
+++ b/chromium/build/android/gyp/write_build_config.py
@@ -410,13 +410,16 @@ def main(argv):
deps_info['gradle_treat_as_prebuilt'] = options.gradle_treat_as_prebuilt
if options.android_manifest:
- gradle['android_manifest'] = options.android_manifest
+ deps_info['android_manifest'] = options.android_manifest
+
if options.type in ('java_binary', 'java_library', 'android_apk'):
if options.java_sources_file:
- gradle['java_sources_file'] = options.java_sources_file
+ deps_info['java_sources_file'] = options.java_sources_file
if options.bundled_srcjars:
gradle['bundled_srcjars'] = (
build_utils.ParseGnList(options.bundled_srcjars))
+ else:
+ gradle['bundled_srcjars'] = []
gradle['dependent_android_projects'] = []
gradle['dependent_java_projects'] = []
@@ -434,6 +437,14 @@ def main(argv):
gradle['dependent_java_projects'].append(c['path'])
+ if options.type == 'android_apk':
+ config['jni'] = {}
+ all_java_sources = [c['java_sources_file'] for c in all_library_deps
+ if 'java_sources_file' in c]
+ if options.java_sources_file:
+ all_java_sources.append(options.java_sources_file)
+ config['jni']['all_source'] = all_java_sources
+
if (options.type in ('java_binary', 'java_library')):
deps_info['requires_android'] = options.requires_android
deps_info['supports_android'] = options.supports_android
@@ -696,6 +707,9 @@ def main(argv):
config['uncompressed_locales_java_list'] = (
_CreateLocalePaksAssetJavaList(config['uncompressed_assets']))
+ config['extra_android_manifests'] = filter(None, (
+ d.get('android_manifest') for d in all_resources_deps))
+
# Collect java resources
java_resources_jars = [d['java_resources_jar'] for d in all_library_deps
if 'java_resources_jar' in d]
diff --git a/chromium/build/android/incremental_install/installer.py b/chromium/build/android/incremental_install/installer.py
index a35cc93d199..54abf7645c1 100755
--- a/chromium/build/android/incremental_install/installer.py
+++ b/chromium/build/android/incremental_install/installer.py
@@ -128,8 +128,8 @@ def Install(device, apk, split_globs=None, native_libs=None, dex_files=None,
# Push .so and .dex files to the device (if they have changed).
def do_push_files():
+ push_native_timer.Start()
if native_libs:
- push_native_timer.Start()
with build_utils.TempDir() as temp_dir:
device_lib_dir = posixpath.join(device_incremental_dir, 'lib')
for path in native_libs:
@@ -138,10 +138,10 @@ def Install(device, apk, split_globs=None, native_libs=None, dex_files=None,
shutil.copy(path, os.path.join(temp_dir, os.path.basename(path)))
device.PushChangedFiles([(temp_dir, device_lib_dir)],
delete_device_stale=True)
- push_native_timer.Stop(log=False)
+ push_native_timer.Stop(log=False)
+ push_dex_timer.Start()
if dex_files:
- push_dex_timer.Start()
# Put all .dex files to be pushed into a temporary directory so that we
# can use delete_device_stale=True.
with build_utils.TempDir() as temp_dir:
@@ -155,7 +155,7 @@ def Install(device, apk, split_globs=None, native_libs=None, dex_files=None,
shutil.copy(src_path, os.path.join(temp_dir, dest_name))
device.PushChangedFiles([(temp_dir, device_dex_dir)],
delete_device_stale=True)
- push_dex_timer.Stop(log=False)
+ push_dex_timer.Stop(log=False)
def check_selinux():
# Marshmallow has no filesystem access whatsoever. It might be possible to
diff --git a/chromium/build/android/lint/OWNERS b/chromium/build/android/lint/OWNERS
new file mode 100644
index 00000000000..f47bc2f63a9
--- /dev/null
+++ b/chromium/build/android/lint/OWNERS
@@ -0,0 +1,2 @@
+estevenson@chromium.org
+wnwen@chromium.org
diff --git a/chromium/build/android/lint/suppress.py b/chromium/build/android/lint/suppress.py
index 32774586720..a3719c18fec 100755
--- a/chromium/build/android/lint/suppress.py
+++ b/chromium/build/android/lint/suppress.py
@@ -9,8 +9,8 @@
# pylint: disable=no-member
+import argparse
import collections
-import optparse
import os
import re
import sys
@@ -23,7 +23,8 @@ from pylib.constants import host_paths
_TMP_DIR_RE = re.compile(r'^/tmp/.*/(SRC_ROOT[0-9]+|PRODUCT_DIR)/')
_THIS_FILE = os.path.abspath(__file__)
-_CONFIG_PATH = os.path.join(os.path.dirname(_THIS_FILE), 'suppressions.xml')
+_DEFAULT_CONFIG_PATH = os.path.join(os.path.dirname(_THIS_FILE),
+ 'suppressions.xml')
_DOC = (
'\nSTOP! It looks like you want to suppress some lint errors:\n'
'- Have you tried identifing the offending patch?\n'
@@ -76,8 +77,12 @@ def _ParseAndMergeResultFile(result_path, issues_dict):
issue_id = issue.attributes['id'].value
severity = issue.attributes['severity'].value
path = issue.getElementsByTagName('location')[0].attributes['file'].value
- # Strip temporary file path and use regex instead of path.
- regexp = re.sub(_TMP_DIR_RE, '', path)
+ # Strip temporary file path.
+ path = re.sub(_TMP_DIR_RE, '', path)
+ # Escape Java inner class name separator and suppress with regex instead
+ # of path. Doesn't use re.escape() as it is a bit too aggressive and
+ # escapes '_', causing trouble with PRODUCT_DIR.
+ regexp = path.replace('$', r'\$')
if issue_id not in issues_dict:
issues_dict[issue_id] = _Issue(severity, set(), set())
issues_dict[issue_id].regexps.add(regexp)
@@ -117,13 +122,16 @@ def _Suppress(config_path, result_path):
def main():
- parser = optparse.OptionParser(usage='%prog RESULT-FILE')
- _, args = parser.parse_args()
-
- if len(args) != 1 or not os.path.exists(args[0]):
- parser.error('Must provide RESULT-FILE')
-
- _Suppress(_CONFIG_PATH, args[0])
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument('--config',
+ help='Path to suppression.xml config file',
+ default=_DEFAULT_CONFIG_PATH)
+ parser.add_argument('result_path',
+ help='Lint results xml file',
+ metavar='RESULT_FILE')
+ args = parser.parse_args()
+
+ _Suppress(args.config, args.result_path)
if __name__ == '__main__':
diff --git a/chromium/build/android/lint/suppressions.xml b/chromium/build/android/lint/suppressions.xml
index 177d70726ed..a1a4789ba98 100644
--- a/chromium/build/android/lint/suppressions.xml
+++ b/chromium/build/android/lint/suppressions.xml
@@ -103,7 +103,9 @@ Still reading?
</issue>
<issue id="IconDensities">
<!-- The large assets below only include a few densities to reduce APK size. -->
- <ignore regexp=": data_reduction_illustration.png, physical_web_logo.png, physical_web_logo_anim1.png, physical_web_logo_anim2.png$"/>
+ <ignore regexp="data_reduction_illustration.png"/>
+ <!-- This is intentional to save on WebAPKs' size. -->
+ <ignore regexp="chrome/android/webapk/shell_apk/res/drawable-*"/>
<!-- crbug.com/457918 is tracking missing assets -->
<ignore regexp="chrome/android/java/res/drawable-xxhdpi"/>
<ignore regexp="chrome/android/java/res/drawable-xxxhdpi"/>
@@ -187,15 +189,10 @@ Still reading?
<issue id="MissingVersion">
<ignore path="AndroidManifest.xml"/>
</issue>
+ <!-- TODO(crbug.com/739746): Remove once platform-tools is updated. -->
+ <issue id="NewApi" severity="ignore"/>
<issue id="NewApi">
<ignore regexp="Attribute `paddingStart` referenced here can result in a crash on some specific devices older than API 17"/>
- <ignore regexp="chrome/android/java/res/drawable/downloads_big.xml"/>
- <ignore regexp="chrome/android/java/res/drawable/ic_bluetooth_connected.xml"/>
- <ignore regexp="chrome/android/java/res/drawable/ic_signal_cellular_0_bar.xml" />
- <ignore regexp="chrome/android/java/res/drawable/ic_signal_cellular_1_bar.xml" />
- <ignore regexp="chrome/android/java/res/drawable/ic_signal_cellular_2_bar.xml" />
- <ignore regexp="chrome/android/java/res/drawable/ic_signal_cellular_3_bar.xml" />
- <ignore regexp="chrome/android/java/res/drawable/ic_signal_cellular_4_bar.xml" />
<ignore regexp="chrome/android/java/res/values-v17/styles.xml"/>
<ignore regexp="chromecast/internal"/>
<ignore regexp="com/android/tv"/>
@@ -239,6 +236,7 @@ Still reading?
</issue>
<issue id="PackageManagerGetSignatures">
<ignore regexp="chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkValidator.java"/>
+ <ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/customtabs/OriginVerifier.java"/>
</issue>
<issue id="PluralsCandidate" severity="Error">
<ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-en-rGB/android_chrome_strings.xml"/>
@@ -273,6 +271,8 @@ Still reading?
<ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-sv/android_chrome_strings.xml"/>
<ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-tl/android_chrome_strings.xml"/>
</issue>
+ <!-- We have many C++ enums that we don't care about in java -->
+ <issue id="SwitchIntDef" severity="ignore"/>
<issue id="TextFields" severity="Error">
<ignore regexp="chromecast/internal"/>
</issue>
@@ -295,9 +295,14 @@ Still reading?
<ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-zh-rCN/android_chrome_strings.xml"/>
<ignore regexp="chrome/android/chrome_strings_grd.resources.zip/values-zh-rTW/android_chrome_strings.xml"/>
</issue>
+ <!-- Our generated enums are allowed to have the same values. -->
+ <issue id="UniqueConstants" severity="ignore"/>
<!-- TODO(crbug.com/635567): Fix this properly. -->
<issue id="UnusedResources" severity="ignore"/>
<issue id="UnusedResources">
+ <!-- The two dimens below will be changing soon so please leave them in -->
+ <ignore regexp="design_bottom_navigation_text_size"/>
+ <ignore regexp="design_bottom_navigation_active_text_size"/>
<ignore regexp="PRODUCT_DIR/gen/remoting/android/remoting_android_raw_resources/res/raw/credits.html"/>
<ignore regexp="PRODUCT_DIR/gen/remoting/android/remoting_android_raw_resources/res/raw/credits_css.css"/>
<ignore regexp="PRODUCT_DIR/gen/remoting/android/remoting_android_raw_resources/res/raw/credits_js.js"/>
@@ -309,10 +314,8 @@ Still reading?
<ignore regexp="android_webview/tools/automated_ui_tests/java/res/"/>
<!-- TODO(crbug.com/635567): Fix this properly. -->
<ignore regexp="chrome/android/java/res/drawable-hdpi/*"/>
- <ignore regexp="chrome/android/java/res/drawable-hdpi/bubble_white.9.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/cvc_icon.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/cvc_icon_amex.png"/>
- <ignore regexp="chrome/android/java/res/drawable-hdpi/ic_folder_white_24dp.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/ic_settings.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/infobar_3d_blocked.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/infobar_autofill_cc.png"/>
@@ -331,12 +334,9 @@ Still reading?
<ignore regexp="chrome/android/java/res/drawable-hdpi/pageinfo_bad.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/pageinfo_good.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/pageinfo_warning.png"/>
- <ignore regexp="chrome/android/java/res/drawable-hdpi/permission_images.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/pr_generic.png"/>
- <ignore regexp="chrome/android/java/res/drawable-hdpi/progress_bar_background_white.9.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/shortcut_incognito.png"/>
<ignore regexp="chrome/android/java/res/drawable-hdpi/shortcut_newtab.png"/>
- <ignore regexp="chrome/android/java/res/drawable-hdpi/signin_promo_illustration.png"/>
<ignore regexp="chrome/android/java/res/drawable-nodpi/missing.png"/>
<ignore regexp="chrome/android/java/res/values-v17/styles.xml"/>
<ignore regexp="chromecast/browser/android/apk/res/values/strings.xml"/>
@@ -353,7 +353,6 @@ Still reading?
<ignore regexp="remoting/android/java/res/drawable-hdpi/ic_zoom_in.png"/>
<ignore regexp="remoting/android/java/res/drawable-hdpi/ic_zoom_out.png"/>
<ignore regexp="remoting/android/java/res/layout/navigation_list_item.xml"/>
- <ignore regexp="remoting/android/java/res/mipmap-hdpi/logo_remote_desktop_launcher.png"/>
<ignore regexp="remoting/android/java/res/values-v17/styles.xml"/>
<!-- Used by Android's policies system -->
<ignore regexp="restriction_values.xml"/>
@@ -468,4 +467,8 @@ Still reading?
<ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/payments/ui/EditorDialog.java"/>
<ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/signin/SigninAndSyncView.java"/>
</issue>
+ <issue id="IconLauncherFormat" severity="ignore">
+ <!-- TODO(crbug.com/739746): Remove after lint version has been updated. -->
+ <ignore regexp="remoting/android/java/res/mipmap-anydpi-v26/ic_launcher.xml"/>
+ </issue>
</lint>
diff --git a/chromium/build/android/play_services/update.py b/chromium/build/android/play_services/update.py
index d1ec9553421..5297b3cfa29 100755
--- a/chromium/build/android/play_services/update.py
+++ b/chromium/build/android/play_services/update.py
@@ -47,7 +47,7 @@ CONFIG_DEFAULT_PATH = os.path.join(host_paths.DIR_SOURCE_ROOT, 'build',
LICENSE_FILE_NAME = 'LICENSE'
ZIP_FILE_NAME = 'google_play_services_library.zip'
-GMS_PACKAGE_ID = 'extra-google-m2repository' # used by sdk manager
+GMS_PACKAGE_ID = 'extras;google;m2repository' # used by sdk manager
LICENSE_PATTERN = re.compile(r'^Pkg\.License=(?P<text>.*)$', re.MULTILINE)
@@ -256,9 +256,8 @@ def UpdateSdk(args):
with open(paths.source_prop, 'w') as prop_file:
prop_file.write('Pkg.Revision=0.0.0\n')
- sdk_manager = os.path.join(args.sdk_root, 'tools', 'android')
- cmd = [sdk_manager, 'update', 'sdk', '--no-ui', '--filter', GMS_PACKAGE_ID]
- cmd_helper.Call(cmd)
+ sdk_manager = os.path.join(args.sdk_root, 'tools', 'bin', 'sdkmanager')
+ cmd_helper.Call([sdk_manager, GMS_PACKAGE_ID])
# If no update is needed, it still returns successfully so we just do nothing
return 0
diff --git a/chromium/build/android/pylib/constants/__init__.py b/chromium/build/android/pylib/constants/__init__.py
index ea7687fed6a..f68b73be85a 100644
--- a/chromium/build/android/pylib/constants/__init__.py
+++ b/chromium/build/android/pylib/constants/__init__.py
@@ -96,7 +96,7 @@ DEVICE_PERF_OUTPUT_DIR = (
SCREENSHOTS_DIR = os.path.join(DIR_SOURCE_ROOT, 'out_screenshots')
ANDROID_SDK_VERSION = version_codes.MARSHMALLOW
-ANDROID_SDK_BUILD_TOOLS_VERSION = '25.0.2'
+ANDROID_SDK_BUILD_TOOLS_VERSION = '26.0.0'
ANDROID_SDK_ROOT = os.path.join(DIR_SOURCE_ROOT,
'third_party', 'android_tools', 'sdk')
ANDROID_SDK_TOOLS = os.path.join(ANDROID_SDK_ROOT,
diff --git a/chromium/build/android/pylib/instrumentation/instrumentation_test_instance.py b/chromium/build/android/pylib/instrumentation/instrumentation_test_instance.py
index 071e73ca5fe..cb5d691f33f 100644
--- a/chromium/build/android/pylib/instrumentation/instrumentation_test_instance.py
+++ b/chromium/build/android/pylib/instrumentation/instrumentation_test_instance.py
@@ -2,9 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import collections
import copy
-import json
import logging
import os
import pickle
@@ -20,7 +18,9 @@ from pylib.constants import host_paths
from pylib.instrumentation import test_result
from pylib.instrumentation import instrumentation_parser
from pylib.utils import dexdump
+from pylib.utils import instrumentation_tracing
from pylib.utils import proguard
+from pylib.utils import shared_preference_utils
with host_paths.SysPath(host_paths.BUILD_COMMON_PATH):
import unittest_util # pylint: disable=import-error
@@ -34,7 +34,7 @@ _DEFAULT_ANNOTATIONS = [
'SmallTest', 'MediumTest', 'LargeTest', 'EnormousTest', 'IntegrationTest']
_EXCLUDE_UNLESS_REQUESTED_ANNOTATIONS = [
'DisabledTest', 'FlakyTest']
-_VALID_ANNOTATIONS = set(['Manual', 'PerfTest'] + _DEFAULT_ANNOTATIONS +
+_VALID_ANNOTATIONS = set(['Manual'] + _DEFAULT_ANNOTATIONS +
_EXCLUDE_UNLESS_REQUESTED_ANNOTATIONS)
_EXTRA_DRIVER_TEST_LIST = (
'org.chromium.test.driver.OnDeviceInstrumentationDriver.TestList')
@@ -47,12 +47,12 @@ _EXTRA_DRIVER_TARGET_CLASS = (
_EXTRA_TIMEOUT_SCALE = (
'org.chromium.test.driver.OnDeviceInstrumentationDriver.TimeoutScale')
-_PARAMETERIZED_TEST_ANNOTATION = 'ParameterizedTest'
-_PARAMETERIZED_TEST_SET_ANNOTATION = 'ParameterizedTest$Set'
+_SKIP_PARAMETERIZATION = 'SkipCommandLineParameterization'
+_COMMANDLINE_PARAMETERIZATION = 'CommandLineParameter'
_NATIVE_CRASH_RE = re.compile('(process|native) crash', re.IGNORECASE)
_CMDLINE_NAME_SEGMENT_RE = re.compile(
r' with(?:out)? \{[^\}]*\}')
-_PICKLE_FORMAT_VERSION = 11
+_PICKLE_FORMAT_VERSION = 12
class MissingSizeAnnotationError(test_exception.TestException):
@@ -157,56 +157,6 @@ def GenerateTestResults(
return results
-def ParseCommandLineFlagParameters(annotations):
- """Determines whether the test is parameterized to be run with different
- command-line flags.
-
- Args:
- annotations: The annotations of the test.
-
- Returns:
- If the test is parameterized, returns a list of named tuples
- with lists of flags, e.g.:
-
- [(add=['--flag-to-add']), (remove=['--flag-to-remove']), ()]
-
- That means, the test must be run three times, the first time with
- "--flag-to-add" added to command-line, the second time with
- "--flag-to-remove" to be removed from command-line, and the third time
- with default command-line args. If the same flag is listed both for adding
- and for removing, it is left unchanged.
-
- If the test is not parametrized, returns None.
-
- """
- ParamsTuple = collections.namedtuple('ParamsTuple', ['add', 'remove'])
- parameterized_tests = []
- if _PARAMETERIZED_TEST_SET_ANNOTATION in annotations:
- if annotations[_PARAMETERIZED_TEST_SET_ANNOTATION]:
- parameterized_tests = annotations[
- _PARAMETERIZED_TEST_SET_ANNOTATION].get('tests', [])
- elif _PARAMETERIZED_TEST_ANNOTATION in annotations:
- parameterized_tests = [annotations[_PARAMETERIZED_TEST_ANNOTATION]]
- else:
- return None
-
- result = []
- for pt in parameterized_tests:
- if not pt:
- continue
- for p in pt['parameters']:
- if p['tag'] == _COMMAND_LINE_PARAMETER:
- to_add = []
- to_remove = []
- for a in p.get('arguments', []):
- if a['name'] == 'add':
- to_add = ['--%s' % f for f in a['stringArray']]
- elif a['name'] == 'remove':
- to_remove = ['--%s' % f for f in a['stringArray']]
- result.append(ParamsTuple(to_add, to_remove))
- return result if result else None
-
-
def FilterTests(tests, test_filter=None, annotations=None,
excluded_annotations=None):
"""Filter a list of tests
@@ -313,7 +263,6 @@ def GetAllTestsFromApk(test_apk):
_SaveTestsToPickle(pickle_path, test_apk, tests)
return tests
-
def _GetTestsFromPickle(pickle_path, jar_path):
if not os.path.exists(pickle_path):
raise TestListPickleException('%s does not exist.' % pickle_path)
@@ -332,6 +281,8 @@ def _GetTestsFromPickle(pickle_path, jar_path):
return pickle_data['TEST_METHODS']
+# TODO(yolandyan): remove this once the test listing from java runner lands
+@instrumentation_tracing.no_tracing
def _GetTestsFromProguard(jar_path):
p = proguard.Dump(jar_path)
class_lookup = dict((c['class'], c) for c in p['classes'])
@@ -443,12 +394,8 @@ def GetUniqueTestName(test, sep='#'):
The unique test name as a string.
"""
display_name = GetTestName(test, sep=sep)
- if 'flags' in test:
- flags = test['flags']
- if flags.add:
- display_name = '%s with {%s}' % (display_name, ' '.join(flags.add))
- if flags.remove:
- display_name = '%s without {%s}' % (display_name, ' '.join(flags.remove))
+ if test.get('flags', [None])[0]:
+ display_name = '%s with %s' % (display_name, ' '.join(test['flags']))
return display_name
@@ -507,6 +454,9 @@ class InstrumentationTestInstance(test_instance.TestInstance):
self._edit_shared_prefs = []
self._initializeEditPrefsAttributes(args)
+ self._replace_system_package = None
+ self._initializeReplaceSystemPackageAttributes(args)
+
self._external_shard_index = args.test_launcher_shard_index
self._total_external_shards = args.test_launcher_total_shards
@@ -571,23 +521,23 @@ class InstrumentationTestInstance(test_instance.TestInstance):
self._test_package = self._test_apk.GetPackageName()
all_instrumentations = self._test_apk.GetAllInstrumentations()
- junit3_runners = [
+ test_runners = [
x for x in all_instrumentations if ('true' not in x.get(
'chromium-junit4', ''))]
- junit4_runners = [
+ test_runners_junit4 = [
x for x in all_instrumentations if ('true' in x.get(
'chromium-junit4', ''))]
- if len(junit3_runners) > 1:
+ if len(test_runners) > 1:
logging.warning('This test apk has more than one JUnit3 instrumentation')
- if len(junit4_runners) > 1:
+ if len(test_runners_junit4) > 1:
logging.warning('This test apk has more than one JUnit4 instrumentation')
self._test_runner = (
- junit3_runners[0]['android:name'] if junit3_runners else
+ test_runners[0]['android:name'] if test_runners else
self.test_apk.GetInstrumentationName())
self._test_runner_junit4 = (
- junit4_runners[0]['android:name'] if junit4_runners else None)
+ test_runners_junit4[0]['android:name'] if test_runners_junit4 else None)
self._package_info = None
if self._apk_under_test:
@@ -653,8 +603,6 @@ class InstrumentationTestInstance(test_instance.TestInstance):
self._flags.extend(flag for flag in stripped_lines if flag)
if args.strict_mode and args.strict_mode != 'off':
self._flags.append('--strict-mode=' + args.strict_mode)
- if args.regenerate_goldens:
- self._flags.append('--regenerate-goldens')
def _initializeDriverAttributes(self):
self._driver_apk = os.path.join(
@@ -689,21 +637,14 @@ class InstrumentationTestInstance(test_instance.TestInstance):
if not isinstance(args.shared_prefs_file, str):
logging.warning("Given non-string for a filepath")
return
+ self._edit_shared_prefs = shared_preference_utils.ExtractSettingsFromJson(
+ args.shared_prefs_file)
- # json.load() loads strings as unicode, which causes issues when trying
- # to edit string values in preference files, so convert to Python strings
- def unicode_to_str(data):
- if isinstance(data, dict):
- return {unicode_to_str(key): unicode_to_str(value)
- for key, value in data.iteritems()}
- elif isinstance(data, list):
- return [unicode_to_str(element) for element in data]
- elif isinstance(data, unicode):
- return data.encode('utf-8')
- return data
-
- with open(args.shared_prefs_file) as prefs_file:
- self._edit_shared_prefs = unicode_to_str(json.load(prefs_file))
+ def _initializeReplaceSystemPackageAttributes(self, args):
+ if (not hasattr(args, 'replace_system_package')
+ or not args.replace_system_package):
+ return
+ self._replace_system_package = args.replace_system_package
@property
def additional_apks(self):
@@ -762,6 +703,10 @@ class InstrumentationTestInstance(test_instance.TestInstance):
return self._render_results_dir
@property
+ def replace_system_package(self):
+ return self._replace_system_package
+
+ @property
def screenshot_dir(self):
return self._screenshot_dir
@@ -830,7 +775,7 @@ class InstrumentationTestInstance(test_instance.TestInstance):
tests = GetAllTestsFromJar(self.test_jar)
else:
tests = GetAllTestsFromApk(self.test_apk.path)
- inflated_tests = self._ParametrizeTestsWithFlags(self._InflateTests(tests))
+ inflated_tests = self._ParameterizeTestsWithFlags(self._InflateTests(tests))
if self._test_runner_junit4 is None and any(
t['is_junit4'] for t in inflated_tests):
raise MissingJUnit4RunnerException()
@@ -858,15 +803,19 @@ class InstrumentationTestInstance(test_instance.TestInstance):
})
return inflated_tests
- def _ParametrizeTestsWithFlags(self, tests):
+ def _ParameterizeTestsWithFlags(self, tests):
new_tests = []
for t in tests:
- parameters = ParseCommandLineFlagParameters(t['annotations'])
+ annotations = t['annotations']
+ parameters = None
+ if (annotations.get(_COMMANDLINE_PARAMETERIZATION)
+ and _SKIP_PARAMETERIZATION not in annotations):
+ parameters = annotations[_COMMANDLINE_PARAMETERIZATION]['value']
if parameters:
- t['flags'] = parameters[0]
+ t['flags'] = [parameters[0]]
for p in parameters[1:]:
parameterized_t = copy.copy(t)
- parameterized_t['flags'] = p
+ parameterized_t['flags'] = ['--%s' % p]
new_tests.append(parameterized_t)
return tests + new_tests
diff --git a/chromium/build/android/pylib/instrumentation/instrumentation_test_instance_test.py b/chromium/build/android/pylib/instrumentation/instrumentation_test_instance_test.py
index 301f95a191f..a71095dc82f 100755
--- a/chromium/build/android/pylib/instrumentation/instrumentation_test_instance_test.py
+++ b/chromium/build/android/pylib/instrumentation/instrumentation_test_instance_test.py
@@ -46,15 +46,13 @@ class InstrumentationTestInstanceTest(unittest.TestCase):
'command_line_flags',
'device_flags_file',
'strict_mode',
- 'regenerate_goldens',
])
def createFlagAttributesArgs(
self, command_line_flags=None, device_flags_file=None,
- strict_mode=None, regenerate_goldens=None):
+ strict_mode=None):
return self._FlagAttributesArgs(
- command_line_flags, device_flags_file, strict_mode,
- regenerate_goldens)
+ command_line_flags, device_flags_file, strict_mode)
def test_initializeFlagAttributes_commandLineFlags(self):
o = self.createTestInstance()
@@ -84,13 +82,6 @@ class InstrumentationTestInstanceTest(unittest.TestCase):
o._initializeFlagAttributes(args)
self.assertEquals(o._flags, ['--enable-test-intents'])
- def test_initializeFlagAttributes_regenerateGoldens(self):
- o = self.createTestInstance()
- args = self.createFlagAttributesArgs(regenerate_goldens=True)
- o._initializeFlagAttributes(args)
- self.assertEquals(
- o._flags, ['--enable-test-intents', '--regenerate-goldens'])
-
def testGetTests_noFilter(self):
o = self.createTestInstance()
raw_tests = [
@@ -717,6 +708,123 @@ class InstrumentationTestInstanceTest(unittest.TestCase):
self.assertEqual(1, len(results))
self.assertEqual(base_test_result.ResultType.SKIP, results[0].GetType())
+ def testCommandLineParameterization(self):
+ o = self.createTestInstance()
+ raw_tests = [
+ {
+ 'annotations': {'CommandLineParameter': {
+ 'value': ['', 'enable-features=abc']}},
+ 'class': 'org.chromium.test.SampleTest',
+ 'superclass': 'java.lang.Object',
+ 'methods': [
+ {
+ 'annotations': {'SmallTest': None},
+ 'method': 'testMethod1',
+ },
+ {
+ 'annotations': {'MediumTest': None},
+ 'method': 'testMethod2',
+ },
+ ],
+ }
+ ]
+
+ expected_tests = [
+ {
+ 'annotations': {
+ 'CommandLineParameter': {'value': ['', 'enable-features=abc']},
+ 'SmallTest': None},
+ 'class': 'org.chromium.test.SampleTest',
+ 'flags': [''],
+ 'is_junit4': True,
+ 'method': 'testMethod1'},
+ {
+ 'annotations': {
+ 'CommandLineParameter': {'value': ['', 'enable-features=abc']},
+ 'MediumTest': None},
+ 'class': 'org.chromium.test.SampleTest',
+ 'flags': [''],
+ 'is_junit4': True,
+ 'method': 'testMethod2'},
+ {
+ 'annotations': {
+ 'CommandLineParameter': {'value': ['', 'enable-features=abc']},
+ 'SmallTest': None},
+ 'class': 'org.chromium.test.SampleTest',
+ 'flags': ['--enable-features=abc'],
+ 'is_junit4': True,
+ 'method': 'testMethod1'},
+ {
+ 'annotations': {
+ 'CommandLineParameter': {'value': ['', 'enable-features=abc']},
+ 'MediumTest': None},
+ 'class': 'org.chromium.test.SampleTest',
+ 'flags': ['--enable-features=abc'],
+ 'is_junit4': True,
+ 'method': 'testMethod2'}]
+
+ o._test_jar = 'path/to/test.jar'
+ o._test_runner_junit4 = 'J4Runner'
+ with mock.patch(_INSTRUMENTATION_TEST_INSTANCE_PATH % '_GetTestsFromPickle',
+ return_value=raw_tests):
+ actual_tests = o.GetTests()
+ self.assertEquals(actual_tests, expected_tests)
+
+ def testCommandLineParameterization_skipped(self):
+ o = self.createTestInstance()
+ raw_tests = [
+ {
+ 'annotations': {'CommandLineParameter': {
+ 'value': ['', 'enable-features=abc']}},
+ 'class': 'org.chromium.test.SampleTest',
+ 'superclass': 'java.lang.Object',
+ 'methods': [
+ {
+ 'annotations': {
+ 'SmallTest': None,
+ 'SkipCommandLineParameterization': None},
+ 'method': 'testMethod1',
+ },
+ {
+ 'annotations': {'MediumTest': None},
+ 'method': 'testMethod2',
+ },
+ ],
+ }
+ ]
+
+ expected_tests = [
+ {
+ 'annotations': {
+ 'CommandLineParameter': {'value': ['', 'enable-features=abc']},
+ 'SkipCommandLineParameterization': None,
+ 'SmallTest': None},
+ 'class': 'org.chromium.test.SampleTest',
+ 'is_junit4': True,
+ 'method': 'testMethod1'},
+ {
+ 'annotations': {
+ 'CommandLineParameter': {'value': ['', 'enable-features=abc']},
+ 'MediumTest': None},
+ 'class': 'org.chromium.test.SampleTest',
+ 'flags': [''],
+ 'is_junit4': True,
+ 'method': 'testMethod2'},
+ {
+ 'annotations': {
+ 'CommandLineParameter': {'value': ['', 'enable-features=abc']},
+ 'MediumTest': None},
+ 'class': 'org.chromium.test.SampleTest',
+ 'flags': ['--enable-features=abc'],
+ 'is_junit4': True,
+ 'method': 'testMethod2'}]
+
+ o._test_jar = 'path/to/test.jar'
+ o._test_runner_junit4 = 'J4Runner'
+ with mock.patch(_INSTRUMENTATION_TEST_INSTANCE_PATH % '_GetTestsFromPickle',
+ return_value=raw_tests):
+ actual_tests = o.GetTests()
+ self.assertEquals(actual_tests, expected_tests)
if __name__ == '__main__':
unittest.main(verbosity=2)
diff --git a/chromium/build/android/pylib/instrumentation/render_test.html.jinja b/chromium/build/android/pylib/instrumentation/render_test.html.jinja
index 0f130bcdf34..b06df769e6e 100644
--- a/chromium/build/android/pylib/instrumentation/render_test.html.jinja
+++ b/chromium/build/android/pylib/instrumentation/render_test.html.jinja
@@ -14,6 +14,7 @@
</script>
</head>
<body>
+ <a href="https://cs.chromium.org/search/?q={{ test_name }}&m=100&type=cs">Link to Golden</a>
<table>
<thead>
<tr>
diff --git a/chromium/build/android/pylib/local/device/local_device_environment.py b/chromium/build/android/pylib/local/device/local_device_environment.py
index d5536c77c13..9abda2d2d66 100644
--- a/chromium/build/android/pylib/local/device/local_device_environment.py
+++ b/chromium/build/android/pylib/local/device/local_device_environment.py
@@ -22,8 +22,8 @@ from devil.utils import file_utils
from devil.utils import parallelizer
from pylib import constants
from pylib.base import environment
+from pylib.utils import instrumentation_tracing
from py_trace_event import trace_event
-from tracing_build import trace2html
def _DeviceCachePath(device):
@@ -82,7 +82,7 @@ class LocalDeviceEnvironment(environment.Environment):
self._blacklist = (device_blacklist.Blacklist(args.blacklist_file)
if args.blacklist_file
else None)
- self._device_serial = args.test_device
+ self._device_serials = args.test_devices
self._devices_lock = threading.Lock()
self._devices = None
self._concurrent_adb = args.enable_concurrent_adb
@@ -97,6 +97,9 @@ class LocalDeviceEnvironment(environment.Environment):
self._trace_output = None
if hasattr(args, 'trace_output'):
self._trace_output = args.trace_output
+ self._trace_all = None
+ if hasattr(args, 'trace_all'):
+ self._trace_all = args.trace_all
devil_chromium.Initialize(
output_directory=constants.GetOutDirectory(),
@@ -109,7 +112,12 @@ class LocalDeviceEnvironment(environment.Environment):
#override
def SetUp(self):
- if self.trace_output:
+ if self.trace_output and self._trace_all:
+ to_include = [r"pylib\..*", r"devil\..*", "__main__"]
+ to_exclude = ["logging"]
+ instrumentation_tracing.start_instrumenting(self.trace_output, to_include,
+ to_exclude)
+ elif self.trace_output:
self.EnableTracing()
def _InitDevices(self):
@@ -124,21 +132,21 @@ class LocalDeviceEnvironment(environment.Environment):
else:
logging.info(
'Read device list %s from target devices file.', str(device_arg))
- elif self._device_serial:
- device_arg = self._device_serial
+ elif self._device_serials:
+ device_arg = self._device_serials
self._devices = device_utils.DeviceUtils.HealthyDevices(
self._blacklist, enable_device_files_cache=self._enable_device_cache,
default_retries=self._max_tries - 1, device_arg=device_arg)
if not self._devices:
- raise device_errors.NoDevicesError
+ raise device_errors.NoDevicesError('No devices were available')
if self._logcat_output_file:
self._logcat_output_dir = tempfile.mkdtemp()
@handle_shard_failures_with(on_failure=self.BlacklistDevice)
def prepare_device(d):
- d.WaitUntilFullyBooted(timeout=10)
+ d.WaitUntilFullyBooted()
if self._enable_device_cache:
cache_path = _DeviceCachePath(d)
@@ -161,15 +169,6 @@ class LocalDeviceEnvironment(environment.Environment):
self.parallel_devices.pMap(prepare_device)
- @staticmethod
- def _JsonToTrace(json_path, html_path, delete_json=True):
- # First argument is call site.
- cmd = [__file__, json_path, '--title', 'Android Test Runner Trace',
- '--output', html_path]
- trace2html.Main(cmd)
- if delete_json:
- os.remove(json_path)
-
@property
def blacklist(self):
return self._blacklist
@@ -184,8 +183,6 @@ class LocalDeviceEnvironment(environment.Environment):
# attached.
if self._devices is None:
self._InitDevices()
- if not self._devices:
- raise device_errors.NoDevicesError()
return self._devices
@property
@@ -213,8 +210,9 @@ class LocalDeviceEnvironment(environment.Environment):
if self.trace_output:
self.DisableTracing()
- if self._devices is None:
+ if not self._devices:
return
+
@handle_shard_failures_with(on_failure=self.BlacklistDevice)
def tear_down_device(d):
# Write the cache even when not using it so that it will be ready the
@@ -263,17 +261,20 @@ class LocalDeviceEnvironment(environment.Environment):
self._blacklist.Extend([device_serial], reason=reason)
with self._devices_lock:
self._devices = [d for d in self._devices if str(d) != device_serial]
+ logging.error('Device %s blacklisted: %s', device_serial, reason)
+ if not self._devices:
+ raise device_errors.NoDevicesError(
+ 'All devices were blacklisted due to errors')
- def DisableTracing(self):
+ @staticmethod
+ def DisableTracing():
if not trace_event.trace_is_enabled():
logging.warning('Tracing is not running.')
else:
trace_event.trace_disable()
- self._JsonToTrace(self._trace_output + '.json',
- self._trace_output)
def EnableTracing(self):
if trace_event.trace_is_enabled():
logging.warning('Tracing is already running.')
else:
- trace_event.trace_enable(self._trace_output + '.json')
+ trace_event.trace_enable(self._trace_output)
diff --git a/chromium/build/android/pylib/local/device/local_device_gtest_run.py b/chromium/build/android/pylib/local/device/local_device_gtest_run.py
index 84a37fc1240..2f01af3908c 100644
--- a/chromium/build/android/pylib/local/device/local_device_gtest_run.py
+++ b/chromium/build/android/pylib/local/device/local_device_gtest_run.py
@@ -9,6 +9,7 @@ import os
import posixpath
import time
+from devil.android import crash_handler
from devil.android import device_errors
from devil.android import device_temp_file
from devil.android import ports
@@ -177,6 +178,10 @@ class _ApkDelegate(object):
except Exception:
device.ForceStop(self._package)
raise
+ # TODO(jbudorick): Remove this after resolving crbug.com/726880
+ logging.info(
+ '%s size on device: %s',
+ stdout_file.name, device.StatPath(stdout_file.name).get('st_size', 0))
return device.ReadFile(stdout_file.name).splitlines()
def PullAppFiles(self, device, files, directory):
@@ -273,9 +278,9 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun):
on_failure=self._env.BlacklistDevice)
@trace_event.traced
def individual_device_set_up(dev, host_device_tuples):
- def install_apk():
+ def install_apk(d):
# Install test APK.
- self._delegate.Install(dev)
+ self._delegate.Install(d)
def push_test_data():
# Push data dependencies.
@@ -304,7 +309,9 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun):
for s in self._servers[str(dev)]:
s.SetUp()
- steps = (install_apk, push_test_data, init_tool_and_start_servers)
+ steps = (
+ lambda: crash_handler.RetryOnSystemCrash(install_apk, dev),
+ push_test_data, init_tool_and_start_servers)
if self._env.concurrent_adb:
reraiser_thread.RunAsync(steps)
else:
@@ -356,8 +363,10 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun):
@local_device_environment.handle_shard_failures_with(
on_failure=self._env.BlacklistDevice)
def list_tests(dev):
- raw_test_list = self._delegate.Run(
- None, dev, flags='--gtest_list_tests', timeout=30)
+ raw_test_list = crash_handler.RetryOnSystemCrash(
+ lambda d: self._delegate.Run(
+ None, d, flags='--gtest_list_tests', timeout=30),
+ device=dev)
tests = gtest_test_instance.ParseGTestListTests(raw_test_list)
if not tests:
logging.info('No tests found. Output:')
diff --git a/chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py
index 8f2b2e74327..34e275d33fd 100644
--- a/chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py
+++ b/chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -7,13 +7,15 @@ import logging
import os
import posixpath
import re
+import sys
import tempfile
import time
+from devil.android import crash_handler
from devil.android import device_errors
from devil.android import device_temp_file
from devil.android import flag_changer
-from devil.android.sdk import shared_prefs
+from devil.android.tools import system_app
from devil.utils import reraiser_thread
from pylib import valgrind_tools
from pylib.android import logdog_logcat_monitor
@@ -23,7 +25,9 @@ from pylib.instrumentation import instrumentation_test_instance
from pylib.local.device import local_device_environment
from pylib.local.device import local_device_test_run
from pylib.utils import google_storage_helper
+from pylib.utils import instrumentation_tracing
from pylib.utils import logdog_helper
+from pylib.utils import shared_preference_utils
from py_trace_event import trace_event
from py_utils import contextlib_ext
from py_utils import tempfile_ext
@@ -112,6 +116,7 @@ class LocalDeviceInstrumentationTestRun(
super(LocalDeviceInstrumentationTestRun, self).__init__(env, test_instance)
self._flag_changers = {}
self._ui_capture_dir = dict()
+ self._replace_package_contextmanager = None
#override
def TestPackage(self):
@@ -125,25 +130,40 @@ class LocalDeviceInstrumentationTestRun(
def individual_device_set_up(dev, host_device_tuples):
steps = []
+ if self._test_instance.replace_system_package:
+ # We need the context manager to be applied before modifying any shared
+ # preference files in case the replacement APK needs to be set up, and
+ # it needs to be applied while the test is running. Thus, it needs to
+ # be applied early during setup, but must still be applied during
+ # _RunTest, which isn't possible using 'with' without applying the
+ # context manager up in test_runner. Instead, we manually invoke
+ # its __enter__ and __exit__ methods in setup and teardown
+ self._replace_package_contextmanager = system_app.ReplaceSystemApp(
+ dev, self._test_instance.replace_system_package.package,
+ self._test_instance.replace_system_package.replacement_apk)
+ steps.append(self._replace_package_contextmanager.__enter__)
+
def install_helper(apk, permissions):
+ @instrumentation_tracing.no_tracing
@trace_event.traced("apk_path")
- def install_helper_internal(apk_path=apk.path):
+ def install_helper_internal(d, apk_path=apk.path):
# pylint: disable=unused-argument
- dev.Install(apk, permissions=permissions)
- return install_helper_internal
+ d.Install(apk, permissions=permissions)
+ return lambda: crash_handler.RetryOnSystemCrash(
+ install_helper_internal, dev)
- def incremental_install_helper(dev, apk, script):
+ def incremental_install_helper(apk, script):
@trace_event.traced("apk_path")
- def incremental_install_helper_internal(apk_path=apk.path):
+ def incremental_install_helper_internal(d, apk_path=apk.path):
# pylint: disable=unused-argument
local_device_test_run.IncrementalInstall(
- dev, apk, script)
- return incremental_install_helper_internal
+ d, apk, script)
+ return lambda: crash_handler.RetryOnSystemCrash(
+ incremental_install_helper_internal, dev)
if self._test_instance.apk_under_test:
if self._test_instance.apk_under_test_incremental_install_script:
steps.append(incremental_install_helper(
- dev,
self._test_instance.apk_under_test,
self._test_instance.
apk_under_test_incremental_install_script))
@@ -154,7 +174,6 @@ class LocalDeviceInstrumentationTestRun(
if self._test_instance.test_apk_incremental_install_script:
steps.append(incremental_install_helper(
- dev,
self._test_instance.test_apk,
self._test_instance.
test_apk_incremental_install_script))
@@ -179,32 +198,13 @@ class LocalDeviceInstrumentationTestRun(
dev.RunShellCommand(['am', 'set-debug-app', '--persistent',
self._test_instance.package_info.package],
check_return=True)
+
@trace_event.traced
def edit_shared_prefs():
- for pref in self._test_instance.edit_shared_prefs:
- prefs = shared_prefs.SharedPrefs(dev, pref['package'],
- pref['filename'])
- prefs.Load()
- for key in pref.get('remove', []):
- try:
- prefs.Remove(key)
- except KeyError:
- logging.warning("Attempted to remove non-existent key %s", key)
- for key, value in pref.get('set', {}).iteritems():
- if isinstance(value, bool):
- prefs.SetBoolean(key, value)
- elif isinstance(value, basestring):
- prefs.SetString(key, value)
- elif isinstance(value, long) or isinstance(value, int):
- prefs.SetLong(key, value)
- elif isinstance(value, list):
- prefs.SetStringSet(key, value)
- else:
- raise ValueError("Given invalid value type %s for key %s" % (
- str(type(value)), key))
- prefs.Commit()
+ shared_preference_utils.ApplySharedPreferenceSettings(
+ dev, self._test_instance.edit_shared_prefs)
- @trace_event.traced
+ @instrumentation_tracing.no_tracing
def push_test_data():
device_root = posixpath.join(dev.GetExternalStoragePath(),
'chromium_tests_root')
@@ -279,6 +279,9 @@ class LocalDeviceInstrumentationTestRun(
if self._test_instance.ui_screenshot_dir:
pull_ui_screen_captures(dev)
+ if self._replace_package_contextmanager:
+ self._replace_package_contextmanager.__exit__(*sys.exc_info())
+
@trace_event.traced
def pull_ui_screen_captures(dev):
file_names = dev.ListDirectory(self._ui_capture_dir[dev])
@@ -318,7 +321,6 @@ class LocalDeviceInstrumentationTestRun(
extras = {}
flags_to_add = []
- flags_to_remove = []
test_timeout_scale = None
if self._test_instance.coverage_directory:
coverage_basename = '%s.ec' % ('%s_group' % test[0]['method']
@@ -374,9 +376,8 @@ class LocalDeviceInstrumentationTestRun(
target = '%s/%s' % (
self._test_instance.test_package, self._test_instance.test_runner)
extras['class'] = test_name
- if 'flags' in test:
- flags_to_add.extend(test['flags'].add)
- flags_to_remove.extend(test['flags'].remove)
+ if 'flags' in test and test['flags']:
+ flags_to_add.extend(test['flags'])
timeout = self._GetTimeoutFromAnnotations(
test['annotations'], test_display_name)
@@ -397,10 +398,9 @@ class LocalDeviceInstrumentationTestRun(
flags_to_add.append('--render-test-output-dir=%s' %
render_tests_device_output_dir)
- if flags_to_add or flags_to_remove:
+ if flags_to_add:
self._CreateFlagChangerIfNeeded(device)
- self._flag_changers[str(device)].PushFlags(
- add=flags_to_add, remove=flags_to_remove)
+ self._flag_changers[str(device)].PushFlags(add=flags_to_add)
time_ms = lambda: int(time.time() * 1e3)
start_ms = time_ms()
@@ -423,11 +423,6 @@ class LocalDeviceInstrumentationTestRun(
logcat_url = logmon.GetLogcatURL()
duration_ms = time_ms() - start_ms
- if flags_to_add or flags_to_remove:
- self._flag_changers[str(device)].Restore()
- if test_timeout_scale:
- valgrind_tools.SetChromeTimeoutScale(
- device, self._test_instance.timeout_scale)
# TODO(jbudorick): Make instrumentation tests output a JSON so this
# doesn't have to parse the output.
@@ -435,23 +430,56 @@ class LocalDeviceInstrumentationTestRun(
self._test_instance.ParseAmInstrumentRawOutput(output))
results = self._test_instance.GenerateTestResults(
result_code, result_bundle, statuses, start_ms, duration_ms)
+
+ def restore_flags():
+ if flags_to_add:
+ self._flag_changers[str(device)].Restore()
+
+ def restore_timeout_scale():
+ if test_timeout_scale:
+ valgrind_tools.SetChromeTimeoutScale(
+ device, self._test_instance.timeout_scale)
+
+ def handle_coverage_data():
+ if self._test_instance.coverage_directory:
+ device.PullFile(coverage_directory,
+ self._test_instance.coverage_directory)
+ device.RunShellCommand(
+ 'rm -f %s' % posixpath.join(coverage_directory, '*'),
+ check_return=True, shell=True)
+
+ def handle_render_test_data():
+ if _IsRenderTest(test):
+ # Render tests do not cause test failure by default. So we have to check
+ # to see if any failure images were generated even if the test does not
+ # fail.
+ try:
+ self._ProcessRenderTestResults(
+ device, render_tests_device_output_dir, results)
+ finally:
+ device.RemovePath(render_tests_device_output_dir,
+ recursive=True, force=True)
+
+ # While constructing the TestResult objects, we can parallelize several
+ # steps that involve ADB. These steps should NOT depend on any info in
+ # the results! Things such as whether the test CRASHED have not yet been
+ # determined.
+ post_test_steps = [restore_flags, restore_timeout_scale,
+ handle_coverage_data, handle_render_test_data]
+ if self._env.concurrent_adb:
+ post_test_step_thread_group = reraiser_thread.ReraiserThreadGroup(
+ reraiser_thread.ReraiserThread(f) for f in post_test_steps)
+ post_test_step_thread_group.StartAll(will_block=True)
+ else:
+ for step in post_test_steps:
+ step()
+
for result in results:
if logcat_url:
result.SetLink('logcat', logcat_url)
- if _IsRenderTest(test):
- # Render tests do not cause test failure by default. So we have to check
- # to see if any failure images were generated even if the test does not
- # fail.
- try:
- self._ProcessRenderTestResults(
- device, render_tests_device_output_dir, results)
- finally:
- device.RemovePath(render_tests_device_output_dir,
- recursive=True, force=True)
-
# Update the result name if the test used flags.
- if flags_to_add or flags_to_remove:
+ if flags_to_add:
for r in results:
if r.GetName() == test_name:
r.SetName(test_display_name)
@@ -502,12 +530,6 @@ class LocalDeviceInstrumentationTestRun(
logging.debug('raw output from %s:', test_display_name)
for l in output:
logging.debug(' %s', l)
- if self._test_instance.coverage_directory:
- device.PullFile(coverage_directory,
- self._test_instance.coverage_directory)
- device.RunShellCommand(
- 'rm -f %s' % posixpath.join(coverage_directory, '*'),
- check_return=True, shell=True)
if self._test_instance.store_tombstones:
tombstones_url = None
for result in results:
@@ -524,6 +546,9 @@ class LocalDeviceInstrumentationTestRun(
tombstones_url = logdog_helper.text(
stream_name, '\n'.join(resolved_tombstones))
result.SetLink('tombstones', tombstones_url)
+
+ if self._env.concurrent_adb:
+ post_test_step_thread_group.JoinAll()
return results, None
def _SaveScreenshot(self, device, screenshot_host_dir, screenshot_device_file,
diff --git a/chromium/build/android/pylib/local/device/local_device_test_run.py b/chromium/build/android/pylib/local/device/local_device_test_run.py
index 14c4366b051..71a234a18bb 100644
--- a/chromium/build/android/pylib/local/device/local_device_test_run.py
+++ b/chromium/build/android/pylib/local/device/local_device_test_run.py
@@ -10,6 +10,7 @@ import signal
import thread
import threading
+from devil.android import crash_handler
from devil.utils import signal_handler
from pylib import valgrind_tools
from pylib.base import base_test_result
@@ -86,7 +87,9 @@ class LocalDeviceTestRun(test_run.TestRun):
result = None
rerun = None
try:
- result, rerun = self._RunTest(dev, test)
+ result, rerun = crash_handler.RetryOnSystemCrash(
+ lambda d, t=test: self._RunTest(d, t),
+ device=dev)
if isinstance(result, base_test_result.BaseTestResult):
results.AddResult(result)
elif isinstance(result, list):
@@ -215,6 +218,7 @@ class LocalDeviceTestRun(test_run.TestRun):
def _GetTests(self):
raise NotImplementedError
+
def _RunTest(self, device, test):
raise NotImplementedError
diff --git a/chromium/build/android/pylib/local/machine/local_machine_junit_test_run.py b/chromium/build/android/pylib/local/machine/local_machine_junit_test_run.py
index 3d4d2c0736c..20d13994c31 100644
--- a/chromium/build/android/pylib/local/machine/local_machine_junit_test_run.py
+++ b/chromium/build/android/pylib/local/machine/local_machine_junit_test_run.py
@@ -96,9 +96,17 @@ class LocalMachineJunitTestRun(test_run.TestRun):
command.extend(['--jvm-args', '"%s"' % ' '.join(jvm_args)])
cmd_helper.RunCmd(command)
- with open(json_file_path, 'r') as f:
- results_list = json_results.ParseResultsFromJson(
- json.loads(f.read()))
+ try:
+ with open(json_file_path, 'r') as f:
+ results_list = json_results.ParseResultsFromJson(
+ json.loads(f.read()))
+ except IOError:
+ # In the case of a failure in the JUnit or Robolectric test runner
+ # the output json file may never be written.
+ results_list = [
+ base_test_result.BaseTestResult(
+ 'Test Runner Failure', base_test_result.ResultType.UNKNOWN)
+ ]
test_run_results = base_test_result.TestRunResults()
test_run_results.AddResults(results_list)
diff --git a/chromium/build/android/pylib/results/presentation/__init__.py b/chromium/build/android/pylib/results/presentation/__init__.py
new file mode 100644
index 00000000000..a22a6ee39a9
--- /dev/null
+++ b/chromium/build/android/pylib/results/presentation/__init__.py
@@ -0,0 +1,3 @@
+# Copyright 2017 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.
diff --git a/chromium/build/android/pylib/results/presentation/standard_gtest_merge.py b/chromium/build/android/pylib/results/presentation/standard_gtest_merge.py
new file mode 100755
index 00000000000..10754d995b2
--- /dev/null
+++ b/chromium/build/android/pylib/results/presentation/standard_gtest_merge.py
@@ -0,0 +1,164 @@
+#! /usr/bin/env python
+#
+# Copyright 2017 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.
+
+import argparse
+import json
+import os
+import sys
+
+
+def merge_shard_results(summary_json, jsons_to_merge):
+ """Reads JSON test output from all shards and combines them into one.
+
+ Returns dict with merged test output on success or None on failure. Emits
+ annotations.
+ """
+ try:
+ with open(summary_json) as f:
+ summary = json.load(f)
+ except (IOError, ValueError):
+ raise Exception('Summary json cannot be loaded.')
+
+ # Merge all JSON files together. Keep track of missing shards.
+ merged = {
+ 'all_tests': set(),
+ 'disabled_tests': set(),
+ 'global_tags': set(),
+ 'missing_shards': [],
+ 'per_iteration_data': [],
+ 'swarming_summary': summary,
+ 'links': set()
+ }
+ for index, result in enumerate(summary['shards']):
+ if result is not None:
+ # Author note: this code path doesn't trigger convert_to_old_format() in
+ # client/swarming.py, which means the state enum is saved in its string
+ # name form, not in the number form.
+ state = result.get('state')
+ if state == u'BOT_DIED':
+ print >> sys.stderr, 'Shard #%d had a Swarming internal failure' % index
+ elif state == u'EXPIRED':
+ print >> sys.stderr, 'There wasn\'t enough capacity to run your test'
+ elif state == u'TIMED_OUT':
+ print >> sys.stderr, (
+ 'Test runtime exceeded allocated time'
+ 'Either it ran for too long (hard timeout) or it didn\'t produce '
+ 'I/O for an extended period of time (I/O timeout)')
+ elif state == u'COMPLETED':
+ json_data, err_msg = load_shard_json(index, jsons_to_merge)
+ if json_data:
+ # Set-like fields.
+ for key in ('all_tests', 'disabled_tests', 'global_tags', 'links'):
+ merged[key].update(json_data.get(key), [])
+
+ # 'per_iteration_data' is a list of dicts. Dicts should be merged
+ # together, not the 'per_iteration_data' list itself.
+ merged['per_iteration_data'] = merge_list_of_dicts(
+ merged['per_iteration_data'],
+ json_data.get('per_iteration_data', []))
+ continue
+ else:
+ print >> sys.stderr, 'Task ran but no result was found: %s' % err_msg
+ else:
+ print >> sys.stderr, 'Invalid Swarming task state: %s' % state
+ merged['missing_shards'].append(index)
+
+ # If some shards are missing, make it known. Continue parsing anyway. Step
+ # should be red anyway, since swarming.py return non-zero exit code in that
+ # case.
+ if merged['missing_shards']:
+ as_str = ', '.join([str(shard) for shard in merged['missing_shards']])
+ print >> sys.stderr, ('some shards did not complete: %s' % as_str)
+ # Not all tests run, combined JSON summary can not be trusted.
+ merged['global_tags'].add('UNRELIABLE_RESULTS')
+
+ # Convert to jsonish dict.
+ for key in ('all_tests', 'disabled_tests', 'global_tags', 'links'):
+ merged[key] = sorted(merged[key])
+ return merged
+
+
+OUTPUT_JSON_SIZE_LIMIT = 100 * 1024 * 1024 # 100 MB
+
+
+def load_shard_json(index, jsons_to_merge):
+ """Reads JSON output of the specified shard.
+
+ Args:
+ jsons_to_merge: List of json files to be merge.
+ index: The index of the shard to load data for.
+
+ Returns: A tuple containing:
+ * The contents of path, deserialized into a python object.
+ * An error string.
+ (exactly one of the tuple elements will be non-None).
+ """
+ matching_json_files = [
+ j for j in jsons_to_merge
+ if (os.path.basename(j) == 'output.json'
+ and os.path.basename(os.path.dirname(j)) == str(index))]
+
+ if not matching_json_files:
+ print >> sys.stderr, 'shard %s test output missing' % index
+ return (None, 'shard %s test output was missing' % index)
+ elif len(matching_json_files) > 1:
+ print >> sys.stderr, 'duplicate test output for shard %s' % index
+ return (None, 'shard %s test output was duplicated' % index)
+
+ path = matching_json_files[0]
+
+ try:
+ filesize = os.stat(path).st_size
+ if filesize > OUTPUT_JSON_SIZE_LIMIT:
+ print >> sys.stderr, 'output.json is %d bytes. Max size is %d' % (
+ filesize, OUTPUT_JSON_SIZE_LIMIT)
+ return (None, 'shard %s test output exceeded the size limit' % index)
+
+ with open(path) as f:
+ return (json.load(f), None)
+ except (IOError, ValueError, OSError) as e:
+ print >> sys.stderr, 'Missing or invalid gtest JSON file: %s' % path
+ print >> sys.stderr, '%s: %s' % (type(e).__name__, e)
+
+ return (None, 'shard %s test output was missing or invalid' % index)
+
+
+def merge_list_of_dicts(left, right):
+ """Merges dicts left[0] with right[0], left[1] with right[1], etc."""
+ output = []
+ for i in xrange(max(len(left), len(right))):
+ left_dict = left[i] if i < len(left) else {}
+ right_dict = right[i] if i < len(right) else {}
+ merged_dict = left_dict.copy()
+ merged_dict.update(right_dict)
+ output.append(merged_dict)
+ return output
+
+
+def standard_gtest_merge(
+ output_json, summary_json, jsons_to_merge):
+
+ output = merge_shard_results(summary_json, jsons_to_merge)
+ with open(output_json, 'wb') as f:
+ json.dump(output, f)
+
+ return 0
+
+
+def main(raw_args):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--summary-json')
+ parser.add_argument('-o', '--output-json', required=True)
+ parser.add_argument('jsons_to_merge', nargs='*')
+
+ args = parser.parse_args(raw_args)
+
+ return standard_gtest_merge(
+ args.output_json, args.summary_json, args.jsons_to_merge)
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/chromium/build/android/pylib/results/presentation/test_results_presentation.py b/chromium/build/android/pylib/results/presentation/test_results_presentation.py
index 65991738227..cb51590e3cf 100755
--- a/chromium/build/android/pylib/results/presentation/test_results_presentation.py
+++ b/chromium/build/android/pylib/results/presentation/test_results_presentation.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python
+#!/usr/bin/env python
#
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
@@ -12,11 +12,13 @@ import os
import sys
import urllib
+
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.abspath(os.path.join(
CURRENT_DIR, '..', '..', '..', '..', '..'))
sys.path.append(os.path.join(BASE_DIR, 'build', 'android'))
+from pylib.results.presentation import standard_gtest_merge
from pylib.utils import google_storage_helper # pylint: disable=import-error
sys.path.append(os.path.join(BASE_DIR, 'third_party'))
@@ -108,15 +110,14 @@ def flakiness_dashbord_link(test_name, suite_name):
def logs_cell(result, test_name, suite_name):
"""Formats result logs data for processing in jinja template."""
link_list = []
- for name, href in result.get('links', {}).iteritems():
+ result_link_dict = result.get('links', {})
+ result_link_dict['flakiness'] = flakiness_dashbord_link(
+ test_name, suite_name)
+ for name, href in sorted(result_link_dict.items()):
link_list.append(link(
data=name,
href=href,
target=LinkTarget.NEW_TAB))
- link_list.append(link(
- data='flakiness',
- href=flakiness_dashbord_link(test_name, suite_name),
- target=LinkTarget.NEW_TAB))
if link_list:
return links_cell(link_list)
else:
@@ -400,9 +401,17 @@ def main():
builder_name = args.builder_name
if args.positional:
- if not len(args.positional) == 1:
- raise parser.error('More than 1 json file specified.')
- json_file = args.positional[0]
+ if len(args.positional) == 1:
+ json_file = args.positional[0]
+ else:
+ if args.output_json and args.summary_json:
+ standard_gtest_merge.standard_gtest_merge(
+ args.output_json, args.summary_json, args.positional)
+ json_file = args.output_json
+ elif not args.output_json:
+ raise Exception('output_json required by merge API is missing.')
+ else:
+ raise Exception('summary_json required by merge API is missing.')
elif args.json_file:
json_file = args.json_file
diff --git a/chromium/build/android/pylib/utils/decorators_test.py b/chromium/build/android/pylib/utils/decorators_test.py
index d31db9c9bb2..60f4811b4f4 100755
--- a/chromium/build/android/pylib/utils/decorators_test.py
+++ b/chromium/build/android/pylib/utils/decorators_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright 2017 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.
diff --git a/chromium/build/android/pylib/utils/device_dependencies.py b/chromium/build/android/pylib/utils/device_dependencies.py
index 90461222165..d24d0cb9de5 100644
--- a/chromium/build/android/pylib/utils/device_dependencies.py
+++ b/chromium/build/android/pylib/utils/device_dependencies.py
@@ -16,9 +16,6 @@ _BLACKLIST = [
re.compile(r'.*\.py'), # Some test_support targets include python deps.
re.compile(r'.*\.stamp'), # Stamp files should never be included.
- # Some test_support targets include python deps.
- re.compile(r'.*\.mojom\.js'),
-
# Chrome external extensions config file.
re.compile(r'.*external_extensions\.json'),
diff --git a/chromium/build/android/pylib/utils/instrumentation_tracing.py b/chromium/build/android/pylib/utils/instrumentation_tracing.py
new file mode 100644
index 00000000000..fe23894b11a
--- /dev/null
+++ b/chromium/build/android/pylib/utils/instrumentation_tracing.py
@@ -0,0 +1,186 @@
+# Copyright 2017 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.
+
+"""Functions to instrument all Python function calls.
+
+Generates a JSON file readable by Chrome's about:tracing."""
+
+import contextlib
+import functools
+import inspect
+import re
+import sys
+import threading
+
+from py_trace_event import trace_event
+
+
+# Modules to exclude by default (to avoid problems like infinite loops)
+DEFAULT_EXCLUDE = [r'py_trace_event\..*']
+
+class _TraceArguments(object):
+ def __init__(self):
+ """Wraps a dictionary to ensure safe evaluation of repr()."""
+ self._arguments = {}
+
+ @staticmethod
+ def _safeStringify(item):
+ try:
+ item_str = repr(item)
+ except Exception: # pylint: disable=broad-except
+ try:
+ item_str = str(item)
+ except Exception: # pylint: disable=broad-except
+ item_str = "<ERROR>"
+ return item_str
+
+ def add(self, key, val):
+ key_str = _TraceArguments._safeStringify(key)
+ val_str = _TraceArguments._safeStringify(val)
+
+ self._arguments[key_str] = val_str
+
+ def __repr__(self):
+ return repr(self._arguments)
+
+
+saved_thread_ids = set()
+
+def _shouldTrace(frame, to_include, to_exclude, included, excluded):
+ """
+ Decides whether or not the function called in frame should be traced.
+
+ Args:
+ frame: The Python frame object of this function call.
+ to_include: Set of regex objects for modules which should be traced.
+ to_exclude: Set of regex objects for modules which should not be traced.
+ included: Set of module names we've determined should be traced.
+ excluded: Set of module names we've determined should not be traced.
+ """
+ if not inspect.getmodule(frame):
+ return False
+
+ module_name = inspect.getmodule(frame).__name__
+
+ if module_name in included:
+ includes = True
+ elif to_include:
+ includes = any([pattern.match(module_name) for pattern in to_include])
+ else:
+ includes = True
+
+ if includes:
+ included.add(module_name)
+ else:
+ return False
+
+ # Find the modules of every function in the stack trace.
+ frames = inspect.getouterframes(frame)
+ calling_module_names = [inspect.getmodule(fr[0]).__name__ for fr in frames]
+
+ # Return False for anything with an excluded module's function anywhere in the
+ # stack trace (even if the function itself is in an included module).
+ if to_exclude:
+ for calling_module in calling_module_names:
+ if calling_module in excluded:
+ return False
+ for pattern in to_exclude:
+ if pattern.match(calling_module):
+ excluded.add(calling_module)
+ return False
+
+ return True
+
+def _generate_trace_function(to_include, to_exclude):
+ to_include = {re.compile(item) for item in to_include}
+ to_exclude = {re.compile(item) for item in to_exclude}
+ to_exclude.update({re.compile(item) for item in DEFAULT_EXCLUDE})
+
+ included = set()
+ excluded = set()
+
+ def traceFunction(frame, event, arg):
+ # pylint: disable=unused-argument
+ if event not in ("call", "return"):
+ return None
+
+ function_name = frame.f_code.co_name
+ filename = frame.f_code.co_filename
+ line_number = frame.f_lineno
+
+ if _shouldTrace(frame, to_include, to_exclude, included, excluded):
+ if event == "call":
+ # This function is beginning; we save the thread name (if that hasn't
+ # been done), record the Begin event, and return this function to be
+ # used as the local trace function.
+
+ thread_id = threading.current_thread().ident
+
+ if thread_id not in saved_thread_ids:
+ thread_name = threading.current_thread().name
+
+ trace_event.trace_set_thread_name(thread_name)
+
+ saved_thread_ids.add(thread_id)
+
+ arguments = _TraceArguments()
+ # The function's argument values are stored in the frame's
+ # |co_varnames| as the first |co_argcount| elements. (Following that
+ # are local variables.)
+ for idx in range(frame.f_code.co_argcount):
+ arg_name = frame.f_code.co_varnames[idx]
+ arguments.add(arg_name, frame.f_locals[arg_name])
+ trace_event.trace_begin(function_name, arguments=arguments,
+ module=inspect.getmodule(frame).__name__,
+ filename=filename, line_number=line_number)
+
+ # Return this function, so it gets used as the "local trace function"
+ # within this function's frame (and in particular, gets called for this
+ # function's "return" event).
+ return traceFunction
+
+ if event == "return":
+ trace_event.trace_end(function_name)
+ return None
+
+ return traceFunction
+
+
+def no_tracing(f):
+ @functools.wraps(f)
+ def wrapper(*args, **kwargs):
+ trace_func = sys.gettrace()
+ try:
+ sys.settrace(None)
+ threading.settrace(None)
+ return f(*args, **kwargs)
+ finally:
+ sys.settrace(trace_func)
+ threading.settrace(trace_func)
+ return wrapper
+
+
+def start_instrumenting(output_file, to_include=(), to_exclude=()):
+ """Enable tracing of all function calls (from specified modules)."""
+ trace_event.trace_enable(output_file)
+
+ traceFunc = _generate_trace_function(to_include, to_exclude)
+ sys.settrace(traceFunc)
+ threading.settrace(traceFunc)
+
+
+def stop_instrumenting():
+ trace_event.trace_disable()
+
+ sys.settrace(None)
+ threading.settrace(None)
+
+
+@contextlib.contextmanager
+def Instrument(output_file, to_include=(), to_exclude=()):
+ try:
+ start_instrumenting(output_file, to_include, to_exclude)
+ yield None
+ finally:
+ stop_instrumenting()
diff --git a/chromium/build/android/pylib/utils/logging_utils.py b/chromium/build/android/pylib/utils/logging_utils.py
index 2c2eabf5b91..29c67cb11a4 100644
--- a/chromium/build/android/pylib/utils/logging_utils.py
+++ b/chromium/build/android/pylib/utils/logging_utils.py
@@ -11,9 +11,37 @@ from pylib.constants import host_paths
_COLORAMA_PATH = os.path.join(
host_paths.DIR_SOURCE_ROOT, 'third_party', 'colorama', 'src')
-with host_paths.SysPath(_COLORAMA_PATH):
+with host_paths.SysPath(_COLORAMA_PATH, position=0):
import colorama
+
+class _ColorFormatter(logging.Formatter):
+ # pylint does not see members added dynamically in the constructor.
+ # pylint: disable=no-member
+ color_map = {
+ logging.DEBUG: colorama.Fore.CYAN,
+ logging.WARNING: colorama.Fore.YELLOW,
+ logging.ERROR: colorama.Fore.RED,
+ logging.CRITICAL: colorama.Back.RED,
+ }
+
+ def __init__(self, wrapped_formatter=None):
+ """Wraps a |logging.Formatter| and adds color."""
+ super(_ColorFormatter, self).__init__(self)
+ self._wrapped_formatter = wrapped_formatter or logging.Formatter()
+
+ #override
+ def format(self, record):
+ message = self._wrapped_formatter.format(record)
+ return self.Colorize(message, record.levelno)
+
+ def Colorize(self, message, log_level):
+ try:
+ return self.color_map[log_level] + message + colorama.Style.RESET_ALL
+ except KeyError:
+ return message
+
+
class ColorStreamHandler(logging.StreamHandler):
"""Handler that can be used to colorize logging output.
@@ -29,18 +57,10 @@ class ColorStreamHandler(logging.StreamHandler):
logging.info('message')
"""
- # pylint does not see members added dynamically in the constructor.
- # pylint: disable=no-member
- color_map = {
- logging.DEBUG: colorama.Fore.CYAN,
- logging.WARNING: colorama.Fore.YELLOW,
- logging.ERROR: colorama.Fore.RED,
- logging.CRITICAL: colorama.Back.RED + colorama.Style.BRIGHT,
- }
-
def __init__(self, force_color=False):
super(ColorStreamHandler, self).__init__()
self.force_color = force_color
+ self.setFormatter(logging.Formatter())
@property
def is_tty(self):
@@ -48,17 +68,10 @@ class ColorStreamHandler(logging.StreamHandler):
return isatty and isatty()
#override
- def format(self, record):
- message = logging.StreamHandler.format(self, record)
+ def setFormatter(self, formatter):
if self.force_color or self.is_tty:
- return self.Colorize(message, record.levelno)
- return message
-
- def Colorize(self, message, log_level):
- try:
- return self.color_map[log_level] + message + colorama.Style.RESET_ALL
- except KeyError:
- return message
+ formatter = _ColorFormatter(formatter)
+ super(ColorStreamHandler, self).setFormatter(formatter)
@staticmethod
def MakeDefault(force_color=False):
diff --git a/chromium/build/android/pylib/utils/proguard.py b/chromium/build/android/pylib/utils/proguard.py
index 89dc4c79b33..cefe38e4b77 100644
--- a/chromium/build/android/pylib/utils/proguard.py
+++ b/chromium/build/android/pylib/utils/proguard.py
@@ -287,5 +287,4 @@ def Parse(proguard_output):
else:
state.InitMethod(None)
-
return results
diff --git a/chromium/build/android/pylib/utils/shared_preference_utils.py b/chromium/build/android/pylib/utils/shared_preference_utils.py
new file mode 100644
index 00000000000..0541be48d26
--- /dev/null
+++ b/chromium/build/android/pylib/utils/shared_preference_utils.py
@@ -0,0 +1,88 @@
+# Copyright 2017 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.
+
+"""Utility functions for modifying an app's settings file using JSON."""
+
+import json
+import logging
+
+from devil.android.sdk import shared_prefs
+
+
+def ExtractSettingsFromJson(filepath):
+ """Extracts the settings data from the given JSON file.
+
+ Args:
+ filepath: The path to the JSON file to read.
+
+ Return:
+ The data read from the JSON file with strings converted to Python strings.
+ """
+ # json.load() loads strings as unicode, which causes issues when trying
+ # to edit string values in preference files, so convert to Python strings
+ def unicode_to_str(data):
+ if isinstance(data, dict):
+ return {unicode_to_str(key): unicode_to_str(value)
+ for key, value in data.iteritems()}
+ elif isinstance(data, list):
+ return [unicode_to_str(element) for element in data]
+ elif isinstance(data, unicode):
+ return data.encode('utf-8')
+ return data
+
+ with open(filepath) as prefs_file:
+ return unicode_to_str(json.load(prefs_file))
+
+
+def ApplySharedPreferenceSettings(device, settings):
+ """Applies the given app settings to the given device.
+
+ Modifies an installed app's settings by modifying its shared preference
+ settings file. Provided settings data must be a list of settings dictionaries,
+ where dictionaries are in the following format:
+ {
+ "package": "com.example.package",
+ "filename": "AppSettingsFile.xml",
+ "set": {
+ "SomeBoolToSet": true,
+ "SomeStringToSet": "StringValue",
+ },
+ "remove": [
+ "list",
+ "of",
+ "keys",
+ "to",
+ "remove",
+ ]
+ }
+
+ Example JSON files that can be read with ExtractSettingsFromJson and passed to
+ this function are in //chrome/android/shared_preference_files/test/.
+
+ Args:
+ device: The devil DeviceUtils object for the device the settings will be
+ applied to.
+ settings: A list of settings dictionaries to apply.
+ """
+ for pref in settings:
+ prefs = shared_prefs.SharedPrefs(device, pref['package'], pref['filename'])
+ prefs.Load()
+ for key in pref.get('remove', []):
+ try:
+ prefs.Remove(key)
+ except KeyError:
+ logging.warning("Attempted to remove non-existent key %s", key)
+ for key, value in pref.get('set', {}).iteritems():
+ if isinstance(value, bool):
+ prefs.SetBoolean(key, value)
+ elif isinstance(value, basestring):
+ prefs.SetString(key, value)
+ elif isinstance(value, long) or isinstance(value, int):
+ prefs.SetLong(key, value)
+ elif isinstance(value, list):
+ prefs.SetStringSet(key, value)
+ else:
+ raise ValueError("Given invalid value type %s for key %s" % (
+ str(type(value)), key))
+ prefs.Commit()
diff --git a/chromium/build/android/resource_sizes.py b/chromium/build/android/resource_sizes.py
index 0e0e51eeaed..76f03fb4e30 100755
--- a/chromium/build/android/resource_sizes.py
+++ b/chromium/build/android/resource_sizes.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright (c) 2011 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.
@@ -111,6 +111,10 @@ _DUMP_STATIC_INITIALIZERS_PATH = os.path.join(
# Pragma exists when enable_resource_whitelist_generation=true.
_RC_HEADER_RE = re.compile(
r'^#define (?P<name>\w+) (?:_Pragma\(.*?\) )?(?P<id>\d+)$')
+_RE_NON_LANGUAGE_PAK = re.compile(r'^assets/.*(resources|percent)\.pak$')
+_RE_COMPRESSED_LANGUAGE_PAK = re.compile(
+ r'\.lpak$|^assets/(?!stored-locales/).*(?!resources|percent)\.pak$')
+_RE_STORED_LANGUAGE_PAK = re.compile(r'^assets/stored-locales/.*\.pak$')
_READELF_SIZES_METRICS = {
'text': ['.text'],
'data': ['.data', '.rodata', '.data.rel.ro', '.data.rel.ro.local'],
@@ -165,6 +169,34 @@ def _ParseLibBuildId(so_path, tools_prefix):
return match.group(1) if match else None
+def _ParseManifestAttributes(apk_path):
+ # Check if the manifest specifies whether or not to extract native libs.
+ skip_extract_lib = False
+ output = cmd_helper.GetCmdOutput([
+ _AAPT_PATH.read(), 'd', 'xmltree', apk_path, 'AndroidManifest.xml'])
+ m = re.search(r'extractNativeLibs\(.*\)=\(.*\)(\w)', output)
+ if m:
+ skip_extract_lib = not bool(int(m.group(1)))
+
+ # Dex decompression overhead varies by Android version.
+ m = re.search(r'android:minSdkVersion\(\w+\)=\(type \w+\)(\w+)\n', output)
+ sdk_version = int(m.group(1), 16)
+ # Pre-L: Dalvik - .odex file is simply decompressed/optimized dex file (~1x).
+ # L, M: ART - .odex file is compiled version of the dex file (~3x).
+ # N: ART - Uses Dalvik-like JIT for normal apps (~1x), full compilation for
+ # shared apps (~3x).
+ if sdk_version < 21:
+ dex_multiplier = 1
+ elif sdk_version < 24:
+ dex_multiplier = 3
+ elif 'Monochrome' in apk_path or 'WebView' in apk_path:
+ dex_multiplier = 3
+ else:
+ dex_multiplier = 1
+
+ return dex_multiplier, skip_extract_lib
+
+
def CountStaticInitializers(so_path, tools_prefix):
# Static initializers expected in official builds. Note that this list is
# built using 'nm' on libchrome.so which results from a GCC official build
@@ -207,6 +239,16 @@ def GetStaticInitializers(so_path, tools_prefix):
return output.splitlines()[:-1], int(summary.group(1))
+def _NormalizeLanguagePaks(translations, normalized_apk_size, factor):
+ english_pak = translations.FindByPattern(r'.*/en[-_][Uu][Ss]\.l?pak')
+ num_translations = translations.GetNumEntries()
+ if english_pak:
+ normalized_apk_size -= translations.ComputeZippedSize()
+ normalized_apk_size += int(
+ english_pak.compress_size * num_translations * factor)
+ return normalized_apk_size
+
+
def _NormalizeResourcesArsc(apk_path):
"""Estimates the expected overhead of untranslated strings in resources.arsc.
@@ -282,11 +324,11 @@ class _FileGroup(object):
def __init__(self, name):
self.name = name
self._zip_infos = []
- self._extracted = []
+ self._extracted_multipliers = []
- def AddZipInfo(self, zip_info, extracted=False):
+ def AddZipInfo(self, zip_info, extracted_multiplier=0):
self._zip_infos.append(zip_info)
- self._extracted.append(extracted)
+ self._extracted_multipliers.append(extracted_multiplier)
def AllEntries(self):
return iter(self._zip_infos)
@@ -311,9 +353,8 @@ class _FileGroup(object):
def ComputeExtractedSize(self):
ret = 0
- for zi, extracted in zip(self._zip_infos, self._extracted):
- if extracted:
- ret += zi.file_size
+ for zi, multiplier in zip(self._zip_infos, self._extracted_multipliers):
+ ret += zi.file_size * multiplier
return ret
def ComputeInstallSize(self):
@@ -333,6 +374,7 @@ def PrintApkAnalysis(apk_filename, tools_prefix, chartjson=None):
java_code = make_group('Java code')
native_resources_no_translations = make_group('Native resources (no l10n)')
translations = make_group('Native resources (l10n)')
+ stored_translations = make_group('Native resources stored (l10n)')
icu_data = make_group('ICU (i18n library) data')
v8_snapshots = make_group('V8 Snapshots')
png_drawables = make_group('PNG drawables')
@@ -348,22 +390,27 @@ def PrintApkAnalysis(apk_filename, tools_prefix, chartjson=None):
finally:
apk.close()
+ dex_multiplier, skip_extract_lib = _ParseManifestAttributes(apk_filename)
total_apk_size = os.path.getsize(apk_filename)
apk_basename = os.path.basename(apk_filename)
-
for member in apk_contents:
filename = member.filename
if filename.endswith('/'):
continue
-
if filename.endswith('.so'):
- native_code.AddZipInfo(member, 'crazy' not in filename)
+ should_extract_lib = not (skip_extract_lib or 'crazy' in filename)
+ native_code.AddZipInfo(
+ member, extracted_multiplier=int(should_extract_lib))
elif filename.endswith('.dex'):
- java_code.AddZipInfo(member, True)
- elif re.search(r'^assets/.*(resources|percent)\.pak$', filename):
+ java_code.AddZipInfo(member, extracted_multiplier=dex_multiplier)
+ elif re.search(_RE_NON_LANGUAGE_PAK, filename):
native_resources_no_translations.AddZipInfo(member)
- elif re.search(r'\.lpak$|^assets/.*(?!resources|percent)\.pak$', filename):
- translations.AddZipInfo(member, 'en_' in filename or 'en-' in filename)
+ elif re.search(_RE_COMPRESSED_LANGUAGE_PAK, filename):
+ translations.AddZipInfo(
+ member,
+ extracted_multiplier=int('en_' in filename or 'en-' in filename))
+ elif re.search(_RE_STORED_LANGUAGE_PAK, filename):
+ stored_translations.AddZipInfo(member)
elif filename == 'assets/icudtl.dat':
icu_data.AddZipInfo(member)
elif filename.endswith('.bin'):
@@ -438,14 +485,14 @@ def PrintApkAnalysis(apk_filename, tools_prefix, chartjson=None):
normalized_apk_size += native_code.ComputeUncompressedSize()
# Avoid noise caused when strings change and translations haven't yet been
# updated.
- english_pak = translations.FindByPattern(r'.*/en[-_][Uu][Ss]\.l?pak')
num_translations = translations.GetNumEntries()
- if english_pak and num_translations > 1:
- normalized_apk_size -= translations.ComputeZippedSize()
- # 1.17 found by looking at Chrome.apk and seeing how much smaller en-US.pak
- # is relative to the average locale .pak.
- normalized_apk_size += int(
- english_pak.compress_size * num_translations * 1.17)
+ if num_translations > 1:
+ # Multipliers found by looking at MonochromePublic.apk and seeing how much
+ # smaller en-US.pak is relative to the average locale.pak.
+ normalized_apk_size = _NormalizeLanguagePaks(
+ translations, normalized_apk_size, 1.17)
+ normalized_apk_size = _NormalizeLanguagePaks(
+ stored_translations, normalized_apk_size, 1.43)
normalized_apk_size += int(_NormalizeResourcesArsc(apk_filename))
ReportPerfResult(chartjson, apk_basename + '_Specifics',
@@ -593,7 +640,7 @@ def _AnnotatePakResources():
def _PrintStaticInitializersCountFromApk(apk_filename, tools_prefix,
- chartjson=None):
+ dump_sis, chartjson=None):
with zipfile.ZipFile(apk_filename) as z:
so_files = [f for f in z.infolist()
if f.filename.endswith('.so') and f.file_size > 0]
@@ -610,7 +657,8 @@ def _PrintStaticInitializersCountFromApk(apk_filename, tools_prefix,
unstripped_path = os.path.join(out_dir, 'lib.unstripped', lib_name)
if os.path.exists(unstripped_path):
si_count += _PrintStaticInitializersCount(
- apk_filename, so_info.filename, unstripped_path, tools_prefix)
+ apk_filename, so_info.filename, unstripped_path, tools_prefix,
+ dump_sis)
else:
raise Exception('Unstripped .so not found. Looked here: %s',
unstripped_path)
@@ -619,16 +667,16 @@ def _PrintStaticInitializersCountFromApk(apk_filename, tools_prefix,
def _PrintStaticInitializersCount(apk_path, apk_so_name, so_with_symbols_path,
- tools_prefix):
+ tools_prefix, dump_sis):
"""Counts the number of static initializers in the given shared library.
- Additionally, files for which static initializers were found are printed
- on the standard output.
Args:
apk_path: Path to the apk.
apk_so_name: Name of the so.
so_with_symbols_path: Path to the unstripped libchrome.so file.
tools_prefix: Prefix for arch-specific version of binary utility tools.
+ dump_sis: Whether or not to run dump-static-initializers.py and print
+ the list of static initializers to stdout.
Returns:
The number of static initializers found.
"""
@@ -639,14 +687,17 @@ def _PrintStaticInitializersCount(apk_path, apk_so_name, so_with_symbols_path,
with Unzip(apk_path, filename=apk_so_name) as unzipped_so:
_VerifyLibBuildIdsMatch(tools_prefix, unzipped_so, so_with_symbols_path)
readelf_si_count = CountStaticInitializers(unzipped_so, tools_prefix)
- sis, dump_si_count = GetStaticInitializers(so_with_symbols_path, tools_prefix)
- print ('Found %s files with static initializers using readelf\n'
- 'Found %s files with static initializers using '
- 'dump-static-initializers') % (readelf_si_count, dump_si_count)
- print '\n'.join(sis)
+ if dump_sis:
+ sis, dump_si_count = GetStaticInitializers(
+ so_with_symbols_path, tools_prefix)
+ print ('Found %s files with static initializers using readelf\n'
+ 'Found %s files with static initializers using '
+ 'dump-static-initializers') % (readelf_si_count, dump_si_count)
+ print '\n'.join(sis)
return readelf_si_count
+
def _FormatBytes(byts):
"""Pretty-print a number of bytes."""
if byts > 2**20.0:
@@ -720,11 +771,6 @@ def _VerifyLibBuildIdsMatch(tools_prefix, *so_files):
'Your output directory is likely stale.')
-def _ReadBuildVars(output_dir):
- with open(os.path.join(output_dir, 'build_vars.txt')) as f:
- return dict(l.replace('//', '').rstrip().split('=', 1) for l in f)
-
-
def main():
argparser = argparse.ArgumentParser(description='Print APK size metrics.')
argparser.add_argument('--min-pak-resource-size', type=int, default=20*1024,
@@ -738,9 +784,9 @@ def main():
argparser.add_argument('--no-output-dir', action='store_true',
help='Skip all measurements that rely on having '
'output-dir')
- argparser.add_argument('--no-static-initializer-check', action='store_false',
- dest='static_initializer_check', default=True,
- help='Skip checking for static initializers')
+ argparser.add_argument('--dump-static-initializers', action='store_true',
+ help='Run dump-static-initializers.py to get the list'
+ 'of static initializers (slow).')
argparser.add_argument('-d', '--device',
help='Dummy option for perf runner.')
argparser.add_argument('--estimate-patch-size', action='store_true',
@@ -758,13 +804,12 @@ def main():
args = argparser.parse_args()
chartjson = _BASE_CHART.copy() if args.chartjson else None
-
if args.chromium_output_directory:
constants.SetOutputDirectory(args.chromium_output_directory)
if not args.no_output_dir:
constants.CheckOutputDirectory()
devil_chromium.Initialize()
- build_vars = _ReadBuildVars(constants.GetOutDirectory())
+ build_vars = build_utils.ReadBuildVars()
tools_prefix = os.path.join(constants.GetOutDirectory(),
build_vars['android_tool_prefix'])
else:
@@ -777,9 +822,9 @@ def main():
args.reference_apk_bucket, chartjson=chartjson)
if not args.no_output_dir:
PrintPakAnalysis(args.apk, args.min_pak_resource_size)
- if args.static_initializer_check:
- _PrintStaticInitializersCountFromApk(
- args.apk, tools_prefix, chartjson=chartjson)
+ _PrintStaticInitializersCountFromApk(
+ args.apk, tools_prefix, args.dump_static_initializers,
+ chartjson=chartjson)
if chartjson:
results_path = os.path.join(args.output_dir, 'results-chart.json')
logging.critical('Dumping json to %s', results_path)
diff --git a/chromium/build/android/stacktrace/BUILD.gn b/chromium/build/android/stacktrace/BUILD.gn
new file mode 100644
index 00000000000..a3957fec3d6
--- /dev/null
+++ b/chromium/build/android/stacktrace/BUILD.gn
@@ -0,0 +1,17 @@
+# Copyright 2017 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.
+
+import("//build/config/android/rules.gni")
+
+java_binary("java_deobfuscate") {
+ main_class = "org.chromium.build.FlushingReTrace"
+ java_files = [ "java/org/chromium/build/FlushingReTrace.java" ]
+ deps = [
+ "//third_party/proguard:retrace_java",
+ ]
+ data = [
+ "$root_build_dir/lib.java/build/android/stacktrace/java_deobfuscate.jar",
+ "$root_build_dir/bin/java_deobfuscate",
+ ]
+}
diff --git a/chromium/build/android/stacktrace/README.md b/chromium/build/android/stacktrace/README.md
new file mode 100644
index 00000000000..fb4c035c363
--- /dev/null
+++ b/chromium/build/android/stacktrace/README.md
@@ -0,0 +1,18 @@
+# java_deobfuscate
+
+A wrapper around ProGuard's ReTrace tool, which:
+
+1) Updates the regular expression used to identify stack lines, and
+2) Streams its output.
+
+The second point here is what allows you to run:
+
+ adb logcat | out/Default/bin/java_deobfuscate
+
+And have it actually show output without logcat terminating.
+
+
+# stackwalker.py
+
+Extracts Breakpad microdumps from a log file and uses `stackwalker` to symbolize
+them.
diff --git a/chromium/build/android/stacktrace/java_deobfuscate.py b/chromium/build/android/stacktrace/java_deobfuscate.py
deleted file mode 100755
index a468ec30556..00000000000
--- a/chromium/build/android/stacktrace/java_deobfuscate.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 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.
-
-"""A tool to deobfuscate Java stack traces.
-
-Utility wrapper around ReTrace to deobfuscate stack traces that have been
-mangled by ProGuard. Takes stack traces from stdin (eg. adb logcat |
-java_deobfuscate.py proguard.mapping) and files.
-"""
-
-# Can just run:
-# java -jar third_party/proguard/lib/retrace.jar -regex \
-# "(?:.*?\bat\s+%c\.%m\s*\(%s(?::%l)?\)\s*)|(?:(?:.*?[:\"]\s+)?%c(?::.*)?)" \
-# ~/mapping
-# in terminal to achieve same effect as this tool.
-
-import argparse
-import os
-import subprocess
-import sys
-
-_THIRD_PARTY_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__),
- os.pardir, os.pardir, os.pardir,
- 'third_party'))
-sys.path.append(os.path.join(_THIRD_PARTY_DIR, 'catapult', 'devil'))
-from devil.utils import cmd_helper
-
-
-# This regex is taken from
-# http://proguard.sourceforge.net/manual/retrace/usage.html.
-_LINE_PARSE_REGEX = (
- r'(?:.*?\bat\s+%c\.%m\s*\(%s(?::%l)?\)\s*)|(?:(?:.*?[:"]\s+)?%c(?::.*)?)')
-
-
-def main():
- parser = argparse.ArgumentParser(description=(__doc__))
- parser.add_argument(
- 'mapping_file',
- help='ProGuard mapping file from build which the stacktrace is from.')
- parser.add_argument(
- '--stacktrace',
- help='Stacktrace file to be deobfuscated.')
- args = parser.parse_args()
-
- retrace_path = os.path.join(_THIRD_PARTY_DIR, 'proguard',
- 'lib', 'retrace.jar')
-
- base_args = ['java', '-jar', retrace_path, '-regex', _LINE_PARSE_REGEX,
- args.mapping_file]
- if args.stacktrace:
- subprocess.call(base_args + [args.stacktrace])
- else:
- for line in cmd_helper.IterCmdOutputLines(base_args):
- print line
-
-
-if __name__ == '__main__':
- main()
diff --git a/chromium/build/android/test_runner.py b/chromium/build/android/test_runner.py
index 81b4f7e5f09..cba25eb9088 100755
--- a/chromium/build/android/test_runner.py
+++ b/chromium/build/android/test_runner.py
@@ -41,6 +41,7 @@ from pylib.base import test_run_factory
from pylib.results import json_results
from pylib.results import report_results
from pylib.utils import logdog_helper
+from pylib.utils import logging_utils
from py_utils import contextlib_ext
@@ -99,7 +100,12 @@ def AddTracingOptions(parser):
parser.add_argument(
'--trace-output',
metavar='FILENAME', type=os.path.realpath,
- help='Path to save test_runner trace data to.')
+ help='Path to save test_runner trace json output to.')
+
+ parser.add_argument(
+ '--trace-all',
+ action='store_true',
+ help='Whether to trace all function calls.')
def AddCommonOptions(parser):
@@ -187,7 +193,14 @@ def AddCommonOptions(parser):
def ProcessCommonOptions(args):
"""Processes and handles all common options."""
- run_tests_helper.SetLogLevel(args.verbose_count)
+ run_tests_helper.SetLogLevel(args.verbose_count, add_handler=False)
+ if args.verbose_count > 0:
+ handler = logging_utils.ColorStreamHandler()
+ else:
+ handler = logging.StreamHandler(sys.stdout)
+ handler.setFormatter(run_tests_helper.CustomFormatter())
+ logging.getLogger().addHandler(handler)
+
constants.SetBuildType(args.build_type)
if args.output_directory:
constants.SetOutputDirectory(args.output_directory)
@@ -208,9 +221,9 @@ def AddDeviceOptions(parser):
type=os.path.realpath,
help='Device blacklist file.')
parser.add_argument(
- '-d', '--device',
- dest='test_device',
- help='Target device for the test suite to run on.')
+ '-d', '--device', nargs='+',
+ dest='test_devices',
+ help='Target device(s) for the test suite to run on.')
parser.add_argument(
'--enable-concurrent-adb',
action='store_true',
@@ -376,15 +389,27 @@ def AddInstrumentationTestOptions(parser):
dest='run_disabled', action='store_true',
help='Also run disabled tests if applicable.')
parser.add_argument(
- '--regenerate-goldens',
- action='store_true', dest='regenerate_goldens',
- help='Causes the render tests to not fail when a check'
- 'fails or the golden image is missing but to render'
- 'the view and carry on.')
- parser.add_argument(
'--render-results-directory',
dest='render_results_dir',
help='Directory to pull render test result images off of the device to.')
+ def package_replacement(arg):
+ split_arg = arg.split(',')
+ if len(split_arg) != 2:
+ raise argparse.ArgumentError(
+ 'Expected two comma-separated strings for --replace-system-package, '
+ 'received %d' % len(split_arg))
+ PackageReplacement = collections.namedtuple('PackageReplacement',
+ ['package', 'replacement_apk'])
+ return PackageReplacement(package=split_arg[0],
+ replacement_apk=os.path.realpath(split_arg[1]))
+ parser.add_argument(
+ '--replace-system-package',
+ type=package_replacement, default=None,
+ help='Specifies a system package to replace with a given APK for the '
+ 'duration of the test. Given as a comma-separated pair of strings, '
+ 'the first element being the package and the second the path to the '
+ 'replacement APK. Only supports replacing one package. Example: '
+ '--replace-system-package com.example.app,path/to/some.apk')
parser.add_argument(
'--runtime-deps-path',
dest='runtime_deps_path', type=os.path.realpath,
@@ -767,8 +792,9 @@ def RunTestsInPlatformMode(args):
yield
finally:
if not args.logcat_output_file:
- logging.critical('Cannot upload logcats file. '
- 'File to save logcat is not specified.')
+ logging.critical('Cannot upload logcat file: no file specified.')
+ elif not os.path.exists(args.logcat_output_file):
+ logging.critical("Cannot upload logcat file: file doesn't exist.")
else:
with open(args.logcat_output_file) as src:
dst = logdog_helper.open_text('unified_logcats')
@@ -927,6 +953,14 @@ def main():
else:
parser.error('unrecognized arguments: %s' % ' '.join(unknown_args))
+ # --replace-system-package has the potential to cause issues if
+ # --enable-concurrent-adb is set, so disallow that combination
+ if (hasattr(args, 'replace_system_package') and
+ hasattr(args, 'enable_concurrent_adb') and args.replace_system_package and
+ args.enable_concurrent_adb):
+ parser.error('--replace-system-package and --enable-concurrent-adb cannot '
+ 'be used together')
+
try:
return RunTestsCommand(args)
except base_error.BaseError as e:
diff --git a/chromium/build/android/test_runner.pydeps b/chromium/build/android/test_runner.pydeps
index db4308809cb..ea68a5823f8 100644
--- a/chromium/build/android/test_runner.pydeps
+++ b/chromium/build/android/test_runner.pydeps
@@ -31,6 +31,7 @@
../../third_party/catapult/devil/devil/android/constants/__init__.py
../../third_party/catapult/devil/devil/android/constants/chrome.py
../../third_party/catapult/devil/devil/android/constants/file_system.py
+../../third_party/catapult/devil/devil/android/crash_handler.py
../../third_party/catapult/devil/devil/android/decorators.py
../../third_party/catapult/devil/devil/android/device_blacklist.py
../../third_party/catapult/devil/devil/android/device_errors.py
@@ -56,6 +57,8 @@
../../third_party/catapult/devil/devil/android/tools/__init__.py
../../third_party/catapult/devil/devil/android/tools/device_recovery.py
../../third_party/catapult/devil/devil/android/tools/device_status.py
+../../third_party/catapult/devil/devil/android/tools/script_common.py
+../../third_party/catapult/devil/devil/android/tools/system_app.py
../../third_party/catapult/devil/devil/android/valgrind_tools/__init__.py
../../third_party/catapult/devil/devil/android/valgrind_tools/base_tool.py
../../third_party/catapult/devil/devil/base_error.py
@@ -77,44 +80,13 @@
../../third_party/catapult/devil/devil/utils/timeout_retry.py
../../third_party/catapult/devil/devil/utils/watchdog_timer.py
../../third_party/catapult/devil/devil/utils/zip_utils.py
-../../third_party/catapult/third_party/beautifulsoup4/bs4/__init__.py
-../../third_party/catapult/third_party/beautifulsoup4/bs4/builder/__init__.py
-../../third_party/catapult/third_party/beautifulsoup4/bs4/builder/_html5lib.py
-../../third_party/catapult/third_party/beautifulsoup4/bs4/builder/_htmlparser.py
-../../third_party/catapult/third_party/beautifulsoup4/bs4/builder/_lxml.py
-../../third_party/catapult/third_party/beautifulsoup4/bs4/dammit.py
-../../third_party/catapult/third_party/beautifulsoup4/bs4/element.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/__init__.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/constants.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/html5parser.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/inputstream.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/serializer/__init__.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/serializer/htmlserializer.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/tokenizer.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/treebuilders/__init__.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/treebuilders/_base.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/treewalkers/__init__.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/trie/__init__.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/trie/_base.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/trie/py.py
-../../third_party/catapult/third_party/html5lib-python/html5lib/utils.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/__init__.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/generate.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/html_generation_controller.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/html_module.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/js_utils.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/module.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/parse_html_deps.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/project.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/resource.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/resource_loader.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/strip_js_comments.py
-../../third_party/catapult/third_party/py_vulcanize/py_vulcanize/style_sheet.py
-../../third_party/catapult/third_party/six/six.py
../../third_party/catapult/third_party/zipfile/zipfile_2_7_13.py
-../../third_party/catapult/tracing/tracing_build/__init__.py
-../../third_party/catapult/tracing/tracing_build/trace2html.py
-../../third_party/catapult/tracing/tracing_project.py
+../../third_party/colorama/src/colorama/__init__.py
+../../third_party/colorama/src/colorama/ansi.py
+../../third_party/colorama/src/colorama/ansitowin32.py
+../../third_party/colorama/src/colorama/initialise.py
+../../third_party/colorama/src/colorama/win32.py
+../../third_party/colorama/src/colorama/winterm.py
../../third_party/jinja2/__init__.py
../../third_party/jinja2/_compat.py
../../third_party/jinja2/bccache.py
@@ -199,9 +171,12 @@ pylib/utils/decorators.py
pylib/utils/device_dependencies.py
pylib/utils/dexdump.py
pylib/utils/google_storage_helper.py
+pylib/utils/instrumentation_tracing.py
pylib/utils/logdog_helper.py
+pylib/utils/logging_utils.py
pylib/utils/proguard.py
pylib/utils/repo_utils.py
+pylib/utils/shared_preference_utils.py
pylib/valgrind_tools.py
test_runner.py
tombstones.py
diff --git a/chromium/build/args/headless.gn b/chromium/build/args/headless.gn
index 95979fc0690..55c93218ffb 100644
--- a/chromium/build/args/headless.gn
+++ b/chromium/build/args/headless.gn
@@ -18,6 +18,9 @@ headless_use_embedded_resources = true
# Expose headless bindings for freetype library bundled with Chromium.
headless_fontconfig_utils = true
+# Remove a dependency on a system fontconfig library.
+use_bundled_fontconfig = true
+
# In order to simplify deployment we build ICU data file
# into binary.
icu_use_data_file = false
@@ -26,6 +29,10 @@ icu_use_data_file = false
# to simplify deployment.
v8_use_external_startup_data = false
+# Do not use bundled libc++ to ensure that everything works when Headless
+# Chromium is embedded.
+use_custom_libcxx = false
+
enable_nacl = false
enable_print_preview = false
enable_remoting = false
diff --git a/chromium/build/build_config.h b/chromium/build/build_config.h
index 090641907bd..8e5fcd7dedd 100644
--- a/chromium/build/build_config.h
+++ b/chromium/build/build_config.h
@@ -66,6 +66,8 @@
#else
#error Please add support for your platform in build/build_config.h
#endif
+// NOTE: Adding a new port? Please follow
+// https://chromium.googlesource.com/chromium/src/+/master/docs/new_port_policy.md
#if defined(USE_OPENSSL_CERTS) && defined(USE_NSS_CERTS)
#error Cannot use both OpenSSL and NSS for certificates
@@ -160,6 +162,18 @@
#define ARCH_CPU_32_BITS 1
#define ARCH_CPU_LITTLE_ENDIAN 1
#endif
+#elif defined(__MIPSEB__)
+#if defined(__LP64__)
+#define ARCH_CPU_MIPS_FAMILY 1
+#define ARCH_CPU_MIPS64 1
+#define ARCH_CPU_64_BITS 1
+#define ARCH_CPU_BIG_ENDIAN 1
+#else
+#define ARCH_CPU_MIPS_FAMILY 1
+#define ARCH_CPU_MIPS 1
+#define ARCH_CPU_32_BITS 1
+#define ARCH_CPU_BIG_ENDIAN 1
+#endif
#else
#error Please add support for your architecture in build/build_config.h
#endif
diff --git a/chromium/build/check_gn_headers.py b/chromium/build/check_gn_headers.py
index fe884db6cb0..f6ae8f5cac4 100755
--- a/chromium/build/check_gn_headers.py
+++ b/chromium/build/check_gn_headers.py
@@ -19,12 +19,16 @@ import sys
import tempfile
from multiprocessing import Process, Queue
+SRC_DIR = os.path.abspath(
+ os.path.join(os.path.abspath(os.path.dirname(__file__)), os.path.pardir))
+DEPOT_TOOLS_DIR = os.path.join(SRC_DIR, 'third_party', 'depot_tools')
-def GetHeadersFromNinja(out_dir, q):
+
+def GetHeadersFromNinja(out_dir, skip_obj, q):
"""Return all the header files from ninja_deps"""
def NinjaSource():
- cmd = ['ninja', '-C', out_dir, '-t', 'deps']
+ cmd = [os.path.join(DEPOT_TOOLS_DIR, 'ninja'), '-C', out_dir, '-t', 'deps']
# A negative bufsize means to use the system default, which usually
# means fully buffered.
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=-1)
@@ -38,19 +42,21 @@ def GetHeadersFromNinja(out_dir, q):
ans, err = set(), None
try:
- ans = ParseNinjaDepsOutput(NinjaSource())
+ ans = ParseNinjaDepsOutput(NinjaSource(), out_dir, skip_obj)
except Exception as e:
err = str(e)
q.put((ans, err))
-def ParseNinjaDepsOutput(ninja_out):
+def ParseNinjaDepsOutput(ninja_out, out_dir, skip_obj):
"""Parse ninja output and get the header files"""
- all_headers = set()
+ all_headers = {}
- prefix = '..' + os.sep + '..' + os.sep
+ # Ninja always uses "/", even on Windows.
+ prefix = '../../'
is_valid = False
+ obj_file = ''
for line in ninja_out:
if line.startswith(' '):
if not is_valid:
@@ -62,10 +68,15 @@ def ParseNinjaDepsOutput(ninja_out):
# build/ only contains build-specific files like build_config.h
# and buildflag.h, and system header files, so they should be
# skipped.
+ if f.startswith(out_dir) or f.startswith('out'):
+ continue
if not f.startswith('build'):
- all_headers.add(f)
+ all_headers.setdefault(f, [])
+ if not skip_obj:
+ all_headers[f].append(obj_file)
else:
is_valid = line.endswith('(VALID)')
+ obj_file = line.split(':')[0]
return all_headers
@@ -76,11 +87,15 @@ def GetHeadersFromGN(out_dir, q):
tmp = None
ans, err = set(), None
try:
- tmp = tempfile.mkdtemp()
+ # Argument |dir| is needed to make sure it's on the same drive on Windows.
+ # dir='' means dir='.', but doesn't introduce an unneeded prefix.
+ tmp = tempfile.mkdtemp(dir='')
shutil.copy2(os.path.join(out_dir, 'args.gn'),
os.path.join(tmp, 'args.gn'))
# Do "gn gen" in a temp dir to prevent dirtying |out_dir|.
- subprocess.check_call(['gn', 'gen', tmp, '--ide=json', '-q'])
+ gn_exe = 'gn.bat' if sys.platform == 'win32' else 'gn'
+ subprocess.check_call([
+ os.path.join(DEPOT_TOOLS_DIR, gn_exe), 'gen', tmp, '--ide=json', '-q'])
gn_json = json.load(open(os.path.join(tmp, 'project.json')))
ans = ParseGNProjectJSON(gn_json, out_dir, tmp)
except Exception as e:
@@ -116,9 +131,12 @@ def GetDepsPrefixes(q):
"""Return all the folders controlled by DEPS file"""
prefixes, err = set(), None
try:
- gclient_out = subprocess.check_output(
- ['gclient', 'recurse', '--no-progress', '-j1',
- 'python', '-c', 'import os;print os.environ["GCLIENT_DEP_PATH"]'])
+ gclient_exe = 'gclient.bat' if sys.platform == 'win32' else 'gclient'
+ gclient_out = subprocess.check_output([
+ os.path.join(DEPOT_TOOLS_DIR, gclient_exe),
+ 'recurse', '--no-progress', '-j1',
+ 'python', '-c', 'import os;print os.environ["GCLIENT_DEP_PATH"]'],
+ universal_newlines=True)
for i in gclient_out.split('\n'):
if i.startswith('src/'):
i = i[4:]
@@ -128,6 +146,15 @@ def GetDepsPrefixes(q):
q.put((prefixes, err))
+def IsBuildClean(out_dir):
+ cmd = [os.path.join(DEPOT_TOOLS_DIR, 'ninja'), '-C', out_dir, '-n']
+ try:
+ out = subprocess.check_output(cmd)
+ return 'no work to do.' in out
+ except Exception as e:
+ print e
+ return False
+
def ParseWhiteList(whitelist):
out = set()
for line in whitelist.split('\n'):
@@ -150,6 +177,16 @@ def GetNonExistingFiles(lst):
def main():
+
+ def DumpJson(data):
+ if args.json:
+ with open(args.json, 'w') as f:
+ json.dump(data, f)
+
+ def PrintError(msg):
+ DumpJson([])
+ parser.error(msg)
+
parser = argparse.ArgumentParser(description='''
NOTE: Use ninja to build all targets in OUT_DIR before running
this script.''')
@@ -158,14 +195,31 @@ def main():
parser.add_argument('--json',
help='JSON output filename for missing headers')
parser.add_argument('--whitelist', help='file containing whitelist')
+ parser.add_argument('--skip-dirty-check', action='store_true',
+ help='skip checking whether the build is dirty')
+ parser.add_argument('--verbose', action='store_true',
+ help='print more diagnostic info')
args, _extras = parser.parse_known_args()
if not os.path.isdir(args.out_dir):
parser.error('OUT_DIR "%s" does not exist.' % args.out_dir)
+ if not args.skip_dirty_check and not IsBuildClean(args.out_dir):
+ dirty_msg = 'OUT_DIR looks dirty. You need to build all there.'
+ if args.json:
+ # Assume running on the bots. Silently skip this step.
+ # This is possible because "analyze" step can be wrong due to
+ # underspecified header files. See crbug.com/725877
+ print dirty_msg
+ DumpJson([])
+ return 0
+ else:
+ # Assume running interactively.
+ parser.error(dirty_msg)
+
d_q = Queue()
- d_p = Process(target=GetHeadersFromNinja, args=(args.out_dir, d_q,))
+ d_p = Process(target=GetHeadersFromNinja, args=(args.out_dir, True, d_q,))
d_p.start()
gn_q = Queue()
@@ -178,7 +232,7 @@ def main():
d, d_err = d_q.get()
gn, gn_err = gn_q.get()
- missing = d - gn
+ missing = set(d.keys()) - gn
nonexisting = GetNonExistingFiles(gn)
deps, deps_err = deps_q.get()
@@ -190,29 +244,29 @@ def main():
deps_p.join()
if d_err:
- parser.error(d_err)
+ PrintError(d_err)
if gn_err:
- parser.error(gn_err)
+ PrintError(gn_err)
if deps_err:
- parser.error(deps_err)
+ PrintError(deps_err)
if len(GetNonExistingFiles(d)) > 0:
- parser.error('''Found non-existing files in ninja deps. You should
- build all in OUT_DIR.''')
+ print 'Non-existing files in ninja deps:', GetNonExistingFiles(d)
+ PrintError('Found non-existing files in ninja deps. You should ' +
+ 'build all in OUT_DIR.')
if len(d) == 0:
- parser.error('OUT_DIR looks empty. You should build all there.')
+ PrintError('OUT_DIR looks empty. You should build all there.')
if any((('/gen/' in i) for i in nonexisting)):
- parser.error('OUT_DIR looks wrong. You should build all there.')
+ PrintError('OUT_DIR looks wrong. You should build all there.')
if args.whitelist:
whitelist = ParseWhiteList(open(args.whitelist).read())
missing -= whitelist
+ nonexisting -= whitelist
missing = sorted(missing)
nonexisting = sorted(nonexisting)
- if args.json:
- with open(args.json, 'w') as f:
- json.dump(missing, f)
+ DumpJson(sorted(missing + nonexisting))
if len(missing) == 0 and len(nonexisting) == 0:
return 0
@@ -227,6 +281,22 @@ def main():
for i in nonexisting:
print i
+ if args.verbose:
+ # Only get detailed obj dependency here since it is slower.
+ GetHeadersFromNinja(args.out_dir, False, d_q)
+ d, d_err = d_q.get()
+ print '\nDetailed dependency info:'
+ for f in missing:
+ print f
+ for cc in d[f]:
+ print ' ', cc
+
+ print '\nMissing headers sorted by number of affected object files:'
+ count = {k: len(v) for (k, v) in d.iteritems()}
+ for f in sorted(count, key=count.get, reverse=True):
+ if f in missing:
+ print count[f], f
+
return 1
diff --git a/chromium/build/check_gn_headers_unittest.py b/chromium/build/check_gn_headers_unittest.py
index 78c78776a15..20c3b138979 100755
--- a/chromium/build/check_gn_headers_unittest.py
+++ b/chromium/build/check_gn_headers_unittest.py
@@ -5,7 +5,6 @@
import logging
import json
-import os
import unittest
import check_gn_headers
@@ -25,10 +24,10 @@ obj/c.o: #deps 1, deps mtime 123 (VALID)
../../c.cc
../../build/a.h
gen/b.h
+ ../../out/Release/gen/no.h
../../dir3/path/b.h
../../c3.hh
'''
-ninja_input_win = ninja_input.replace('/', '\\')
gn_input = json.loads(r'''
@@ -64,31 +63,16 @@ a/b/c
class CheckGnHeadersTest(unittest.TestCase):
def testNinja(self):
- headers = check_gn_headers.ParseNinjaDepsOutput(ninja_input.split('\n'))
- expected = set([
- 'dir/path/b.h',
- 'c.hh',
- 'dir3/path/b.h',
- 'c3.hh',
- ])
- self.assertEquals(headers, expected)
-
- def testNinjaWin(self):
- old_sep = os.sep
- os.sep = '\\'
-
headers = check_gn_headers.ParseNinjaDepsOutput(
- ninja_input_win.split('\n'))
- expected = set([
- 'dir\\path\\b.h',
- 'c.hh',
- 'dir3\\path\\b.h',
- 'c3.hh',
- ])
+ ninja_input.split('\n'), 'out/Release', False)
+ expected = {
+ 'dir/path/b.h': ['obj/a.o'],
+ 'c.hh': ['obj/a.o'],
+ 'dir3/path/b.h': ['obj/c.o'],
+ 'c3.hh': ['obj/c.o'],
+ }
self.assertEquals(headers, expected)
- os.sep = old_sep
-
def testGn(self):
headers = check_gn_headers.ParseGNProjectJSON(gn_input,
'out/Release', 'tmp')
diff --git a/chromium/build/check_gn_headers_whitelist.txt b/chromium/build/check_gn_headers_whitelist.txt
new file mode 100644
index 00000000000..e52c6065418
--- /dev/null
+++ b/chromium/build/check_gn_headers_whitelist.txt
@@ -0,0 +1,387 @@
+# Do not add files to this whitelist unless you are adding a new OS or
+# changing the GN arguments on bots.
+
+ash/accelerators/accelerator_controller_delegate.h
+ash/accelerators/accelerator_controller_delegate_aura.h
+ash/accelerators/accelerator_table.h
+ash/ash_export.h
+ash/ash_switches.h
+ash/frame/header_painter.h
+ash/metrics/task_switch_metrics_recorder.h
+ash/metrics/task_switch_source.h
+ash/metrics/user_metrics_action.h
+ash/metrics/user_metrics_recorder.h
+ash/public/cpp/ash_public_export.h
+ash/public/cpp/config.h
+ash/public/cpp/shelf_types.h
+ash/session/session_observer.h
+ash/shell.h
+ash/system/devicetype_utils.h
+ash/wm/system_modal_container_event_filter_delegate.h
+cc/base/ring_buffer.h
+cc/blink/web_blend_mode.h
+cc/cc_export.h
+cc/input/browser_controls_state.h
+cc/input/event_listener_properties.h
+cc/input/scrollbar.h
+cc/input/scroller_size_metrics.h
+cc/layers/performance_properties.h
+cc/layers/scrollbar_theme_painter.h
+cc/output/bsp_compare_result.h
+cc/resources/release_callback_impl.h
+cc/resources/return_callback.h
+cc/surfaces/surface_observer.h
+chrome/browser/android/android_theme_resources.h
+chrome/browser/android/resource_id.h
+chrome/browser/chromeos/certificate_provider/certificate_info.h
+chrome/browser/chromeos/certificate_provider/certificate_provider.h
+chrome/browser/chromeos/certificate_provider/certificate_provider_service.h
+chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h
+chrome/browser/chromeos/certificate_provider/certificate_requests.h
+chrome/browser/chromeos/certificate_provider/pin_dialog_manager.h
+chrome/browser/chromeos/certificate_provider/sign_requests.h
+chrome/browser/chromeos/certificate_provider/thread_safe_certificate_map.h
+chrome/browser/chromeos/login/signin/oauth2_login_manager.h
+chrome/browser/chromeos/login/signin/oauth2_login_verifier.h
+chrome/browser/chromeos/login/signin/oauth2_token_fetcher.h
+chrome/browser/chromeos/profiles/profile_helper.h
+chrome/browser/chromeos/settings/cros_settings.h
+chrome/browser/chromeos/ui/request_pin_view.h
+chrome/browser/component_updater/component_installer_errors.h
+chrome/browser/download/download_file_icon_extractor.h
+chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h
+chrome/browser/extensions/api/omnibox/omnibox_api_testbase.h
+chrome/browser/extensions/api/socket/mock_tcp_client_socket.h
+chrome/browser/mac/bluetooth_utility.h
+chrome/browser/media/router/mojo/media_route_provider_util_win.h
+chrome/browser/media/webrtc/desktop_media_list_ash.h
+chrome/browser/media/webrtc/desktop_media_list_observer.h
+chrome/browser/media/webrtc/rtp_dump_type.h
+chrome/browser/media_galleries/fileapi/file_path_watcher_util.h
+chrome/browser/media_galleries/fileapi/iapps_data_provider.h
+chrome/browser/media_galleries/fileapi/itunes_data_provider.h
+chrome/browser/media_galleries/fileapi/picasa_data_provider.h
+chrome/browser/media_galleries/fileapi/safe_iapps_library_parser.h
+chrome/browser/media_galleries/media_file_system_context.h
+chrome/browser/notifications/displayed_notifications_dispatch_callback.h
+chrome/browser/permissions/permission_queue_controller.h
+chrome/browser/prefs/active_profile_pref_service.h
+chrome/browser/rlz/chrome_rlz_tracker_delegate.h
+chrome/browser/signin/easy_unlock_service_observer.h
+chrome/browser/ui/android/content_settings/subresource_filter_infobar_delegate.h
+chrome/browser/ui/app_icon_loader_delegate.h
+chrome/browser/ui/app_list/app_list_syncable_service_factory.h
+chrome/browser/ui/ash/ash_util.h
+chrome/browser/ui/ash/multi_user/multi_user_util.h
+chrome/browser/ui/network_profile_bubble.h
+chrome/browser/ui/passwords/manage_passwords_icon.h
+chrome/browser/ui/views/frame/browser_header_painter_ash.h
+chrome/browser/ui/webui/large_icon_source.h
+chrome/common/mac/app_shim_launch.h
+chrome/common/mac/app_shim_messages.h
+chrome/common/media_galleries/itunes_library.h
+chrome/common/media_galleries/picasa_types.h
+chrome/install_static/chromium_install_modes.h
+chrome/install_static/install_constants.h
+chrome/install_static/install_details.h
+chrome/install_static/install_modes.h
+chrome/install_static/install_util.h
+chrome/install_static/test/scoped_install_details.h
+chrome/installer/util/browser_distribution.h
+chrome/installer/util/google_update_constants.h
+chrome/installer/util/google_update_settings.h
+chrome/installer/util/util_constants.h
+chromeos/chromeos_export.h
+chromeos/login/login_state.h
+chromeos/login/scoped_test_public_session_login_state.h
+chromeos/settings/cros_settings_names.h
+chromeos/settings/cros_settings_provider.h
+components/browser_watcher/features.h
+components/browser_watcher/stability_paths.h
+components/cast_certificate/cast_crl_root_ca_cert_der-inc.h
+components/cdm/browser/cdm_message_filter_android.h
+components/contextual_search/browser/contextual_search_js_api_handler.h
+components/cryptauth/connection_finder.h
+components/cryptauth/connection_observer.h
+components/data_reduction_proxy/core/browser/data_use_group.h
+components/data_reduction_proxy/core/browser/data_use_group_provider.h
+components/data_use_measurement/core/url_request_classifier.h
+components/device_event_log/device_event_log_export.h
+components/dom_distiller/core/font_family_list.h
+components/dom_distiller/core/theme_list.h
+components/login/login_export.h
+components/nacl/browser/nacl_browser_delegate.h
+components/nacl/renderer/ppb_nacl_private.h
+components/omnibox/browser/autocomplete_i18n.h
+components/omnibox/browser/autocomplete_provider_client.h
+components/omnibox/browser/autocomplete_provider_listener.h
+components/password_manager/core/browser/keychain_migration_status_mac.h
+components/policy/core/browser/configuration_policy_handler_parameters.h
+components/policy/proto/policy_proto_export.h
+components/rlz/rlz_tracker_delegate.h
+components/session_manager/session_manager_types.h
+components/sessions/core/sessions_export.h
+components/sync/engine/connection_status.h
+components/sync/engine/net/network_time_update_callback.h
+components/translate/core/browser/translate_infobar_delegate.h
+components/user_manager/user.h
+components/user_manager/user_image/user_image.h
+components/user_manager/user_manager.h
+components/viz/display_compositor/display_provider.h
+components/viz/viz_export.h
+components/wallpaper/wallpaper_export.h
+components/wifi/wifi_export.h
+components/wifi/wifi_service.h
+content/browser/background_fetch/background_fetch_constants.h
+content/browser/service_worker/service_worker_response_type.h
+content/common/gpu_stream_constants.h
+content/common/mac/attributed_string_coder.h
+content/common/mac/font_descriptor.h
+content/public/browser/context_factory.h
+content/public/browser/media_observer.h
+content/renderer/external_popup_menu.h
+content/shell/android/shell_descriptors.h
+device/media_transfer_protocol/media_transfer_protocol_manager.h
+extensions/browser/api/clipboard/clipboard_api.h
+extensions/browser/api/networking_config/networking_config_service_factory.h
+extensions/browser/api/webcam_private/webcam.h
+extensions/browser/api/webcam_private/webcam_private_api.h
+extensions/browser/entry_info.h
+extensions/browser/extension_event_histogram_value.h
+extensions/browser/extension_function_histogram_value.h
+google_apis/gcm/base/encryptor.h
+google_apis/gcm/base/gcm_export.h
+gpu/GLES2/gl2chromium.h
+gpu/GLES2/gl2chromium_autogen.h
+gpu/GLES2/gl2extchromium.h
+gpu/command_buffer/client/context_support.h
+gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
+gpu/command_buffer/client/gles2_interface_autogen.h
+gpu/command_buffer/client/gles2_interface_stub_autogen.h
+gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
+gpu/command_buffer/client/gpu_control_client.h
+gpu/command_buffer/client/ref_counted.h
+gpu/command_buffer/client/shared_memory_limits.h
+gpu/command_buffer/common/command_buffer_shared.h
+gpu/command_buffer/common/gles2_cmd_utils_autogen.h
+gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
+gpu/command_buffer/common/gpu_memory_allocation.h
+gpu/command_buffer/service/gl_stream_texture_image.h
+gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions_autogen.h
+gpu/command_buffer/service/memory_tracking.h
+gpu/command_buffer/service/progress_reporter.h
+gpu/gles2_conform_support/gtf/gtf_stubs.h
+gpu/gpu_export.h
+headless/lib/headless_macros.h
+headless/public/headless_tab_socket.h
+ipc/ipc_channel_proxy_unittest_messages.h
+ipc/ipc_message_null_macros.h
+ipc/param_traits_size_macros.h
+media/audio/audio_logging.h
+media/audio/sounds/test_data.h
+media/base/routing_token_callback.h
+media/base/video_renderer_sink.h
+media/cast/common/mod_util.h
+media/cast/net/rtcp/rtcp_session.h
+media/filters/ffmpeg_aac_bitstream_converter.h
+media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.h
+media/filters/h264_to_annex_b_bitstream_converter.h
+media/formats/mp4/avc.h
+media/formats/mp4/bitstream_converter.h
+media/formats/mp4/fourccs.h
+media/formats/mp4/rcheck.h
+media/formats/mpeg/adts_stream_parser.h
+media/formats/mpeg/mpeg1_audio_stream_parser.h
+media/formats/mpeg/mpeg_audio_stream_parser_base.h
+media/gpu/media_gpu_export.h
+mojo/common/mojo_common_export.h
+mojo/edk/system/broker_messages.h
+mojo/edk/system/system_impl_export.h
+mojo/public/cpp/bindings/strong_associated_binding_set.h
+mojo/public/cpp/bindings/tests/mojo_test_blink_export.h
+mojo/public/cpp/test_support/test_support.h
+net/base/winsock_init.h
+net/cert/cert_type.h
+net/cert/cert_verify_proc_android.h
+net/cert/scoped_nss_types.h
+net/dns/notify_watcher_mac.h
+net/http/http_status_code_list.h
+net/http/transport_security_state_static.h
+net/quic/core/stream_notifier_interface.h
+ppapi/cpp/pass_ref.h
+ppapi/lib/gl/include/GLES2/gl2.h
+ppapi/lib/gl/include/GLES2/gl2ext.h
+ppapi/lib/gl/include/GLES2/gl2platform.h
+ppapi/lib/gl/include/KHR/khrplatform.h
+ppapi/nacl_irt/irt_manifest.h
+ppapi/nacl_irt/public/irt_ppapi.h
+ppapi/native_client/src/shared/ppapi_proxy/ppruntime.h
+ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.h
+ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.h
+ppapi/native_client/src/untrusted/pnacl_irt_shim/shim_ppapi.h
+ppapi/proxy/content_decryptor_private_serializer.h
+ppapi/proxy/dispatch_reply_message.h
+ppapi/proxy/plugin_proxy_delegate.h
+ppapi/proxy/plugin_resource_callback.h
+ppapi/proxy/ppapi_proxy_export.h
+ppapi/proxy/resource_message_filter.h
+ppapi/proxy/video_decoder_constants.h
+ppapi/shared_impl/api_id.h
+ppapi/shared_impl/dir_contents.h
+ppapi/shared_impl/ppapi_shared_export.h
+ppapi/shared_impl/singleton_resource_id.h
+remoting/base/chromoting_event_log_writer.h
+remoting/base/logging.h
+remoting/client/display/gl_renderer_delegate.h
+remoting/client/display/gl_texture_ids.h
+remoting/codec/webrtc_video_encoder.h
+remoting/host/linux/x11_keyboard.h
+remoting/host/worker_process_ipc_delegate.h
+remoting/protocol/audio_source.h
+remoting/protocol/audio_stream.h
+remoting/protocol/cursor_shape_stub.h
+remoting/protocol/message_channel_factory.h
+remoting/protocol/test_event_matchers.h
+remoting/protocol/video_feedback_stub.h
+remoting/protocol/video_stream.h
+sandbox/linux/system_headers/capability.h
+sdch/linux/config.h
+services/service_manager/public/c/main.h
+services/ui/ws/ids.h
+skia/ext/convolver_mips_dspr2.h
+skia/ext/skia_commit_hash.h
+skia/ext/texture_handle.h
+testing/gmock_mutant.h
+third_party/WebKit/Source/bindings/modules/v8/serialization/WebCryptoSubTags.h
+third_party/WebKit/Source/core/animation/CSSInterpolationEnvironment.h
+third_party/WebKit/Source/core/animation/SVGInterpolationEnvironment.h
+third_party/WebKit/Source/core/css/CSSPropertyMetadata.h
+third_party/WebKit/Source/core/css/resolver/StyleBuilder.h
+third_party/WebKit/Source/core/css/threaded/MultiThreadedTestUtil.h
+third_party/WebKit/Source/core/css/zoomAdjustedPixelValue.h
+third_party/WebKit/Source/core/dom/ArrayBufferViewHelpers.h
+third_party/WebKit/Source/core/editing/FindOptions.h
+third_party/WebKit/Source/core/paint/FindPaintOffsetAndVisualRectNeedingUpdate.h
+third_party/WebKit/Source/core/style/ShapeValue.h
+third_party/WebKit/Source/core/style/TransformOrigin.h
+third_party/WebKit/Source/platform/ColorSuggestion.h
+third_party/WebKit/Source/platform/EncryptedMediaRequest.h
+third_party/WebKit/Source/platform/fonts/FontSelector.h
+third_party/WebKit/Source/platform/fonts/Glyph.h
+third_party/WebKit/Source/platform/graphics/cpu/arm/WebGLImageConversionNEON.h
+third_party/WebKit/Source/platform/graphics/cpu/mips/WebGLImageConversionMSA.h
+third_party/WebKit/Source/platform/graphics/paint/PaintImage.h
+third_party/WebKit/Source/platform/scheduler/base/task_queue.h
+third_party/WebKit/Source/platform/scroll/ScrollerSizeMetrics.h
+third_party/WebKit/Source/platform/text/TabSize.h
+third_party/WebKit/Source/platform/text/TextDirection.h
+third_party/WebKit/Source/platform/transforms/TransformOperation.h
+third_party/WebKit/public/platform/WebFeaturePolicyFeature.h
+third_party/WebKit/public/platform/WebSourceLocation.h
+third_party/WebKit/public/platform/WebTouchInfo.h
+third_party/WebKit/public/platform/modules/media_capabilities/WebMediaCapabilitiesInfo.h
+third_party/cacheinvalidation/src/google/cacheinvalidation/impl/build_constants.h
+third_party/expat/files/lib/ascii.h
+third_party/expat/files/lib/asciitab.h
+third_party/expat/files/lib/expat_config.h
+third_party/expat/files/lib/expat_external.h
+third_party/expat/files/lib/iasciitab.h
+third_party/expat/files/lib/internal.h
+third_party/expat/files/lib/latin1tab.h
+third_party/expat/files/lib/nametab.h
+third_party/expat/files/lib/utf8tab.h
+third_party/expat/files/lib/xmlrole.h
+third_party/expat/files/lib/xmltok.h
+third_party/expat/files/lib/xmltok_impl.h
+third_party/harfbuzz-ng/src/hb-ot-cbdt-table.hh
+third_party/harfbuzz-ng/src/hb-ot-cmap-table.hh
+third_party/harfbuzz-ng/src/hb-ot-glyf-table.hh
+third_party/harfbuzz-ng/src/hb-ot-layout-jstf-table.hh
+third_party/harfbuzz-ng/src/hb-ot-os2-table.hh
+third_party/hunspell/src/hunspell/hunvisapi.h
+third_party/khronos/EGL/egl.h
+third_party/khronos/EGL/eglext.h
+third_party/khronos/EGL/eglplatform.h
+third_party/khronos/GLES2/gl2.h
+third_party/khronos/GLES2/gl2ext.h
+third_party/khronos/GLES2/gl2platform.h
+third_party/khronos/GLES3/gl3.h
+third_party/khronos/GLES3/gl3platform.h
+third_party/khronos/KHR/khrplatform.h
+third_party/leveldatabase/chromium_logger.h
+third_party/libaddressinput/chromium/addressinput_util.h
+third_party/libaddressinput/chromium/override/basictypes_override.h
+third_party/libphonenumber/phonenumber_api.h
+third_party/libudev/libudev0.h
+third_party/libudev/libudev1.h
+third_party/libvpx/source/config/linux/x64/vp8_rtcd.h
+third_party/libvpx/source/config/linux/x64/vp9_rtcd.h
+third_party/libvpx/source/config/linux/x64/vpx_config.h
+third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h
+third_party/libvpx/source/config/linux/x64/vpx_scale_rtcd.h
+third_party/libvpx/source/config/nacl/vp8_rtcd.h
+third_party/libvpx/source/config/nacl/vp9_rtcd.h
+third_party/libvpx/source/config/nacl/vpx_config.h
+third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h
+third_party/libvpx/source/config/nacl/vpx_scale_rtcd.h
+third_party/libvpx/source/config/vpx_version.h
+third_party/libxslt/src/libxslt/xsltwin32config.h
+third_party/opus/src/src/opus_private.h
+third_party/opus/src/tests/test_opus_common.h
+third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_names.h
+third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_params.h
+third_party/qcms/src/halffloat.h
+third_party/qcms/src/tests/qcms_test_util.h
+third_party/qcms/src/tests/timing.h
+third_party/snappy/linux/config.h
+third_party/speech-dispatcher/libspeechd.h
+third_party/sqlite/sqlite3.h
+third_party/tcmalloc/chromium/src/addressmap-inl.h
+third_party/tcmalloc/chromium/src/base/basictypes.h
+third_party/tcmalloc/chromium/src/base/dynamic_annotations.h
+third_party/tcmalloc/chromium/src/base/googleinit.h
+third_party/tcmalloc/chromium/src/base/linux_syscall_support.h
+third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h
+third_party/tcmalloc/chromium/src/base/stl_allocator.h
+third_party/tcmalloc/chromium/src/base/thread_annotations.h
+third_party/tcmalloc/chromium/src/base/thread_lister.h
+third_party/tcmalloc/chromium/src/gperftools/malloc_extension_c.h
+third_party/tcmalloc/chromium/src/gperftools/malloc_hook_c.h
+third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h
+third_party/tcmalloc/chromium/src/heap-profile-stats.h
+third_party/tcmalloc/chromium/src/libc_override.h
+third_party/tcmalloc/chromium/src/malloc_hook_mmap_linux.h
+third_party/tcmalloc/chromium/src/packed-cache-inl.h
+third_party/tcmalloc/chromium/src/page_heap_allocator.h
+third_party/tcmalloc/chromium/src/pagemap.h
+third_party/tcmalloc/chromium/src/stacktrace_config.h
+third_party/tcmalloc/chromium/src/stacktrace_x86-inl.h
+third_party/tcmalloc/chromium/src/system-alloc.h
+third_party/tcmalloc/chromium/src/tcmalloc_guard.h
+third_party/wayland/include/config.h
+third_party/wayland/include/src/wayland-version.h
+third_party/woff2/src/port.h
+third_party/yasm/source/config/linux/config.h
+third_party/yasm/source/config/linux/libyasm-stdint.h
+third_party/zlib/contrib/minizip/crypt.h
+tools/battor_agent/battor_protocol_types.h
+tools/gn/ordered_set.h
+tools/ipc_fuzzer/message_lib/all_message_null_macros.h
+ui/app_list/app_list_export.h
+ui/app_list/app_list_item.h
+ui/app_list/app_list_switches.h
+ui/base/clipboard/clipboard_test_template.h
+ui/events/keycodes/keyboard_codes_posix.h
+ui/gfx/overlay_transform.h
+ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h
+ui/gfx/swap_result.h
+ui/gfx/sys_color_change_listener.h
+ui/gl/GL/glextchromium.h
+ui/gl/gl_bindings_api_autogen_egl.h
+ui/gl/gl_bindings_api_autogen_gl.h
+ui/gl/gl_bindings_api_autogen_glx.h
+ui/gl/gl_bindings_api_autogen_osmesa.h
+ui/gl/gpu_preference.h
+ui/gl/gpu_switching_observer.h
+ui/ozone/ozone_base_export.h
+ui/ozone/public/ozone_switches.h
diff --git a/chromium/build/config/BUILD.gn b/chromium/build/config/BUILD.gn
index aff0e3d9d36..3febe8383b9 100644
--- a/chromium/build/config/BUILD.gn
+++ b/chromium/build/config/BUILD.gn
@@ -3,11 +3,19 @@
# found in the LICENSE file.
import("//build/config/allocator.gni")
+import("//build/config/c++/c++.gni")
import("//build/config/chrome_build.gni")
import("//build/config/chromecast_build.gni")
import("//build/config/crypto.gni")
import("//build/config/dcheck_always_on.gni")
import("//build/config/features.gni")
+
+# Subprojects need to override arguments in mac_sdk_overrides.gni in their .gn
+# config, but those arguments are only used on macOS. Including
+# mac_sdk_overrides.gni insures that this doesn't trigger an unused argument
+# warning.
+import("//build/config/mac/mac_sdk_overrides.gni")
+
import("//build/config/pch.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/ui.gni")
@@ -258,19 +266,24 @@ config("default_libs") {
} else if (is_linux) {
libs = [
"dl",
+ "pthread",
"rt",
]
}
}
# Dependencies that all executables and shared libraries should have.
-# All targets that currently depend on //build/config/sanitizers:deps
-# are being made to depend on this target instead
-# (https://crbug.com/723069).
group("exe_and_shlib_deps") {
- public_deps = [
- "//build/config/sanitizers:deps",
- ]
+ public_deps = []
+ if (using_sanitizer) {
+ public_deps += [ "//build/config/sanitizers:deps" ]
+ }
+ if (use_custom_libcxx) {
+ public_deps += [ "//buildtools/third_party/libc++" ]
+ }
+ if (use_afl) {
+ public_deps += [ "//third_party/afl" ]
+ }
}
# Executable configs -----------------------------------------------------------
diff --git a/chromium/build/config/BUILDCONFIG.gn b/chromium/build/config/BUILDCONFIG.gn
index fa4ec72c87c..de3f35f124a 100644
--- a/chromium/build/config/BUILDCONFIG.gn
+++ b/chromium/build/config/BUILDCONFIG.gn
@@ -137,9 +137,10 @@ declare_args() {
# to configure warnings.
is_clang =
current_os == "mac" || current_os == "ios" || current_os == "chromeos" ||
- current_os == "fuchsia" ||
+ current_os == "fuchsia" || current_os == "android" ||
(current_os == "linux" && current_cpu != "s390x" &&
- current_cpu != "s390" && current_cpu != "ppc64" && current_cpu != "ppc")
+ current_cpu != "s390" && current_cpu != "ppc64" &&
+ current_cpu != "ppc" && current_cpu != "mips" && current_cpu != "mips64")
# Allows the path to a custom target toolchain to be injected as a single
# argument, and set as the default toolchain.
@@ -508,7 +509,6 @@ default_compiler_configs = [
"//build/config:feature_flags",
"//build/config/compiler:afdo",
"//build/config/compiler:compiler",
- "//build/config/compiler:pthread",
"//build/config/compiler:clang_stackrealign",
"//build/config/compiler:compiler_arm_fpu",
"//build/config/compiler:compiler_arm_thumb",
diff --git a/chromium/build/config/allocator.gni b/chromium/build/config/allocator.gni
index a08a1430e23..5ac3ed67049 100644
--- a/chromium/build/config/allocator.gni
+++ b/chromium/build/config/allocator.gni
@@ -28,8 +28,6 @@ declare_args() {
# Memory allocator to use. Set to "none" to use default allocator.
use_allocator = _default_allocator
- # TODO(primiano): this should just become the default without having a flag,
- # but we need to get there first. http://crbug.com/550886 .
# Causes all the allocations to be routed via allocator_shim.cc.
use_allocator_shim = _default_use_allocator_shim
}
diff --git a/chromium/build/config/android/BUILD.gn b/chromium/build/config/android/BUILD.gn
index ea55411920e..35ecf928db9 100644
--- a/chromium/build/config/android/BUILD.gn
+++ b/chromium/build/config/android/BUILD.gn
@@ -22,8 +22,9 @@ config("compiler") {
# does. Define them here instead.
"HAVE_SYS_UIO_H",
- # Forces full rebuilds on NDK rolls.
- "ANDROID_NDK_VERSION=${android_ndk_version}",
+ # Forces full rebuilds on NDK rolls. To rebuild everything when NDK version
+ # stays the same, increment the suffix number.
+ "ANDROID_NDK_VERSION_ROLL=${android_ndk_version}_1",
]
if (is_clang) {
@@ -150,7 +151,7 @@ config("runtime_library") {
]
# Clang with libc++ does not require an explicit atomic library reference.
- if (!is_clang) {
+ if (!is_clang || (current_cpu == "arm" && arm_version == 6)) {
libs += [ "atomic" ]
}
diff --git a/chromium/build/config/android/config.gni b/chromium/build/config/android/config.gni
index 1d276ffcedc..5f94cefa335 100644
--- a/chromium/build/config/android/config.gni
+++ b/chromium/build/config/android/config.gni
@@ -43,15 +43,16 @@ if (is_android) {
if (!defined(default_android_sdk_root)) {
default_android_sdk_root = "//third_party/android_tools/sdk"
- default_android_sdk_version = "25"
- default_android_sdk_build_tools_version = "25.0.2"
+ default_android_sdk_version = "26"
+ default_android_sdk_build_tools_version = "26.0.0"
+ default_android_sdk_tools_version_suffix = "-25.3.2"
}
if (!defined(default_lint_android_sdk_root)) {
# Purposefully repeated so that downstream can change
# default_android_sdk_root without changing lint version.
default_lint_android_sdk_root = "//third_party/android_tools/sdk"
- default_lint_android_sdk_version = "25"
+ default_lint_android_sdk_version = "26"
}
if (!defined(default_extras_android_sdk_root)) {
@@ -86,8 +87,12 @@ if (is_android) {
google_play_services_package = "//third_party/android_tools"
}
+ if (!defined(system_webview_apk_target)) {
+ system_webview_apk_target = "//android_webview:system_webview_apk"
+ }
+
webview_public_framework_jar =
- "//third_party/android_platform/webview/frameworks_7.1.1_r28.jar"
+ "//third_party/android_system_sdk/android_system.jar"
if (!defined(webview_framework_jar)) {
webview_framework_jar = webview_public_framework_jar
}
@@ -100,6 +105,7 @@ if (is_android) {
android_sdk_root = default_android_sdk_root
android_sdk_version = default_android_sdk_version
android_sdk_build_tools_version = default_android_sdk_build_tools_version
+ android_sdk_tools_version_suffix = default_android_sdk_tools_version_suffix
lint_android_sdk_root = default_lint_android_sdk_root
lint_android_sdk_version = default_lint_android_sdk_version
@@ -171,6 +177,10 @@ if (is_android) {
# Ex. with this arg set to true, the chrome_public_apk target result in
# chrome_public_apk_incremental being built.
incremental_apk_by_default = false
+
+ # Allow concurrent proguarding and final dexing.
+ # TODO(jbudorick): Remove this once pools are supported for actions.
+ enable_concurrent_apk_finalization = false
}
# We need a second declare_args block to make sure we are using the overridden
@@ -186,6 +196,9 @@ if (is_android) {
assert(!(enable_incremental_dx && !is_java_debug))
assert(!(enable_incremental_javac && !is_java_debug))
+ # Path to where selected build variables are written to.
+ android_build_vars = "$root_build_dir/build_vars.txt"
+
# Host stuff -----------------------------------------------------------------
# Defines the name the Android build gives to the current host CPU
diff --git a/chromium/build/config/android/internal_rules.gni b/chromium/build/config/android/internal_rules.gni
index a67956961a0..8257d042612 100644
--- a/chromium/build/config/android/internal_rules.gni
+++ b/chromium/build/config/android/internal_rules.gni
@@ -835,6 +835,7 @@ if (enable_java_templates) {
"--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)",
"--resource-sources=@FileArg($_rebased_build_config:deps_info:owned_resources_dirs)",
"--resource-sources=@FileArg($_rebased_build_config:deps_info:owned_resources_zips)",
+ "--srcjars=@FileArg($_rebased_build_config:gradle:bundled_srcjars)",
"--can-fail-build",
]
}
@@ -852,6 +853,13 @@ if (enable_java_templates) {
"testonly",
])
script = "//build/android/gyp/proguard.py"
+
+ # http://crbug.com/725224. Speculative fix for bots running out of memory.
+ # TODO(agrieve): Change this to an explicit pool once those are supported.
+ # http://crbug.com/635308
+ if (!enable_concurrent_apk_finalization) {
+ console = true
+ }
if (defined(invoker.proguard_jar_path)) {
_proguard_jar_path = invoker.proguard_jar_path
} else {
@@ -1029,6 +1037,14 @@ if (enable_java_templates) {
script = "//build/android/gyp/main_dex_list.py"
depfile = "$target_gen_dir/$target_name.d"
+ # http://crbug.com/725224. Speculative fix for bots running out of
+ # memory.
+ # TODO(agrieve): Change this to an explicit pool once those are
+ # supported. http://crbug.com/635308
+ if (!enable_concurrent_apk_finalization) {
+ console = true
+ }
+
main_dex_rules = "//build/android/main_dex_classes.flags"
if (defined(invoker.proguard_jar_path)) {
@@ -1095,6 +1111,12 @@ if (enable_java_templates) {
invoker.output,
]
+ if (defined(invoker.use_pool) && invoker.use_pool) {
+ # TODO(agrieve): Change this to an explicit pool once those are
+ # supported. http://crbug.com/635308
+ console = true
+ }
+
rebased_output = rebase_path(invoker.output, root_build_dir)
args = [
@@ -1159,8 +1181,9 @@ if (enable_java_templates) {
defined(invoker.supports_android) && invoker.supports_android &&
(is_java_debug || dcheck_always_on)
- _retrolambda = defined(invoker.supports_android) &&
- invoker.supports_android && use_java8
+ _retrolambda =
+ defined(invoker.supports_android) && invoker.supports_android &&
+ ((defined(invoker.process_java8) && invoker.process_java8) || use_java8)
_deps = []
_previous_output_jar = _input_jar_path
@@ -1608,7 +1631,17 @@ if (enable_java_templates) {
}
template("package_resources_helper") {
- action(target_name) {
+ _resource_packaged_apk_path = invoker.resource_packaged_apk_path
+ _package_resources_target = target_name
+ _post_process = defined(invoker.post_process_package_resources_script)
+ if (_post_process) {
+ _package_resources_target = "${_package_resources_target}__intermediate"
+ _post_processed_resource_packaged_apk_path = _resource_packaged_apk_path
+ _resource_packaged_apk_path =
+ "${_resource_packaged_apk_path}__intermediate.ap_"
+ }
+
+ action(_package_resources_target) {
deps = invoker.deps
script = "//build/android/gyp/package_resources.py"
@@ -1620,7 +1653,7 @@ if (enable_java_templates) {
inputs += [ _resources_zip ]
}
outputs = [
- invoker.resource_packaged_apk_path,
+ _resource_packaged_apk_path,
]
if (defined(invoker.android_aapt_path)) {
@@ -1651,7 +1684,7 @@ if (enable_java_templates) {
"--version-name",
_version_name,
"--apk-path",
- rebase_path(invoker.resource_packaged_apk_path, root_build_dir),
+ rebase_path(_resource_packaged_apk_path, root_build_dir),
]
if (defined(_resources_zip)) {
@@ -1687,6 +1720,47 @@ if (enable_java_templates) {
invoker.extensions_to_not_compress,
]
}
+ if (defined(invoker.png_to_webp) && invoker.png_to_webp) {
+ _webp_target = "//third_party/libwebp:cwebp($host_toolchain)"
+ deps += [ _webp_target ]
+ args += [
+ "--png-to-webp",
+ "--webp-binary",
+ rebase_path(get_label_info(_webp_target, "root_out_dir") + "/cwebp",
+ root_build_dir),
+ ]
+ }
+ if (defined(invoker.exclude_xxxhdpi) && invoker.exclude_xxxhdpi) {
+ args += [ "--exclude-xxxhdpi" ]
+ if (defined(invoker.xxxhdpi_whitelist)) {
+ args += [ "--xxxhdpi-whitelist=${invoker.xxxhdpi_whitelist}" ]
+ }
+ }
+ }
+
+ if (_post_process) {
+ action(target_name) {
+ depfile = "${target_gen_dir}/${target_name}.d"
+ script = invoker.post_process_package_resources_script
+ args = [
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--apk-path",
+ rebase_path(_resource_packaged_apk_path, root_build_dir),
+ "--output",
+ rebase_path(_post_processed_resource_packaged_apk_path,
+ root_build_dir),
+ ]
+ inputs = [
+ _resource_packaged_apk_path,
+ ]
+ outputs = [
+ _post_processed_resource_packaged_apk_path,
+ ]
+ deps = [
+ ":${_package_resources_target}",
+ ]
+ }
}
}
@@ -1697,7 +1771,11 @@ if (enable_java_templates) {
"aapt_locale_whitelist",
"alternative_android_sdk_jar",
"android_aapt_path",
+ "exclude_xxxhdpi",
"extensions_to_not_compress",
+ "png_to_webp",
+ "post_process_package_resources_script",
+ "xxxhdpi_whitelist",
])
deps = _deps
android_manifest = _android_manifest
@@ -1746,7 +1824,11 @@ if (enable_java_templates) {
"aapt_locale_whitelist",
"alternative_android_sdk_jar",
"android_aapt_path",
+ "exclude_xxxhdpi",
"extensions_to_not_compress",
+ "png_to_webp",
+ "post_process_package_resources_script",
+ "xxxhdpi_whitelist",
])
deps =
_incremental_deps + [ ":$_generate_incremental_manifest_target_name" ]
@@ -1963,6 +2045,7 @@ if (enable_java_templates) {
[
"jar_excluded_patterns",
"strip_resource_classes",
+ "process_java8",
])
visibility = [
@@ -2024,7 +2107,11 @@ if (enable_java_templates) {
}
group(target_name) {
- forward_variables_from(invoker, [ "data_deps" ])
+ forward_variables_from(invoker,
+ [
+ "data",
+ "data_deps",
+ ])
public_deps = [
":$_ijar_target_name",
":$_process_jar_target_name",
diff --git a/chromium/build/config/android/rules.gni b/chromium/build/config/android/rules.gni
index 6aeabdc6e5b..954716a2530 100644
--- a/chromium/build/config/android/rules.gni
+++ b/chromium/build/config/android/rules.gni
@@ -192,7 +192,6 @@ if (enable_java_templates) {
"--depfile",
rebase_path(depfile, root_build_dir),
"--input_file={{source}}",
- "--optimize_generation=1",
"--ptr_type=long",
"--output_dir",
rebase_path(jni_output_dir, root_build_dir),
@@ -302,7 +301,6 @@ if (enable_java_templates) {
rebase_path(jar_file, root_build_dir),
"--input_file",
class,
- "--optimize_generation=1",
"--ptr_type=long",
"--output_dir",
rebase_path(jni_output_dir, root_build_dir),
@@ -334,6 +332,64 @@ if (enable_java_templates) {
}
}
+ # Declare a jni registration target.
+ #
+ # This target generates a header file calling JNI registration functions
+ # created by generate_jni and generate_jar_jni.
+ #
+ # See base/android/jni_generator/jni_registration_generator.py for more info
+ # about the format of the header file.
+ #
+ # Variables
+ # target: The Apk target to generate registrations for.
+ # output: Path to the generated .h file.
+ # exception_files: List of .java files that should be ignored when searching
+ # for native methods. (optional)
+ #
+ # Example
+ # generate_jni_registration("chrome_jni_registration") {
+ # target = ":chrome_public_apk"
+ # output = "$root_gen_dir/chrome/browser/android/${target_name}.h"
+ # exception_files = [
+ # "//base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
+ # "//base/android/java/src/org/chromium/base/library_loader/Linker.java",
+ # "//base/android/java/src/org/chromium/base/library_loader/ModernLinker.java",
+ # ]
+ # }
+ template("generate_jni_registration") {
+ action(target_name) {
+ forward_variables_from(invoker, [ "testonly" ])
+ _build_config = get_label_info(invoker.target, "target_gen_dir") + "/" +
+ get_label_info(invoker.target, "name") + ".build_config"
+ _rebased_build_config = rebase_path(_build_config, root_build_dir)
+
+ _rebase_exception_java_files =
+ rebase_path(invoker.exception_files, root_build_dir)
+
+ script = "//base/android/jni_generator/jni_registration_generator.py"
+ deps = [
+ "${invoker.target}__build_config",
+ ]
+ inputs = [
+ _build_config,
+ ]
+ outputs = [
+ invoker.output,
+ ]
+ depfile = "$target_gen_dir/$target_name.d"
+
+ args = [
+ # This is a list of .sources files.
+ "--sources_files=@FileArg($_rebased_build_config:jni:all_source)",
+ "--output",
+ rebase_path(invoker.output, root_build_dir),
+ "--no_register_java=$_rebase_exception_java_files",
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ ]
+ }
+ }
+
# Declare a target for c-preprocessor-generated java files
#
# NOTE: For generating Java conterparts to enums prefer using the java_cpp_enum
@@ -1215,6 +1271,8 @@ if (enable_java_templates) {
# supports_android: If true, Android targets (android_library, android_apk)
# may depend on this target. Note: if true, this target must only use the
# subset of Java available on Android.
+ # process_java8: The specified prebuilt jar contains Java 8 bytecode;
+ # process it for compatibility with Java 7.
#
# Example
# java_prebuilt("foo_java") {
@@ -1433,6 +1491,8 @@ if (enable_java_templates) {
# Defaults to the input .jar file name.
# proguard_configs: List of proguard configs to use in final apk step for
# any apk that depends on this library.
+ # process_java8: The specified prebuilt jar contains Java 8 bytecode;
+ # process it for compatibility with Java 7.
#
# Example
# android_java_prebuilt("foo_java") {
@@ -1465,6 +1525,8 @@ if (enable_java_templates) {
# android_manifest: Path to AndroidManifest.xml.
# android_manifest_dep: Target that generates AndroidManifest (if applicable)
# chromium_code: If true, extra analysis warning/errors will be enabled.
+ # png_to_webp: If true, pngs (with the exception of 9-patch) are
+ # converted to webp during resource packaging.
# dist_ijar_path: Path to create "${target_name}_dist_ijar" target
# (used by instrumentation_test_apk).
# data_deps: List of dependencies needed at runtime. These will be built but
@@ -1521,6 +1583,10 @@ if (enable_java_templates) {
# never_incremental: If true, |incremental_apk_by_default| will be ignored.
# aapt_locale_whitelist: If set, all locales not in this list will be
# stripped from resources.arsc.
+ # exclude_xxxhdpi: Causes all drawable-xxxhdpi images to be excluded
+ # (mipmaps are still included).
+ # xxxhdpi_whitelist: A list of globs used when exclude_xxxhdpi=true. Files
+ # that match this whitelist will still be included.
#
# Example
# android_apk("foo_apk") {
@@ -1711,11 +1777,11 @@ if (enable_java_templates) {
}
sources = []
}
- _android_manifest_deps = []
+ _android_root_manifest_deps = []
if (defined(invoker.android_manifest_dep)) {
- _android_manifest_deps = [ invoker.android_manifest_dep ]
+ _android_root_manifest_deps = [ invoker.android_manifest_dep ]
}
- _android_manifest = invoker.android_manifest
+ _android_root_manifest = invoker.android_manifest
_rebased_build_config = rebase_path(_build_config, root_build_dir)
_create_abi_split =
@@ -1754,14 +1820,15 @@ if (enable_java_templates) {
incremental_install_script_path = _incremental_install_script_path
resources_zip = resources_zip_path
build_config = _build_config
- android_manifest = _android_manifest
+ android_manifest = _android_root_manifest
if (defined(_java_sources_file)) {
java_sources_file = _java_sources_file
}
- deps = _android_manifest_deps
+ deps = _android_root_manifest_deps
+ possible_config_deps = []
if (defined(invoker.deps)) {
possible_config_deps = invoker.deps
}
@@ -1790,6 +1857,34 @@ if (enable_java_templates) {
}
}
+ _android_manifest =
+ "$target_gen_dir/${_template_name}_manifest/AndroidManifest.xml"
+ android_manifest_target = "${_template_name}__merge_manifests"
+ action(android_manifest_target) {
+ script = "//build/android/gyp/merge_manifest.py"
+
+ sources = [
+ _android_root_manifest,
+ ]
+
+ outputs = [
+ _android_manifest,
+ ]
+
+ args = [
+ "--build-vars",
+ rebase_path(android_build_vars, root_build_dir),
+ "--root-manifest",
+ rebase_path(_android_root_manifest, root_build_dir),
+ "--output",
+ rebase_path(_android_manifest, root_build_dir),
+ "--extras",
+ "@FileArg($_rebased_build_config:extra_android_manifests)",
+ ]
+
+ deps = _android_root_manifest_deps + [ ":$build_config_target" ]
+ }
+
_final_deps = []
if (enable_multidex) {
@@ -1820,7 +1915,10 @@ if (enable_java_templates) {
}
build_config = _build_config
- deps = _android_manifest_deps + [ ":$build_config_target" ]
+ deps = [
+ ":$android_manifest_target",
+ ":$build_config_target",
+ ]
if (defined(invoker.deps)) {
deps += invoker.deps
}
@@ -1926,7 +2024,10 @@ if (enable_java_templates) {
supports_android = true
requires_android = true
override_build_config = _build_config
- deps = _android_manifest_deps + [ ":$build_config_target" ]
+ deps = [
+ ":$android_manifest_target",
+ ":$build_config_target",
+ ]
android_manifest = _android_manifest
srcjar_deps = _srcjar_deps
@@ -2063,6 +2164,9 @@ if (enable_java_templates) {
}
args = [ "--inputs=@FileArg($_dex_arg_key)" ]
}
+
+ # http://crbug.com/725224. Speculative fix for bots running out of memory.
+ use_pool = !enable_concurrent_apk_finalization
}
_native_libs_file_arg_dep = ":$build_config_target"
@@ -2162,13 +2266,17 @@ if (enable_java_templates) {
"android_aapt_path",
"app_as_shared_lib",
"deps",
+ "exclude_xxxhdpi",
"extensions_to_not_compress",
"language_splits",
+ "png_to_webp",
+ "post_process_package_resources_script",
"public_deps",
"secondary_native_libs",
"shared_resources",
"uncompress_shared_libraries",
"write_asset_list",
+ "xxxhdpi_whitelist",
])
if (!defined(deps)) {
deps = []
@@ -2196,17 +2304,19 @@ if (enable_java_templates) {
keystore_password = _keystore_password
# Incremental apk does not use native libs nor final dex.
- incremental_deps = deps + _android_manifest_deps + [
+ incremental_deps = deps + [
+ ":$android_manifest_target",
":$build_config_target",
":$process_resources_target",
]
# This target generates the input file _all_resources_zip_path.
- deps += _android_manifest_deps + [
- ":$build_config_target",
- ":$process_resources_target",
- ":$final_dex_target_name",
- ]
+ deps += [
+ ":$android_manifest_target",
+ ":$build_config_target",
+ ":$final_dex_target_name",
+ ":$process_resources_target",
+ ]
if ((_native_libs_deps != [] ||
_extra_native_libs_even_when_incremental != []) &&
@@ -2239,7 +2349,9 @@ if (enable_java_templates) {
out_manifest =
"$gen_dir/split-manifests/${android_app_abi}/AndroidManifest.xml"
split_name = "abi_${android_app_abi}"
- deps = _android_manifest_deps
+ deps = [
+ ":$android_manifest_target",
+ ]
}
_apk_rule = "${_template_name}__split_apk_abi_${android_app_abi}"
@@ -2333,11 +2445,55 @@ if (enable_java_templates) {
}
}
+ _apk_operations = []
+ _incremental_apk_operations = []
+
+ # Generate apk opeartion related script.
+ if (!defined(invoker.create_apk_script) || invoker.create_apk_script) {
+ _apk_operations_target_name = "${target_name}__apk_operations"
+ action(_apk_operations_target_name) {
+ _generated_script = "$root_build_dir/bin/${invoker.target_name}"
+ script = "//build/android/gyp/create_apk_operations_script.py"
+ outputs = [
+ _generated_script,
+ ]
+ args = [
+ "--script-output-path",
+ rebase_path(_generated_script, root_build_dir),
+ ]
+ if (defined(invoker.command_line_flags_file)) {
+ args += [
+ "--command-line-flags-file",
+ invoker.command_line_flags_file,
+ ]
+ }
+
+ if (_incremental_allowed) {
+ args += [
+ "--incremental-apk-path",
+ rebase_path("${_final_apk_path_no_ext}_incremental.apk",
+ root_build_dir),
+ "--incremental-install-script",
+ rebase_path(_incremental_install_script_path, root_build_dir),
+ ]
+ }
+ if (!incremental_apk_by_default) {
+ args += [
+ "--apk-path",
+ rebase_path(_final_apk_path, root_build_dir),
+ ]
+ }
+ }
+ _apk_operations += [ ":$_apk_operations_target_name" ]
+ _incremental_apk_operations += [ ":$_apk_operations_target_name" ]
+ }
+
group(target_name) {
if (_incremental_allowed && incremental_apk_by_default) {
deps = [
":${target_name}_incremental",
]
+ assert(_apk_operations != [] || true) # Prevent "unused variable".
} else {
forward_variables_from(invoker,
[
@@ -2346,6 +2502,9 @@ if (enable_java_templates) {
])
public_deps = _final_deps
+ # Generate apk related operations at runtime.
+ public_deps += _apk_operations
+
# Make the proguard .mapping file easy to find by putting it beside the .apk.
if (_proguard_enabled) {
deps = [
@@ -2378,6 +2537,9 @@ if (enable_java_templates) {
":${_template_name}__create_incremental",
":${java_target}",
]
+
+ # Generate incremental apk related operations at runtime.
+ public_deps += _incremental_apk_operations
}
}
}
@@ -2505,6 +2667,7 @@ if (enable_java_templates) {
run_findbugs_override =
invoker.run_findbugs_override && defined(invoker.java_files)
}
+ create_apk_script = false
}
group(target_name) {
@@ -2593,6 +2756,7 @@ if (enable_java_templates) {
deps = []
forward_variables_from(invoker, "*")
testonly = true
+ create_apk_script = false
assert(!defined(invoker.proguard_enabled) || !invoker.proguard_enabled ||
invoker.proguard_configs != [])
diff --git a/chromium/build/config/c++/BUILD.gn b/chromium/build/config/c++/BUILD.gn
new file mode 100644
index 00000000000..0f594984b21
--- /dev/null
+++ b/chromium/build/config/c++/BUILD.gn
@@ -0,0 +1,56 @@
+# Copyright 2017 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.
+
+import("//build/config/c++/c++.gni")
+
+config("c++flags") {
+ if (use_custom_libcxx) {
+ prefix = "//buildtools/third_party"
+ include = "trunk/include"
+ if (!is_clang) {
+ # Gcc has a built-in abs() definition with default visibility.
+ # If it was not disabled, it would conflict with libc++'s abs()
+ # with hidden visibility.
+ cflags = [ "-fno-builtin-abs" ]
+ }
+ cflags_cc = [
+ "-nostdinc++",
+ "-isystem" + rebase_path("$prefix/libc++/$include", root_build_dir),
+ "-isystem" + rebase_path("$prefix/libc++abi/$include", root_build_dir),
+ ]
+ if (is_linux && current_cpu == "arm") {
+ cflags_c = [ "-isystem" +
+ rebase_path("$prefix/libunwind/$include", root_build_dir) ]
+ cflags_cc += [ "-isystem" +
+ rebase_path("$prefix/libunwind/$include", root_build_dir) ]
+ }
+
+ # Make sure we don't link against libc++ or libstdc++.
+ ldflags = [ "-nodefaultlibs" ]
+
+ # Unfortunately, there's no way to disable linking against just
+ # libc++ (besides using clang instead of clang++); -nodefaultlibs
+ # removes all of the default libraries, so add back the ones that we
+ # need.
+ libs = [
+ "c",
+ "m",
+ ]
+
+ if (!is_mac) {
+ libs += [
+ "gcc_s",
+ "rt",
+ ]
+ }
+
+ if (is_mac && using_sanitizer) {
+ lib_dirs = [ "//third_party/llvm-build/Release+Asserts/lib/clang/$clang_version/lib/darwin" ]
+
+ if (is_asan) {
+ libs += [ "clang_rt.asan_osx_dynamic" ]
+ }
+ }
+ }
+}
diff --git a/chromium/build/config/c++/c++.gni b/chromium/build/config/c++/c++.gni
new file mode 100644
index 00000000000..13004aeb0ee
--- /dev/null
+++ b/chromium/build/config/c++/c++.gni
@@ -0,0 +1,23 @@
+# Copyright 2017 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.
+
+import("//build/config/sanitizers/sanitizers.gni")
+
+declare_args() {
+ # Use libc++ (buildtools/third_party/libc++ and
+ # buildtools/third_party/libc++abi) instead of stdlibc++ as standard
+ # library.
+ use_custom_libcxx = (is_linux && !is_chromeos &&
+ (!is_chromecast || is_cast_desktop_build)) || is_msan
+
+ # ASan, MSan and TSan builds need to override operator new, operator delete,
+ # and some exception handling symbols, so libc++ must be a shared library to
+ # prevent duplicate symbol errors when linking.
+ # Additionally, -fsanitize=vptr requires libc++ to be a shared library
+ # because the ubsan runtime library that implements -fsanitize=vptr calls
+ # dynamic_cast with the ABI type info classes, which won't return the right
+ # answer if each DSO has its own copy of the ABI classes.
+ libcpp_is_static = !is_component_build && !is_asan && !is_msan && !is_tsan &&
+ !is_ubsan && !is_ubsan_security && !is_ubsan_vptr
+}
diff --git a/chromium/build/config/compiler/BUILD.gn b/chromium/build/config/compiler/BUILD.gn
index 6e3ddbdc7e1..b5d6d8fdb44 100644
--- a/chromium/build/config/compiler/BUILD.gn
+++ b/chromium/build/config/compiler/BUILD.gn
@@ -13,7 +13,8 @@ import("//build_overrides/build.gni")
if (current_cpu == "arm" || current_cpu == "arm64") {
import("//build/config/arm.gni")
}
-if (current_cpu == "mipsel" || current_cpu == "mips64el") {
+if (current_cpu == "mipsel" || current_cpu == "mips64el" ||
+ current_cpu == "mips" || current_cpu == "mips64") {
import("//build/config/mips.gni")
}
if (is_mac) {
@@ -180,8 +181,10 @@ config("compiler") {
configs += [ "//build/config/aix:compiler" ]
}
- # See the definitions below.
configs += [
+ "//build/config/c++:c++flags",
+
+ # See the definitions below.
":compiler_cpu_abi",
":compiler_codegen",
]
@@ -331,9 +334,7 @@ config("compiler") {
"-Wl,-z,relro",
]
if (!using_sanitizer) {
- if (!use_cfi_diag) {
- ldflags += [ "-Wl,-z,defs" ]
- }
+ ldflags += [ "-Wl,-z,defs" ]
# Functions interposed by the sanitizers can make ld think
# that some libraries aren't needed when they actually are,
@@ -364,13 +365,7 @@ config("compiler") {
ldflags += [ "-fuse-ld=lld" ]
} else if (use_gold) {
ldflags += [ "-fuse-ld=gold" ]
- if (is_android) {
- # Use -mstackrealign due to a bug on ia32 Jelly Bean.
- # See crbug.com/521527
- if (current_cpu == "x86") {
- cflags += [ "-mstackrealign" ]
- }
- } else {
+ if (!is_android) {
# On Android, this isn't needed. gcc in the NDK knows to look next to
# it with -fuse-ld=gold, and clang gets a --gcc-toolchain flag passed
# above.
@@ -408,9 +403,10 @@ config("compiler") {
# merged. See also https://crbug.com/663886
# `linux_use_bundled_binutils` is to avoid breaking Linux distros which may
# still have a buggy gold.
+ # chromeos binutils has been patched with the fix, so always use icf there.
# The bug only affects x86 and x64, so we can still use ICF when targeting
# other architectures.
- if ((!is_android && linux_use_bundled_binutils) ||
+ if ((!is_android && linux_use_bundled_binutils) || is_chromeos ||
!(current_cpu == "x86" || current_cpu == "x64")) {
ldflags += [ "-Wl,--icf=all" ]
}
@@ -420,6 +416,13 @@ config("compiler") {
cflags += [ "-B$binutils_path" ]
}
+ if (is_linux) {
+ cflags += [ "-pthread" ]
+ # Do not use the -pthread ldflag here since it becomes a no-op
+ # when using -nodefaultlibs, which would cause an unused argument
+ # error. "-lpthread" is added in //build/config:default_libs.
+ }
+
# Clang-specific compiler flags setup.
# ------------------------------------
if (is_clang) {
@@ -472,6 +475,8 @@ config("compiler") {
# TODO(pcc): Make this conditional on is_official_build rather than on gn
# flags for specific features.
if (!is_debug && (allow_posix_link_time_opt || is_cfi) && !is_nacl) {
+ assert(use_lld || target_os == "chromeos", "gold plugin only supported with ChromeOS")
+
if (use_thin_lto) {
cflags += [ "-flto=thin" ]
ldflags += [ "-flto=thin" ]
@@ -484,10 +489,21 @@ config("compiler") {
"-Wl,--thinlto-jobs=8",
"-Wl,--thinlto-cache-dir=" +
rebase_path("$root_out_dir/thinlto-cache", root_build_dir),
+
+ # Limit the size of the ThinLTO cache to 10% of available disk space.
+ # TODO(pcc): Change the limit from a percentage to an absolute size
+ # (10-20GB) once that feature lands in LLVM.
+ "-Wl,--thinlto-cache-policy,cache_size=10%",
]
} else {
ldflags += [ "-Wl,-plugin-opt,jobs=8" ]
}
+
+ # Disable optimization for now because they increase binary size by too
+ # much.
+ if (is_linux && use_lld) {
+ ldflags += [ "-Wl,--lto-O0" ]
+ }
} else {
cflags += [ "-flto" ]
ldflags += [ "-flto" ]
@@ -544,16 +560,6 @@ config("compiler") {
}
}
-# This is separate from :compiler (and not even a sub-config there)
-# so that some targets can remove it from the list with:
-# configs -= [ "//build/config/compiler:pthread" ]
-config("pthread") {
- if (is_linux) {
- cflags = [ "-pthread" ]
- ldflags = [ "-pthread" ]
- }
-}
-
# This provides the basic options to select the target CPU and ABI.
# It is factored out of "compiler" so that special cases can use this
# without using everything that "compiler" brings in. Options that
@@ -685,6 +691,40 @@ config("compiler_cpu_abi") {
}
cflags += [ "-m${mips_float_abi}-float" ]
+ } else if (current_cpu == "mips" && !is_nacl) {
+ if (mips_arch_variant == "r6") {
+ cflags += [
+ "-mips32r6",
+ "-Wa,-mips32r6",
+ ]
+ if (mips_use_msa == true) {
+ cflags += [
+ "-mmsa",
+ "-mfp64",
+ ]
+ }
+ } else if (mips_arch_variant == "r2") {
+ cflags += [
+ "-mips32r2",
+ "-Wa,-mips32r2",
+ ]
+ if (mips_float_abi == "hard" && mips_fpu_mode != "") {
+ cflags += [ "-m$mips_fpu_mode" ]
+ }
+ } else if (mips_arch_variant == "r1") {
+ cflags += [
+ "-mips32",
+ "-Wa,-mips32",
+ ]
+ }
+
+ if (mips_dsp_rev == 1) {
+ cflags += [ "-mdsp" ]
+ } else if (mips_dsp_rev == 2) {
+ cflags += [ "-mdspr2" ]
+ }
+
+ cflags += [ "-m${mips_float_abi}-float" ]
} else if (current_cpu == "mips64el") {
if (mips_arch_variant == "r6") {
if (is_clang) {
@@ -716,6 +756,26 @@ config("compiler_cpu_abi") {
]
ldflags += [ "-mips64r2" ]
}
+ } else if (current_cpu == "mips64") {
+ if (mips_arch_variant == "r6") {
+ cflags += [
+ "-mips64r6",
+ "-Wa,-mips64r6",
+ ]
+ ldflags += [ "-mips64r6" ]
+ if (mips_use_msa == true) {
+ cflags += [
+ "-mmsa",
+ "-mfp64",
+ ]
+ }
+ } else if (mips_arch_variant == "r2") {
+ cflags += [
+ "-mips64r2",
+ "-Wa,-mips64r2",
+ ]
+ ldflags += [ "-mips64r2" ]
+ }
} else if (current_cpu == "pnacl" && is_nacl_nonsfi) {
if (target_cpu == "x86" || target_cpu == "x64") {
cflags += [
@@ -794,12 +854,14 @@ config("compiler_codegen") {
# configs -= [ "//build/config/compiler:clang_stackrealign" ]
# See https://crbug.com/556393 for details of where it must be avoided.
config("clang_stackrealign") {
- if (is_clang && current_cpu == "x86" && is_linux) {
- cflags = [
+ if (is_clang && current_cpu == "x86" && (is_android || is_linux)) {
+ # Android needs -mstackrealign due to a bug on ia32 Jelly Bean.
+ # See crbug.com/521527
+ cflags = [ "-mstackrealign" ]
+ if (is_linux) {
# Align the stack on 16-byte boundaries, http://crbug.com/418554.
- "-mstack-alignment=16",
- "-mstackrealign",
- ]
+ cflags += [ "-mstack-alignment=16" ]
+ }
}
}
@@ -916,6 +978,11 @@ config("default_warnings") {
# TODO(brucedawson): fix warnings, crbug.com/554200
"/wd4312",
+ # C4324 warns when padding is added to fulfill alignas requirements,
+ # but can trigger in benign cases that are difficult to individually
+ # suppress.
+ "/wd4324",
+
# C4351: new behavior: elements of array 'array' will be default
# initialized
# This is a silly "warning" that basically just alerts you that the
@@ -1007,18 +1074,17 @@ config("default_warnings") {
if (is_clang) {
cflags += [
# TODO(hans): Make this list shorter eventually, http://crbug.com/504657
- "-Wno-microsoft-enum-value", # http://crbug.com/505296
"-Wno-unknown-pragmas", # http://crbug.com/505314
"-Wno-microsoft-cast", # http://crbug.com/550065
- "-Wno-microsoft-enum-forward-reference", # http://crbug.com/718880
]
}
} else {
if (is_mac && !is_nacl) {
# When compiling Objective-C, warns if a method is used whose
- # availability is newer than the deployment target. This is not
- # required when compiling Chrome for iOS.
- cflags += [ "-Wpartial-availability" ]
+ # availability is newer than the deployment target.
+ # TODO(thakis): Consider enabling this on iOS too,
+ # https://crbug.com/742498
+ cflags += [ "-Wunguarded-availability" ]
}
if (is_ios) {
@@ -1039,9 +1105,8 @@ config("default_warnings") {
"-Wno-narrowing",
]
- # Don't warn about the "typedef 'foo' locally defined but not used"
- # for gcc 4.8.
- # TODO: remove this flag once all builds work. See crbug.com/227506
+ # -Wunused-local-typedefs is broken in gcc,
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63872
cflags += [ "-Wno-unused-local-typedefs" ]
# Don't warn about "maybe" uninitialized. Clang doesn't include this
@@ -1059,11 +1124,6 @@ config("default_warnings") {
]
}
- if (is_chromeos && is_clang && !is_nacl) {
- # TODO(thakis): Enable this, crbug.com/507717
- cflags += [ "-Wno-shift-negative-value" ]
- }
-
if (is_clang) {
cflags += [
# TODO(thakis): Consider -Wloop-analysis (turns on
@@ -1088,13 +1148,6 @@ config("default_warnings") {
"-Wno-inconsistent-missing-override",
]
- if (is_linux && target_cpu == "x86") {
- cflags += [
- # TODO(thakis): Remove from 32-bit Linux eventually, https://707084
- "-Wno-deprecated-register",
- ]
- }
-
# use_xcode_clang only refers to the iOS toolchain, host binaries use
# chromium's clang always.
if (!is_nacl && (!use_xcode_clang || current_toolchain == host_toolchain)) {
@@ -1116,10 +1169,9 @@ config("default_warnings") {
# TODO(thakis ): https://crbug.com/683349
"-Wno-user-defined-warnings",
]
- } else if (use_xcode_clang &&
- (xcode_version == "0830" || xcode_version == "0831" ||
- xcode_version == "0832")) {
- # This is necessary to allow a progressive transition from using xcode 8 to 8.3. Remove when all bots are migrated to 8.3.
+ } else if (use_xcode_clang && xcode_version_int >= 830) {
+ # This is necessary to allow a progressive transition from using xcode 8.0
+ # to 8.3 or more recent. Remove when all bots are migrated to 8.3.
cflags += [
# TODO(thakis): https://crbug.com/604888
"-Wno-undefined-var-template",
@@ -1164,7 +1216,8 @@ config("chromium_code") {
if (!is_debug && !using_sanitizer &&
(!is_linux || !is_clang || is_official_build) &&
current_cpu != "s390x" && current_cpu != "s390" &&
- current_cpu != "ppc64" && current_cpu != "ppc64") {
+ current_cpu != "ppc64" && current_cpu != "ppc64" &&
+ current_cpu != "mips" && current_cpu != "mips64") {
# _FORTIFY_SOURCE isn't really supported by Clang now, see
# http://llvm.org/bugs/show_bug.cgi?id=16821.
# It seems to work fine with Ubuntu 12 headers though, so use it in
@@ -1287,7 +1340,7 @@ config("no_incompatible_pointer_warnings") {
cflags = []
if (is_clang) {
cflags += [ "-Wno-incompatible-pointer-types" ]
- } else if (current_cpu == "mipsel") {
+ } else if (current_cpu == "mipsel" || current_cpu == "mips64el") {
cflags += [ "-w" ]
} else if (is_chromeos && current_cpu == "arm") {
cflags += [ "-w" ]
@@ -1443,7 +1496,11 @@ config("optimize") {
# Favor size over speed.
# TODO(crbug.com/718650): Fix -Os in PNaCl compiler and remove the is_nacl
# guard above.
- cflags = [ "-Os" ] + common_optimize_on_cflags
+ if (is_clang) {
+ cflags = [ "-Oz" ] + common_optimize_on_cflags
+ } else {
+ cflags = [ "-Os" ] + common_optimize_on_cflags
+ }
} else {
cflags = [ "-O2" ] + common_optimize_on_cflags
}
@@ -1460,7 +1517,11 @@ config("optimize_no_wpo") {
# Favor size over speed.
# TODO(crbug.com/718650): Fix -Os in PNaCl compiler and remove the is_nacl
# guard above.
- cflags = [ "-Os" ] + common_optimize_on_cflags
+ if (is_clang) {
+ cflags = [ "-Oz" ] + common_optimize_on_cflags
+ } else {
+ cflags = [ "-Os" ] + common_optimize_on_cflags
+ }
} else if (optimize_for_fuzzing) {
cflags = [ "-O1" ] + common_optimize_on_cflags
} else {
@@ -1480,7 +1541,11 @@ config("no_optimize") {
} else if (is_android && !android_full_debug) {
# On Android we kind of optimize some things that don't affect debugging
# much even when optimization is disabled to get the binary size down.
- cflags = [ "-Os" ]
+ if (is_clang) {
+ cflags = [ "-Oz" ] + common_optimize_on_cflags
+ } else {
+ cflags = [ "-Os" ] + common_optimize_on_cflags
+ }
} else {
cflags = [ "-O0" ]
ldflags = []
@@ -1660,16 +1725,16 @@ config("symbols") {
# dump_syms, so this is still required (https://crbug.com/622406).
cflags += [ "-fno-standalone-debug" ]
}
- } else if (is_android) {
- # Breakpad can't handle DWARF 4 symbols properly yet, so use DWARF 3
- # explicitly on android where we are hitting https://crbug.com/638485.
- # The arguments MUST be in this order because of a gcc arg parsing bug.
- cflags = [
- "-gdwarf-3",
- "-g2",
- ]
} else {
- cflags = [ "-g2" ]
+ cflags = []
+ if (is_android && target_cpu == "arm") {
+ # dump_syms has issues with dwarf4 on arm, https://crbug.com/744956
+ # TODO(thakis): Remove this again once dump_syms is fixed.
+ #
+ # "-gdwarf-3" doesn't work with dump_syms in Chrome OS.
+ cflags += [ "-gdwarf-3" ]
+ }
+ cflags += [ "-g2" ]
}
if (use_debug_fission) {
cflags += [ "-gsplit-dwarf" ]
@@ -1686,9 +1751,11 @@ config("symbols") {
# builds, currently get
# "third_party/binutils/Linux_x64/Release/bin/ld.gold: warning:
# /tmp/lto-llvm-0b5201.o: corrupt debug info in .debug_info"
+ # TODO(thakis): Re-enable on fuchsia once lld can process R_X86_64_DTPOFF64
+ # relocations, https://crbug.com/735101
if (!is_mac && !is_ios && !is_nacl && target_cpu != "x86" &&
(use_gold || use_lld) && !allow_posix_link_time_opt &&
- !is_official_build) {
+ !is_official_build && !is_fuchsia) {
ldflags += [ "-Wl,--gdb-index" ]
}
}
@@ -1701,16 +1768,22 @@ config("minimal_symbols") {
cflags = []
ldflags = [ "/DEBUG" ]
} else {
+ cflags = []
+ if (target_cpu == "arm") {
+ # dump_syms has issues with dwarf4 on arm, https://crbug.com/744956
+ # TODO(thakis): Remove this again once dump_syms is fixed.
+ cflags += [ "-gdwarf-3" ]
+ }
+ cflags += [ "-g1" ]
if (is_android) {
- # Breakpad can't handle DWARF 4 symbols properly yet, so use DWARF 3
- # explicitly on android where we are hitting https://crbug.com/638485.
- # The arguments MUST be in this order because of a gcc arg parsing bug.
- cflags = [
- "-gdwarf-3",
- "-g1",
- ]
- } else {
- cflags = [ "-g1" ]
+ # Android defaults to symbol_level=1 builds in production builds
+ # (https://crbug.com/648948), but clang, unlike gcc, doesn't emit
+ # DW_AT_linkage_name in -g1 builds. -fdebug-info-for-profiling enables
+ # that (and a bunch of other things we don't need), so that we get
+ # qualified names in stacks.
+ # TODO(thakis): Consider making clang emit DW_AT_linkage_name in -g1 mode;
+ # failing that consider doing this on non-Android too.
+ cflags += [ "-fdebug-info-for-profiling" ]
}
# Note: -gsplit-dwarf implicitly turns on -g2 with clang, so don't pass it.
diff --git a/chromium/build/config/compiler/compiler.gni b/chromium/build/config/compiler/compiler.gni
index 46b048f3ec3..011a5b22c69 100644
--- a/chromium/build/config/compiler/compiler.gni
+++ b/chromium/build/config/compiler/compiler.gni
@@ -72,20 +72,20 @@ if (is_mac || is_ios) {
enable_frame_pointers = true
} else if (is_win) {
# 64-bit Windows ABI doesn't support frame pointers.
- if (target_cpu == "x64") {
+ if (current_cpu == "x64") {
enable_frame_pointers = false
} else {
enable_frame_pointers = true
}
} else if (is_chromeos) {
- # ChromeOS requires frame pointers in x64 builds, to support CWP.
- # TODO(711784): Building ARM Thumb without frame pointers can lead to code
- # in ChromeOS which triggers some ARM A12/A17 errata. They can be disabled
- # on non-x64 once that is resolved.
- enable_frame_pointers = true
-} else if (current_cpu == "arm64") {
+ # ChromeOS generally prefers frame pointers, to support CWP.
+ # However, Clang does not currently generate usable frame pointers in ARM
+ # 32-bit builds (https://bugs.llvm.org/show_bug.cgi?id=18505) so disable them
+ # there to avoid the unnecessary overhead.
+ enable_frame_pointers = current_cpu != "arm"
+} else if (is_android) {
# Ensure that stacks from arm64 crash dumps are usable (crbug.com/391706).
- enable_frame_pointers = true
+ enable_frame_pointers = current_cpu == "arm64"
} else {
# Explicitly ask for frame pointers, otherwise:
# * Stacks may be missing for sanitizer and profiling builds.
@@ -100,6 +100,7 @@ if (is_mac || is_ios) {
can_unwind_with_frame_pointers = enable_frame_pointers
if (current_cpu == "arm" && arm_use_thumb) {
# We cannot currently unwind ARM Thumb frame pointers correctly.
+ # See https://bugs.llvm.org/show_bug.cgi?id=18505
can_unwind_with_frame_pointers = false
} else if (is_win) {
# Windows 32-bit does provide frame pointers, but the compiler does not
@@ -120,15 +121,22 @@ declare_args() {
}
declare_args() {
+ # Set to true to use lld, the LLVM linker. This flag may be used on Windows,
+ # Linux or Fuchsia.
+ use_lld = (is_win && host_os != "win") || is_fuchsia ||
+ ((allow_posix_link_time_opt || is_cfi) && target_os == "linux" &&
+ !is_chromeos && target_cpu == "x64")
+}
+
+declare_args() {
# Whether to use the gold linker from binutils instead of lld or bfd.
use_gold =
- !use_lld && !(is_chromecast && is_linux &&
- (current_cpu == "arm" || current_cpu == "mipsel")) &&
- ((is_linux && (current_cpu == "x64" || current_cpu == "x86" ||
- current_cpu == "arm" || current_cpu == "mipsel")) ||
- (is_android && (current_cpu == "x86" || current_cpu == "x64" ||
- current_cpu == "arm" || current_cpu == "arm64")) ||
- is_fuchsia)
+ (!use_lld && !(is_chromecast && is_linux &&
+ (current_cpu == "arm" || current_cpu == "mipsel")) &&
+ (is_linux && (current_cpu == "x64" || current_cpu == "x86" ||
+ current_cpu == "arm" || current_cpu == "mipsel"))) ||
+ (is_android && (current_cpu == "x86" || current_cpu == "x64" ||
+ current_cpu == "arm" || current_cpu == "arm64"))
}
# If it wasn't manually set, set to an appropriate default.
diff --git a/chromium/build/config/features.gni b/chromium/build/config/features.gni
index d143dac4b89..5095e4c3daa 100644
--- a/chromium/build/config/features.gni
+++ b/chromium/build/config/features.gni
@@ -24,11 +24,12 @@ declare_args() {
# Enables Native Client support.
# Temporarily disable nacl on arm64 linux to get rid of compilation errors.
# TODO(mcgrathr): When mipsel-nacl-clang is available, drop the exclusion.
- enable_nacl = !is_ios && !is_android && !is_chromecast &&
- current_cpu != "mipsel" && !(is_linux && target_cpu == "arm64")
+ enable_nacl = !is_ios && !is_android && !is_fuchsia && !is_chromecast &&
+ current_cpu != "mipsel" && current_cpu != "mips64el" &&
+ !(is_linux && target_cpu == "arm64")
# Non-SFI is not yet supported on mipsel
- enable_nacl_nonsfi = current_cpu != "mipsel"
+ enable_nacl_nonsfi = (current_cpu != "mipsel" && current_cpu != "mips64el")
# Enables proprietary codecs and demuxers; e.g. H264, AAC, MP3, and MP4.
# We always build Google Chrome and Chromecast with proprietary codecs.
diff --git a/chromium/build/config/fuchsia/BUILD.gn b/chromium/build/config/fuchsia/BUILD.gn
index 1f8ee1a0e1c..09063eb9884 100644
--- a/chromium/build/config/fuchsia/BUILD.gn
+++ b/chromium/build/config/fuchsia/BUILD.gn
@@ -9,7 +9,10 @@ assert(is_fuchsia)
assert(is_posix)
config("compiler") {
- defines = [ "SYSROOT_VERSION=$sysroot_version" ]
+ defines = [
+ # To force full builds after sysroot updates.
+ "SYSROOT_VERSION=$sysroot_version",
+ ]
cflags = []
ldflags = []
if (current_cpu == "arm64") {
@@ -32,6 +35,14 @@ config("compiler") {
rebase_path(fuchsia_sdk, root_build_dir) + "/toolchain_libs/clang/5.0.0",
]
+ ldflags += [
+ # The stack defaults to 256k on Fuchsia (see
+ # https://fuchsia.googlesource.com/magenta/+/master/system/private/magenta/stack.h#9),
+ # but on other platforms it's much higher, so a variety of code assumes more
+ # will be available. Raise to 8M which matches e.g. macOS.
+ "-Wl,-z,stack-size=0x800000",
+ ]
+
libs = [
"mxio",
"magenta",
diff --git a/chromium/build/config/fuchsia/rules.gni b/chromium/build/config/fuchsia/rules.gni
new file mode 100644
index 00000000000..b3e7f3b6393
--- /dev/null
+++ b/chromium/build/config/fuchsia/rules.gni
@@ -0,0 +1,78 @@
+# Copyright 2017 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.
+
+assert(is_fuchsia)
+
+# This template is used to generate a runner script for test binaries into the
+# build dir for Fuchsia. It's generally used from the "test" template.
+template("test_runner_script") {
+ testonly = true
+ _test_name = invoker.test_name
+
+ # This runtime_deps file is used at runtime and thus cannot go in
+ # target_gen_dir.
+ _target_dir_name = get_label_info(":$target_name", "dir")
+ _runtime_deps_file =
+ "$root_out_dir/gen.runtime/$_target_dir_name/$target_name.runtime_deps"
+ _runtime_deps_target = "${target_name}__write_deps"
+ group(_runtime_deps_target) {
+ forward_variables_from(invoker,
+ [
+ "data",
+ "data_deps",
+ "deps",
+ "public_deps",
+ ])
+ write_runtime_deps = _runtime_deps_file
+ }
+
+ action(target_name) {
+ forward_variables_from(invoker,
+ [
+ "data_deps",
+ "deps",
+ ])
+ if (!defined(deps)) {
+ deps = []
+ }
+ if (!defined(data_deps)) {
+ data_deps = []
+ }
+
+ script = "//build/fuchsia/create_test_runner_script.py"
+ depfile = "$target_gen_dir/$target_name.d"
+
+ data = []
+ test_runner_args = []
+
+ generated_script = "$root_build_dir/bin/run_${_test_name}"
+ outputs = [
+ generated_script,
+ ]
+ data += [ generated_script ]
+
+ test_runner_args += [
+ "--output-directory",
+ rebase_path(root_build_dir, root_build_dir),
+ ]
+
+ deps += [ ":$_runtime_deps_target" ]
+ data += [ _runtime_deps_file ]
+ test_runner_args += [
+ "--runtime-deps-path",
+ rebase_path(_runtime_deps_file, root_build_dir),
+ ]
+
+ args = [
+ "--depfile",
+ rebase_path(depfile, root_build_dir),
+ "--script-output-path",
+ rebase_path(generated_script, root_build_dir),
+ "--test-name",
+ _test_name,
+ ]
+
+ args += test_runner_args
+ }
+}
diff --git a/chromium/build/config/gcc/BUILD.gn b/chromium/build/config/gcc/BUILD.gn
index 433497e1350..4d00a9f8f1d 100644
--- a/chromium/build/config/gcc/BUILD.gn
+++ b/chromium/build/config/gcc/BUILD.gn
@@ -29,18 +29,12 @@ declare_args() {
#
# See http://gcc.gnu.org/wiki/Visibility
config("symbol_visibility_hidden") {
- # Note that -fvisibility-inlines-hidden is set globally in the compiler
- # config since that can almost always be applied.
cflags = [ "-fvisibility=hidden" ]
# Visibility attribute is not supported on AIX.
if (current_os != "aix") {
- cflags_cc = [
- # Not exporting C++ inline functions can generally be applied anywhere
- # so we do so here. Normal function visibility is controlled by
- # //build/config/gcc:symbol_visibility_hidden.
- "-fvisibility-inlines-hidden",
- ]
+ cflags_cc = [ "-fvisibility-inlines-hidden" ]
+ cflags_objcc = cflags_cc
}
}
@@ -115,7 +109,7 @@ config("executable_ldconfig") {
if (is_component_build || using_sanitizer) {
configs = [ ":rpath_for_built_shared_libraries" ]
}
- if (current_cpu == "mipsel") {
+ if (current_cpu == "mipsel" || current_cpu == "mips64el") {
ldflags += [ "-pie" ]
}
}
diff --git a/chromium/build/config/ios/BUILD.gn b/chromium/build/config/ios/BUILD.gn
index f8091d155b0..4d3986807ad 100644
--- a/chromium/build/config/ios/BUILD.gn
+++ b/chromium/build/config/ios/BUILD.gn
@@ -100,19 +100,6 @@ config("runtime_library") {
cflags = common_flags
ldflags = common_flags
- # TODO(crbug.com/634373): Remove once Xcode's libc++ has LLVM r256325. Most
- # likely this means one Xcode 8 is released and required.
- if (use_xcode_clang && get_path_info(ios_sdk_version, "name") != "10") {
- common_cc_flags = [
- "-isystem",
- rebase_path("//third_party/llvm-build/Release+Asserts/include/c++/v1",
- root_build_dir),
- ]
-
- cflags_cc = common_cc_flags
- cflags_objcc = common_cc_flags
- }
-
if (ios_enable_coverage) {
configs = [ ":enable_coverage" ]
}
diff --git a/chromium/build/config/ios/Module-Info.plist b/chromium/build/config/ios/Module-Info.plist
index 63953d62119..13b67c473f9 100644
--- a/chromium/build/config/ios/Module-Info.plist
+++ b/chromium/build/config/ios/Module-Info.plist
@@ -5,9 +5,9 @@
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
- <string>${MODULE_NAME}</string>
+ <string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>${IOS_BUNDLE_ID_PREFIX}.test.${EXECUTABLE_NAME:rfc1034identifier}.${MODULE_NAME:rfc1034identifier}</string>
+ <string>${IOS_BUNDLE_ID_PREFIX}.${MODULE_BUNDLE_ID:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
diff --git a/chromium/build/config/ios/codesign.py b/chromium/build/config/ios/codesign.py
index b197bac7e9b..de66654fd67 100644
--- a/chromium/build/config/ios/codesign.py
+++ b/chromium/build/config/ios/codesign.py
@@ -58,6 +58,27 @@ class Bundle(object):
def binary_path(self):
return os.path.join(self._path, self._data['CFBundleExecutable'])
+ def Validate(self, expected_mappings):
+ """Checks that keys in the bundle have the expected value.
+
+ Args:
+ expected_mappings: a dictionary of string to object, each mapping will
+ be looked up in the bundle data to check it has the same value (missing
+ values will be ignored)
+
+ Returns:
+ A dictionary of the key with a different value between expected_mappings
+ and the content of the bundle (i.e. errors) so that caller can format the
+ error message. The dictionary will be empty if there are no errors.
+ """
+ errors = {}
+ for key, expected_value in expected_mappings.iteritems():
+ if key in self._data:
+ value = self._data[key]
+ if value != expected_value:
+ errors[key] = (value, expected_value)
+ return errors
+
class ProvisioningProfile(object):
"""Wraps a mobile provisioning profile file."""
@@ -298,6 +319,34 @@ class CodeSignBundleAction(Action):
bundle = Bundle(args.path)
+ # According to Apple documentation, the application binary must be the same
+ # as the bundle name without the .app suffix. See crbug.com/740476 for more
+ # information on what problem this can cause.
+ #
+ # To prevent this class of error, fail with an error if the binary name is
+ # incorrect in the Info.plist as it is not possible to update the value in
+ # Info.plist at this point (the file has been copied by a different target
+ # and ninja would consider the build dirty if it was updated).
+ #
+ # Also checks that the name of the bundle is correct too (does not cause the
+ # build to be considered dirty, but still terminate the script in case of an
+ # incorrect bundle name).
+ #
+ # Apple documentation is available at:
+ # https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html
+ bundle_name = os.path.splitext(os.path.basename(bundle.path))[0]
+ errors = bundle.Validate({
+ 'CFBundleName': bundle_name,
+ 'CFBundleExecutable': bundle_name,
+ })
+ if errors:
+ for key in sorted(errors):
+ value, expected_value = errors[key]
+ sys.stderr.write('%s: error: %s value incorrect: %s != %s\n' % (
+ bundle.path, key, value, expected_value))
+ sys.stderr.flush()
+ sys.exit(1)
+
# Delete existing embedded mobile provisioning.
embedded_provisioning_profile = os.path.join(
bundle.path, 'embedded.mobileprovision')
diff --git a/chromium/build/config/ios/dummy.py b/chromium/build/config/ios/dummy.py
new file mode 100644
index 00000000000..b23b7dab965
--- /dev/null
+++ b/chromium/build/config/ios/dummy.py
@@ -0,0 +1,15 @@
+# Copyright 2017 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.
+
+"""Empty script that does nothing and return success error code.
+
+This script is used by some gn targets that pretend creating some output
+but instead depend on another target creating the output indirectly (in
+general this output is a directory that is used as input by a bundle_data
+target).
+
+It ignores all parameters and terminate with a success error code. It
+does the same thing as the unix command "true", but gn can only invoke
+python scripts.
+"""
diff --git a/chromium/build/config/ios/imageset.gni b/chromium/build/config/ios/imageset.gni
new file mode 100644
index 00000000000..34d02ad502d
--- /dev/null
+++ b/chromium/build/config/ios/imageset.gni
@@ -0,0 +1,159 @@
+# Copyright 2017 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.
+
+declare_args() {
+ # Controls whether the "imageset" template sets up the build to compile
+ # the asset catalogs (to generate an Assets.car file). If set to false,
+ # instead the assets will be copied verbatim to the generated bundle.
+ # As loading resources from the compiled asset catalog or unpacked is
+ # transparent to application code, this results in faster build but in
+ # a larger application.
+ #
+ # This requires that resources uses scale (like "@2x", "@3x") and idiom
+ # (like "~ipad", "~iphone") suffixes and use the same basename as the
+ # imageset directory in order for the correct resource to be loaded if
+ # ios_compile_asset_catalogs is set to false.
+ #
+ # Note: flipping this variable requires a clobber build (as there is no
+ # way to specify that unknown files are deleted as part of the build).
+ ios_compile_asset_catalogs = true
+}
+
+# This template declares a bundle_data target that references an .imageset
+# so that it is compiled to the asset catalog of the generated bundle.
+#
+# The create_bundle target requires that all .imageset are part of an
+# .xcasset bundle. This requirement comes from actool that only receives
+# the path to the .xcasset bundle directory and not to the individual
+# .imageset directories.
+#
+# The requirement is a bit problematic as it prevents compiling only a
+# subset of the .imageset that are contained in a .xcasset. This template
+# fixes that by instead copying the content of the .imageset to temporary
+# .xcasset directory (below $root_out_dir) and defining a bundle_data
+# target that refers to those copies (this is efficient as the "copy" is
+# implemented by hardlinking if possible on macOS).
+#
+# Since the create_data target will only refer to the .xcasset directory
+# and additional "action" target that runs a dummy script is defined. It
+# does nothing but pretends to generate the .xcassets directory (while
+# it is really created as a side-effect of the "copy" step). This allows
+# to workaround the check in "gn" that all inputs below $root_out_dir have
+# to be outputs of another target with a public dependency path.
+#
+# This template also ensures that the file are only copied once when the
+# build targets multiple architectures at the same time (aka "fat build").
+#
+# If ios_compile_asset_catalogs is set to false, the resources will instead
+# just be copied into the final bundles (they are still copied to a temporary
+# location in gen/ to avoid accidentally compiling them if they are located
+# in a .xcassets directory).
+#
+# Arguments
+#
+# sources:
+# required, list of strings, paths to the file contained in the
+# .imageset directory; this must contain the Contents.json file
+# and all the image referenced by it (not enforced by the template).
+#
+template("imageset") {
+ assert(defined(invoker.sources) && invoker.sources != [],
+ "sources must be defined and not empty for $target_name")
+
+ if (current_toolchain != default_toolchain) {
+ group(target_name) {
+ public_deps = [
+ ":$target_name($default_toolchain)",
+ ]
+ }
+ } else {
+ _copy_target_name = target_name + "__copy"
+ _fake_target_name = target_name + "__fake"
+ _data_target_name = target_name
+
+ _sources = invoker.sources
+ foreach(_source, invoker.sources) {
+ _dir = get_path_info(_source, "dir")
+ assert(get_path_info(_dir, "extension") == "imageset",
+ "$_source dirname must have .imageset extension")
+
+ # If the compilation of asset catalogs is disabled, the Contents.json
+ # file must not be copied.
+ if (!ios_compile_asset_catalogs) {
+ if (get_path_info(_source, "file") == "Contents.json") {
+ _sources -= [ _source ]
+ }
+ }
+ }
+
+ # The compilation of resources into Assets.car is enabled automatically
+ # by the "create_bundle" target if any of the "bundle_data" sources's
+ # path matches *.xcassets/{Contents.json,*.imageset/{Contents.json,*}}.
+ #
+ # Copy the file to a directory that either matches that pattern if the
+ # compilation of asset catalogs is enabled or not. The detection will
+ # be performed by gn and the correct ninja rules generated. This is the
+ # main difference between the two variants for this template.
+ if (ios_compile_asset_catalogs) {
+ _xcassets_dir = "$target_gen_dir/${target_name}.xcassets"
+ } else {
+ _xcassets_dir = "$target_gen_dir/${target_name}_xcassets"
+ }
+
+ _imageset_dir = "$_xcassets_dir/" +
+ get_path_info(get_path_info(_sources[0], "dir"), "file")
+
+ copy(_copy_target_name) {
+ # Forward "deps", "public_deps" and "testonly" in case some of the
+ # source files are generated.
+ forward_variables_from(invoker,
+ [
+ "deps",
+ "public_deps",
+ "testonly",
+ ])
+
+ visibility = [ ":$_fake_target_name" ]
+ sources = _sources
+ outputs = [
+ "$_imageset_dir/{{source_file_part}}",
+ ]
+ }
+
+ action(_fake_target_name) {
+ forward_variables_from(invoker, [ "testonly" ])
+
+ visibility = [ ":$_data_target_name" ]
+ script = "//build/config/ios/dummy.py"
+ sources = _sources
+ outputs = [
+ "$_xcassets_dir",
+ ]
+ public_deps = [
+ ":$_copy_target_name",
+ ]
+ args = rebase_path(sources, root_build_dir) +
+ rebase_path(outputs, root_build_dir)
+ }
+
+ bundle_data(_data_target_name) {
+ forward_variables_from(invoker,
+ "*",
+ [
+ "deps",
+ "outputs",
+ "public_deps",
+ "sources",
+ ])
+
+ sources = get_target_outputs(":$_copy_target_name")
+ outputs = [
+ "{{bundle_resources_dir}}/{{source_file_part}}",
+ ]
+ public_deps = [
+ ":$_fake_target_name",
+ ]
+ }
+ }
+}
diff --git a/chromium/build/config/ios/ios_sdk.gni b/chromium/build/config/ios/ios_sdk.gni
index 1a4543370e6..9a4d91e6770 100644
--- a/chromium/build/config/ios/ios_sdk.gni
+++ b/chromium/build/config/ios/ios_sdk.gni
@@ -13,6 +13,7 @@ declare_args() {
ios_sdk_platform = ""
ios_sdk_platform_path = ""
xcode_version = ""
+ xcode_version_int = 0
xcode_build = ""
machine_os_build = ""
@@ -108,6 +109,7 @@ if (ios_sdk_path == "") {
ios_sdk_platform_path = _ios_sdk_result.sdk_platform_path
ios_sdk_build = _ios_sdk_result.sdk_build
xcode_version = _ios_sdk_result.xcode_version
+ xcode_version_int = _ios_sdk_result.xcode_version_int
xcode_build = _ios_sdk_result.xcode_build
machine_os_build = _ios_sdk_result.machine_os_build
if (use_ios_simulator) {
diff --git a/chromium/build/config/ios/rules.gni b/chromium/build/config/ios/rules.gni
index 5be23dd5196..bdf7e08f39e 100644
--- a/chromium/build/config/ios/rules.gni
+++ b/chromium/build/config/ios/rules.gni
@@ -130,12 +130,21 @@ template("lipo_binary") {
# string, extension of the bundle, used to generate bundle name.
#
# bundle_binary_target
-# string, label of the target generating the bundle main binary.
+# (optional) string, label of the target generating the bundle main
+# binary. This target and bundle_binary_path are mutually exclusive.
#
# bundle_binary_output
# (optional) string, base name of the binary generated by the
# bundle_binary_target target, defaults to the target name.
#
+# bundle_binary_path
+# (optional) string, path to the bundle main binary. This target and
+# bundle_binary_target are mutually exclusive.
+#
+# output_name:
+# (optional) string, name of the generated application, if omitted,
+# defaults to the target_name.
+#
# extra_system_frameworks
# (optional) list of system framework to copy to the bundle.
#
@@ -158,8 +167,10 @@ template("create_signed_bundle") {
"product_type must be defined for $target_name")
assert(defined(invoker.bundle_extension),
"bundle_extension must be defined for $target_name")
- assert(defined(invoker.bundle_binary_target),
- "bundle_binary_target must be defined for $target_name")
+ assert(
+ defined(invoker.bundle_binary_target) !=
+ defined(invoker.bundle_binary_path),
+ "Only one of bundle_binary_target or bundle_binary_path may be specified in " + target_name)
_target_name = target_name
_output_name = target_name
@@ -167,10 +178,17 @@ template("create_signed_bundle") {
_output_name = invoker.output_name
}
- _bundle_binary_target = invoker.bundle_binary_target
- _bundle_binary_output = get_label_info(_bundle_binary_target, "name")
- if (defined(invoker.bundle_binary_output)) {
- _bundle_binary_output = invoker.bundle_binary_output
+ if (defined(invoker.bundle_binary_path)) {
+ _bundle_binary_path = invoker.bundle_binary_path
+ } else {
+ _bundle_binary_target = invoker.bundle_binary_target
+ _bundle_binary_output = get_label_info(_bundle_binary_target, "name")
+ if (defined(invoker.bundle_binary_output)) {
+ _bundle_binary_output = invoker.bundle_binary_output
+ }
+ _bundle_binary_path =
+ get_label_info(_bundle_binary_target, "target_out_dir") +
+ "/$_bundle_binary_output"
}
_bundle_extension = invoker.bundle_extension
@@ -217,7 +235,10 @@ template("create_signed_bundle") {
if (!defined(public_deps)) {
public_deps = []
}
- public_deps += [ _bundle_binary_target ]
+
+ if (defined(invoker.bundle_binary_target)) {
+ public_deps += [ invoker.bundle_binary_target ]
+ }
if (defined(invoker.bundle_deps)) {
if (!defined(deps)) {
@@ -235,8 +256,7 @@ template("create_signed_bundle") {
code_signing_script = "//build/config/ios/codesign.py"
code_signing_sources = [
_entitlements_path,
- get_label_info(_bundle_binary_target, "target_out_dir") +
- "/$_bundle_binary_output",
+ _bundle_binary_path,
]
code_signing_outputs = [ "$_bundle_root_dir/$_output_name" ]
if (_enable_code_signing) {
@@ -266,7 +286,7 @@ template("create_signed_bundle") {
"-t=" + ios_sdk_name,
"-i=" + ios_code_signing_identity,
"-e=" + rebase_path(_entitlements_path, root_build_dir),
- "-b=" + rebase_path("$target_out_dir/$_output_name", root_build_dir),
+ "-b=" + rebase_path(_bundle_binary_path, root_build_dir),
rebase_path(bundle_root_dir, root_build_dir),
]
if (!_enable_code_signing) {
@@ -323,7 +343,6 @@ template("ios_info_plist") {
}
extra_substitutions += [
"IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix",
- "IOS_DEPLOYMENT_TARGET=$ios_deployment_target",
"IOS_PLATFORM_BUILD=$ios_platform_build",
"IOS_PLATFORM_NAME=$ios_sdk_name",
"IOS_PLATFORM_VERSION=$ios_sdk_version",
@@ -345,6 +364,7 @@ template("ios_info_plist") {
"executable_name",
"output_name",
"visibility",
+ "testonly",
])
}
}
@@ -1328,39 +1348,83 @@ set_defaults("ios_framework_bundle") {
configs = default_shared_library_configs
}
-# For Chrome on iOS we want to run XCTests for all our build configurations
-# (Debug, Release, ...). In addition, the symbols visibility is configured to
-# private by default. To simplify testing with those constraints, our tests are
-# compiled in the TEST_HOST target instead of the .xctest bundle.
-template("ios_xctest_test") {
+# Template to build a xctest bundle that contains a loadable module for iOS.
+#
+# Arguments
+#
+# deps:
+# list of labels to depends on, these values are used to create the
+# loadable module.
+#
+# product_type
+# string, product type for the generated Xcode project, use
+# "com.apple.product-type.bundle.unit-test" for unit test and
+# "com.apple.product-type.bundle.ui-testing" for UI testing.
+#
+# host_target:
+# string, name of the target that depends on the generated bundle, this
+# value is used to restrict visibilities.
+#
+# output_name
+# (optional) string, name of the generated application, if omitted,
+# defaults to the target_name.
+#
+# This template defines two targets, one named "${target_name}" is the xctest
+# bundle, and the other named "${target_name}_bundle" is a bundle_data that
+# wraps the xctest bundle and that only the "${host_target}" can depend on.
+#
+template("ios_xctest_bundle") {
+ assert(defined(invoker.deps), "deps must be defined for $target_name")
+ assert(defined(invoker.product_type),
+ "product_type must be defined for $target_name")
+ assert(invoker.product_type == "com.apple.product-type.bundle.unit-test" ||
+ invoker.product_type == "com.apple.product-type.bundle.ui-testing",
+ "product_type defined for $target_name is invalid.")
+ assert(defined(invoker.host_target),
+ "host_target must be defined for $target_name")
+
+ # Silence "assignment had no effect" error for non-default toolchains as
+ # host_target is only used in the expansion of the template for the default
+ # toolchain.
+ assert(invoker.host_target != target_name)
+
+ # Silence "assignment had no effect" error for non-default toolchains as
+ # configs is only used in the expansion of the template for the default
+ # toolchain.
+ assert(invoker.configs != [])
+
_target_name = target_name
_output_name = target_name
+
if (defined(invoker.output_name)) {
_output_name = invoker.output_name
}
- _xctest_target = _target_name + "_module"
- _xctest_output = _output_name + "_module"
+ _arch_loadable_module_source = _target_name + "_arch_loadable_module_source"
+ _arch_loadable_module_target = _target_name + "_arch_loadable_module"
+ _lipo_loadable_module_target = _target_name + "_loadable_module"
- _host_target = _target_name
- _host_output = _output_name
+ source_set(_arch_loadable_module_source) {
+ forward_variables_from(invoker, [ "deps" ])
- _xctest_arch_loadable_module_target = _xctest_target + "_arch_loadable_module"
- _xctest_lipo_loadable_module_target = _xctest_target + "_loadable_module"
+ testonly = true
+ visibility = [ ":$_arch_loadable_module_target" ]
+ }
- loadable_module(_xctest_arch_loadable_module_target) {
- visibility = [ ":$_xctest_lipo_loadable_module_target($default_toolchain)" ]
+ loadable_module(_arch_loadable_module_target) {
+ testonly = true
+ visibility = [ ":$_lipo_loadable_module_target($default_toolchain)" ]
if (current_toolchain != default_toolchain) {
- visibility += [ ":$_xctest_target" ]
+ visibility += [ ":$_target_name" ]
}
- sources = [
- "//build/config/ios/xctest_shell.mm",
+ deps = [
+ ":$_arch_loadable_module_source",
]
configs += [ "//build/config/ios:xctest_config" ]
output_dir = "$target_out_dir/$current_cpu"
- output_name = _xctest_output
+ output_name = _output_name
output_prefix_override = true
output_extension = ""
}
@@ -1369,89 +1433,139 @@ template("ios_xctest_test") {
# For fat builds, only the default toolchain will generate a test bundle.
# For the other toolchains, the template is only used for building the
# arch-specific binary, thus the default target is just a group().
- group(_xctest_target) {
- forward_variables_from(invoker,
- [
- "visibility",
- "testonly",
- ])
+ group(_target_name) {
+ forward_variables_from(invoker, [ "visibility" ])
+ testonly = true
+
public_deps = [
- ":$_xctest_arch_loadable_module_target",
+ ":$_arch_loadable_module_target",
]
}
} else {
- _xctest_info_plist_target = _xctest_target + "_info_plist"
- _xctest_info_plist_bundle = _xctest_target + "_info_plist_bundle"
- ios_info_plist(_xctest_info_plist_target) {
- visibility = [ ":$_xctest_info_plist_bundle" ]
+ _info_plist_target = _target_name + "_info_plist"
+ _info_plist_bundle = _target_name + "_info_plist_bundle"
+
+ ios_info_plist(_info_plist_target) {
+ testonly = true
+ visibility = [ ":$_info_plist_bundle" ]
+
info_plist = "//build/config/ios/Module-Info.plist"
- executable_name = _host_output
+ executable_name = _output_name
+
if (ios_automatically_manage_certs) {
- # Use the same bundle identifier for EarlGrey tests as for unit tests
- # when managing certificates as the number of free certs is limited.
- extra_substitutions = [
- "EXECUTABLE_NAME=gtest.${ios_generic_test_bundle_id_suffix}",
- "MODULE_NAME=${ios_generic_test_bundle_id_suffix}-module",
- ]
+ # Use a fixed bundle identifier for EarlGrey tests when using Xcode to
+ # manage the certificates as the number of free certs is limited.
+ extra_substitutions = [ "MODULE_BUNDLE_ID=gtest.${ios_generic_test_bundle_id_suffix}-module" ]
} else {
- extra_substitutions = [ "MODULE_NAME=$_xctest_output" ]
+ extra_substitutions = [ "MODULE_BUNDLE_ID=gtest.$_output_name" ]
}
}
- bundle_data(_xctest_info_plist_bundle) {
- visibility = [ ":$_xctest_target" ]
+ bundle_data(_info_plist_bundle) {
+ testonly = true
+ visibility = [ ":$_target_name" ]
+
public_deps = [
- ":$_xctest_info_plist_target",
+ ":$_info_plist_target",
]
- sources = get_target_outputs(":$_xctest_info_plist_target")
+
+ sources = get_target_outputs(":$_info_plist_target")
outputs = [
"{{bundle_root_dir}}/Info.plist",
]
}
- lipo_binary(_xctest_lipo_loadable_module_target) {
+ lipo_binary(_lipo_loadable_module_target) {
+ forward_variables_from(invoker, [ "configs" ])
+
+ testonly = true
+ visibility = [ ":$_target_name" ]
+
+ output_name = _output_name
+ arch_binary_target = ":$_arch_loadable_module_target"
+ arch_binary_output = _output_name
+ }
+
+ _xctest_bundle = _target_name + "_bundle"
+ create_signed_bundle(_target_name) {
forward_variables_from(invoker,
[
- "configs",
- "testonly",
+ "enable_code_signing",
+ "product_type",
])
- visibility = [ ":$_xctest_target" ]
- output_name = _xctest_output
- arch_binary_target = ":$_xctest_arch_loadable_module_target"
- arch_binary_output = _xctest_output
- }
-
- _xctest_bundle = _xctest_target + "_bundle"
- create_signed_bundle(_xctest_target) {
- forward_variables_from(invoker, [ "enable_code_signing" ])
+ testonly = true
visibility = [ ":$_xctest_bundle" ]
- product_type = "com.apple.product-type.bundle.unit-test"
bundle_extension = ".xctest"
- output_name = _xctest_output
- bundle_binary_target = ":$_xctest_lipo_loadable_module_target"
- bundle_binary_output = _xctest_output
+ output_name = _output_name
+ bundle_binary_target = ":$_lipo_loadable_module_target"
+ bundle_binary_output = _output_name
deps = [
- ":$_xctest_info_plist_bundle",
+ ":$_info_plist_bundle",
]
}
bundle_data(_xctest_bundle) {
- visibility = [ ":$_host_target" ]
+ forward_variables_from(invoker, [ "host_target" ])
+
+ testonly = true
+ visibility = [ ":$host_target" ]
+
public_deps = [
- ":$_xctest_target",
+ ":$_target_name",
]
sources = [
- "$root_out_dir/$_xctest_output.xctest",
+ "$root_out_dir/$_output_name.xctest",
]
outputs = [
- "{{bundle_plugins_dir}}/$_xctest_output.xctest",
+ "{{bundle_plugins_dir}}/$_output_name.xctest",
]
}
}
+}
+
+set_defaults("ios_xctest_bundle") {
+ configs = default_shared_library_configs
+}
+
+# For Chrome on iOS we want to run XCTests for all our build configurations
+# (Debug, Release, ...). In addition, the symbols visibility is configured to
+# private by default. To simplify testing with those constraints, our tests are
+# compiled in the TEST_HOST target instead of the .xctest bundle.
+template("ios_xctest_test") {
+ _target_name = target_name
+ _output_name = target_name
+ if (defined(invoker.output_name)) {
+ _output_name = invoker.output_name
+ }
+
+ _xctest_target = _target_name + "_module"
+ _xctest_output = _output_name + "_module"
+
+ _host_target = _target_name
+ _host_output = _output_name
+
+ _xctest_shell_source_target = _xctest_target + "shell_source"
+ source_set(_xctest_shell_source_target) {
+ sources = [
+ "//build/config/ios/xctest_shell.mm",
+ ]
+
+ configs += [ "//build/config/ios:xctest_config" ]
+ }
+
+ ios_xctest_bundle(_xctest_target) {
+ output_name = _xctest_output
+ product_type = "com.apple.product-type.bundle.unit-test"
+ host_target = _host_target
+
+ deps = [
+ ":$_xctest_shell_source_target",
+ ]
+ }
ios_app_bundle(_host_target) {
forward_variables_from(invoker, "*", [ "testonly" ])
@@ -1481,6 +1595,7 @@ template("ios_xctest_test") {
"$_ios_platform_library/PrivateFrameworks/IDEBundleInjection.framework",
]
+ _xctest_bundle = _xctest_target + "_bundle"
if (current_toolchain == default_toolchain) {
if (!defined(bundle_deps)) {
bundle_deps = []
@@ -1507,3 +1622,178 @@ template("ios_xctest_test") {
set_defaults("ios_xctest_test") {
configs = default_executable_configs
}
+
+# Template to build a xcuitest test runner bundle.
+#
+# Xcode requires a test runner application with a copy of the XCTest dynamic
+# library bundle in it for the XCUITest to run. The test runner bundle is created
+# by copying the system bundle XCTRunner.app from Xcode SDK with the plist file
+# being properly tweaked, and a xctest and it needs to be code signed in order
+# to run on devices.
+#
+# Arguments
+#
+# xctest_bundle
+# string, name of the dependent xctest bundle target.
+#
+# output_name
+# (optional) string, name of the generated application, if omitted,
+# defaults to the target_name.
+#
+template("ios_xcuitest_test_runner_bundle") {
+ assert(defined(invoker.xctest_bundle),
+ "xctest_bundle must be defined for $target_name")
+
+ _target_name = target_name
+ _output_name = target_name
+ if (defined(invoker.output_name)) {
+ _output_name = invoker.output_name
+ }
+
+ _xctrunner_path =
+ "$ios_sdk_platform_path/Developer/Library/Xcode/Agents/XCTRunner.app"
+
+ _info_plist_merge_plist = _target_name + "_info_plist_merge_plist"
+ _info_plist_target = _target_name + "_info_plist"
+ _info_plist_bundle = _target_name + "_info_plist_bundle"
+
+ action(_info_plist_merge_plist) {
+ testonly = true
+ script = "//build/config/mac/plist_util.py"
+
+ sources = [
+ "$_xctrunner_path/Info.plist",
+
+ # NOTE: The XCTRunnerAddition+Info.plist must come after the Info.plist
+ # because it overrides the values under "CFBundleIdentifier" and
+ # "CFBundleName".
+ "//ios/chrome/app/resources/XCTRunnerAddition+Info.plist",
+ ]
+
+ _output_name = "$target_gen_dir/${_target_name}_merged.plist"
+ outputs = [
+ _output_name,
+ ]
+ args = [
+ "merge",
+ "-f=xml1",
+ "-o=" + rebase_path(_output_name, root_build_dir),
+ ] + rebase_path(sources, root_build_dir)
+ }
+
+ ios_info_plist(_info_plist_target) {
+ testonly = true
+ visibility = [ ":$_info_plist_bundle" ]
+
+ executable_name = _output_name
+ info_plist_target = ":$_info_plist_merge_plist"
+
+ if (ios_automatically_manage_certs) {
+ # Use the same bundle identifier for XCUITest tests as for unit tests
+ # when managing certificates as the number of free certs is limited.
+ extra_substitutions =
+ [ "EXECUTABLE_NAME=gtest.${ios_generic_test_bundle_id_suffix}" ]
+ }
+ }
+
+ bundle_data(_info_plist_bundle) {
+ testonly = true
+ visibility = [ ":$_target_name" ]
+
+ public_deps = [
+ ":$_info_plist_target",
+ ]
+
+ sources = get_target_outputs(":$_info_plist_target")
+ outputs = [
+ "{{bundle_root_dir}}/Info.plist",
+ ]
+ }
+
+ _pkginfo_bundle = _target_name + "_pkginfo_bundle"
+ bundle_data(_pkginfo_bundle) {
+ testonly = true
+ visibility = [ ":$_target_name" ]
+
+ sources = [
+ "$_xctrunner_path/PkgInfo",
+ ]
+
+ outputs = [
+ "{{bundle_root_dir}}/PkgInfo",
+ ]
+ }
+
+ _xctest_bundle = invoker.xctest_bundle
+ create_signed_bundle(_target_name) {
+ testonly = true
+
+ bundle_binary_path = "$_xctrunner_path/XCTRunner"
+ bundle_extension = ".app"
+ product_type = "com.apple.product-type.application"
+
+ output_name = _output_name
+
+ # Xcode needs the following frameworks installed in the application
+ # (and signed) for the XCUITest to run, so install them using
+ # extra_system_frameworks.
+ extra_system_frameworks = [ "$ios_sdk_platform_path/Developer/Library/Frameworks/XCTest.framework" ]
+
+ bundle_deps = [
+ ":$_info_plist_bundle",
+ ":$_pkginfo_bundle",
+ ":$_xctest_bundle",
+ ]
+ }
+}
+
+# Template to build a XCUITest that consists of two parts: the test runner
+# application bundle and the xctest dynamic library.
+#
+# Arguments
+#
+# deps:
+# list of labels to depends on, these values are used to create the
+# xctest dynamic library.
+#
+# This template defines two targets, one named "${target_name}_module" is the
+# xctest dynamic library, and the other named "${target_name}_runner" is the
+# test runner application bundle.
+#
+template("ios_xcuitest_test") {
+ assert(false,
+ "ios_xcuitest_test is incomplete and should not be used, see " +
+ "crbug.com/709289 for tracking")
+ assert(defined(invoker.deps), "deps must be defined for $target_name")
+
+ _xcuitest_target = target_name
+ _xcuitest_runner_target = _xcuitest_target + "_runner"
+ _xcuitest_module_target = _xcuitest_target + "_module"
+
+ group(_xcuitest_target) {
+ testonly = true
+
+ deps = [
+ ":$_xcuitest_runner_target",
+ ]
+ }
+
+ _xcuitest_module_output = _xcuitest_target
+ ios_xctest_bundle(_xcuitest_module_target) {
+ product_type = "com.apple.product-type.bundle.ui-testing"
+ host_target = _xcuitest_runner_target
+ output_name = _xcuitest_module_output
+
+ deps = invoker.deps
+ }
+
+ _xcuitest_runner_output = _xcuitest_target + "-Runner"
+ ios_xcuitest_test_runner_bundle(_xcuitest_runner_target) {
+ output_name = _xcuitest_runner_output
+ xctest_bundle = _xcuitest_module_target + "_bundle"
+ }
+}
+
+set_defaults("ios_xcuitest_test") {
+ configs = default_executable_configs
+}
diff --git a/chromium/build/config/jumbo.gni b/chromium/build/config/jumbo.gni
new file mode 100644
index 00000000000..a3f374e7ad1
--- /dev/null
+++ b/chromium/build/config/jumbo.gni
@@ -0,0 +1,246 @@
+# Copyright 2017 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.
+
+import("//build/split_static_library.gni") # When someone uses that target_type
+
+declare_args() {
+ # If true, use a jumbo build (files compiled together) to speed up
+ # compilation.
+ use_jumbo_build = false
+
+ # A target to exclude from jumbo builds, for optimal round trip time
+ # when frequently changing a single cpp file.
+ jumbo_build_excluded = ""
+
+ # How many files to group at most. Smaller numbers give more
+ # parallellism, higher numbers give less total CPU usage. Higher
+ # numbers also give longer single-file recompilation times.
+ #
+ # Recommendations:
+ # Higher numbers than 200 does not reduce wall clock compile times
+ # for 4 cores or less.
+ # 200 uses 8% less total CPU than 100 when compiling content and 10%
+ # less wall clock when compiling with 4 cores.
+ jumbo_file_merge_limit = 200
+}
+
+# Use one of the targets jumbo_source_set, jumbo_static_library,
+# jumbo_split_static_library or jumbo_component to generate a target
+# which merges sources if possible to compile much faster.
+#
+# Special values.
+#
+# target_type
+# The kind of target to build. For example the string
+# "static_library".
+#
+# always_build_jumbo
+# If set and set to true, then use jumbo compile even when it is
+# globally disabled. Otherwise it has no effect.
+#
+# never_build_jumbo
+# If set and set to true, then do not jumbo compile even if it is
+# globally enabled. Otherwise it has no effect.
+#
+# jumbo_excluded_sources
+# If set to a list of files, those files will not be merged with
+# the rest. This can be necessary if merging the files causes
+# compilation issues and fixing the issues is impractical.
+template("internal_jumbo_target") {
+ use_jumbo_build_for_target = use_jumbo_build
+ if (defined(invoker.always_build_jumbo) && invoker.always_build_jumbo) {
+ use_jumbo_build_for_target = true
+ }
+ if (defined(invoker.never_build_jumbo) && invoker.never_build_jumbo) {
+ use_jumbo_build_for_target = false
+ }
+ if (target_name == jumbo_build_excluded) {
+ use_jumbo_build_for_target = false
+ }
+
+ excluded_sources = []
+ if (defined(invoker.jumbo_excluded_sources)) {
+ excluded_sources += invoker.jumbo_excluded_sources
+ }
+
+ invoker_sources = invoker.sources
+ gen_target_dir = get_path_info(invoker_sources[0], "gen_dir")
+ assert(excluded_sources != [] || true) # Prevent "unused variable".
+
+ # Find the gen_target_dir directory with shortest path. Short paths
+ # are nice in themselves since they mean shorter error messages and
+ # fewer bytes to parse, but the currently deployed version of ninja
+ # also has a limitation where it only allows 32 path components in
+ # Windows.
+ # See https://crbug.com/738186 and
+ # https://github.com/ninja-build/ninja/issues/1161
+ foreach(source_file, invoker.sources) {
+ possibly_better_gen_target_dir = get_path_info(gen_target_dir, "dir")
+ possibly_better_gen_target_dir_2 =
+ get_path_info(possibly_better_gen_target_dir, "dir")
+ alt_gen_target_dir = get_path_info(source_file, "gen_dir")
+ if (alt_gen_target_dir == possibly_better_gen_target_dir ||
+ alt_gen_target_dir == possibly_better_gen_target_dir_2) {
+ gen_target_dir = alt_gen_target_dir
+ }
+ }
+
+ assert(gen_target_dir != "") # Prevent "unused variable".
+
+ if (use_jumbo_build_for_target) {
+ jumbo_files = []
+
+ # Split the sources list into chunks that are not excessively large
+ files_per_chunk = jumbo_file_merge_limit
+ current_file_index = 0
+ next_chunk_start = 0
+ next_chunk_number = 1
+ foreach(source_file, invoker.sources) {
+ if (current_file_index == next_chunk_start) {
+ jumbo_files += [ "$gen_target_dir/" + target_name + "_jumbo_" +
+ next_chunk_number + ".cc" ]
+ next_chunk_number += 1
+ next_chunk_start += files_per_chunk
+ }
+ current_file_index += 1
+ }
+
+ has_objective_c_file = false
+ has_c_file = false
+ foreach(source_file, invoker.sources) {
+ source_ext = get_path_info(source_file, "extension")
+ if (source_ext == "c") {
+ has_c_file = true
+ } else if (source_ext == "mm") {
+ has_objective_c_file = true
+ }
+ }
+ if (has_c_file) {
+ jumbo_files += [ "$gen_target_dir/" + target_name + "_jumbo_c.c" ]
+ }
+ if (has_objective_c_file) {
+ jumbo_files += [ "$gen_target_dir/" + target_name + "_jumbo_mm.mm" ]
+ }
+
+ merge_action_name = target_name + "__jumbo_merge"
+
+ # Create an action that calls a script that merges all the source files.
+ action(merge_action_name) {
+ script = "//build/config/merge_for_jumbo.py"
+ response_file_contents =
+ rebase_path(invoker.sources - excluded_sources, gen_target_dir)
+ outputs = jumbo_files
+ args = [ "--outputs" ] + rebase_path(outputs, root_build_dir) +
+ [ "--file-list={{response_file_name}}" ]
+ }
+ } else {
+ # If the list subtraction triggers a gn error,
+ # jumbo_excluded_sources lists a file that is not in sources.
+ sources_after_exclusion = invoker.sources - excluded_sources
+ assert(sources_after_exclusion != [] || true) # Prevent "unused variable".
+ }
+
+ target_type = invoker.target_type
+ if (use_jumbo_build_for_target && target_type == "split_static_library") {
+ # Meaningless and also impossible if split_count > len(jumbo_files)
+ target_type = "static_library"
+
+ # Prevent "unused variable" warning.
+ assert(!defined(invoker.split_count) || invoker.split_count > 0)
+ }
+
+ # Perform the actual operation, either on the original sources or
+ # the sources post-jumbo merging.
+ target(target_type, target_name) {
+ deps = []
+ if (defined(invoker.deps)) {
+ deps += invoker.deps
+ }
+
+ # Take everything else not handled above from the invoker.
+ variables_to_not_forward = [ "deps" ]
+ if (use_jumbo_build_for_target) {
+ deps += [ ":" + merge_action_name ]
+ variables_to_not_forward += [ "sources" ]
+ assert(jumbo_files != [])
+ sources = jumbo_files + excluded_sources
+
+ # Need to keep the headers in sources so that dependency checks
+ # work.
+ foreach(source_file, invoker.sources) {
+ if (get_path_info(source_file, "extension") == "h") {
+ sources += [ source_file ]
+ }
+ }
+ }
+ forward_variables_from(invoker, "*", variables_to_not_forward)
+ }
+}
+
+# See documentation above by "internal_jumbo_target".
+template("jumbo_source_set") {
+ internal_jumbo_target(target_name) {
+ target_type = "source_set"
+ forward_variables_from(invoker, "*")
+ }
+}
+
+set_defaults("jumbo_source_set") {
+ # This sets the default list of configs when the content_source_set target
+ # is defined. The default_compiler_configs comes from BUILDCONFIG.gn and
+ # is the list normally applied to static libraries and source sets.
+ configs = default_compiler_configs
+}
+
+# See documentation above by "internal_jumbo_target".
+template("jumbo_static_library") {
+ internal_jumbo_target(target_name) {
+ target_type = "static_library"
+ forward_variables_from(invoker, "*")
+ }
+}
+
+set_defaults("jumbo_static_library") {
+ # This sets the default list of configs when the content_source_set target
+ # is defined. The default_compiler_configs comes from BUILDCONFIG.gn and
+ # is the list normally applied to static libraries and source sets.
+ configs = default_compiler_configs
+}
+
+# See documentation above by "internal_jumbo_target".
+template("jumbo_split_static_library") {
+ internal_jumbo_target(target_name) {
+ target_type = "split_static_library"
+ forward_variables_from(invoker, "*")
+ }
+}
+
+set_defaults("jumbo_split_static_library") {
+ # This sets the default list of configs when the content_source_set target
+ # is defined. The default_compiler_configs comes from BUILDCONFIG.gn and
+ # is the list normally applied to static libraries and source sets.
+ configs = default_compiler_configs
+}
+
+# See documentation above by "internal_jumbo_target".
+template("jumbo_component") {
+ internal_jumbo_target(target_name) {
+ target_type = "component"
+ forward_variables_from(invoker, "*")
+ }
+}
+
+set_defaults("jumbo_component") {
+ # This sets the default list of configs when the content_source_set
+ # target is defined. This code is a clone of set_defaults for the
+ # ordinary "component" template.
+ if (is_component_build) {
+ configs = default_shared_library_configs
+ if (is_android) {
+ configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
+ }
+ } else {
+ configs = default_compiler_configs
+ }
+}
diff --git a/chromium/build/config/linux/BUILD.gn b/chromium/build/config/linux/BUILD.gn
index aedff7e7597..45fee9a07f3 100644
--- a/chromium/build/config/linux/BUILD.gn
+++ b/chromium/build/config/linux/BUILD.gn
@@ -27,11 +27,6 @@ config("runtime_library") {
}
}
-config("fontconfig") {
- visibility = [ "//build/linux:fontconfig" ]
- libs = [ "fontconfig" ]
-}
-
config("x11") {
libs = [
"X11",
diff --git a/chromium/build/config/linux/pkg-config.py b/chromium/build/config/linux/pkg-config.py
index d63b2d65b91..32068ada80b 100755
--- a/chromium/build/config/linux/pkg-config.py
+++ b/chromium/build/config/linux/pkg-config.py
@@ -63,7 +63,7 @@ def SetConfigPath(options):
return libdir
-def GetPkgConfigPrefixToStrip(args):
+def GetPkgConfigPrefixToStrip(options, args):
"""Returns the prefix from pkg-config where packages are installed.
This returned prefix is the one that should be stripped from the beginning of
@@ -76,8 +76,8 @@ def GetPkgConfigPrefixToStrip(args):
# instead of relative to /path/to/chroot/build/x86-generic (i.e prefix=/usr).
# To support this correctly, it's necessary to extract the prefix to strip
# from pkg-config's |prefix| variable.
- prefix = subprocess.check_output(["pkg-config", "--variable=prefix"] + args,
- env=os.environ)
+ prefix = subprocess.check_output([options.pkg_config,
+ "--variable=prefix"] + args, env=os.environ)
if prefix[-4] == '/usr':
return prefix[4:]
return prefix
@@ -135,7 +135,7 @@ def main():
libdir = SetConfigPath(options)
if options.debug:
sys.stderr.write('PKG_CONFIG_LIBDIR=%s\n' % libdir)
- prefix = GetPkgConfigPrefixToStrip(args)
+ prefix = GetPkgConfigPrefixToStrip(options, args)
else:
prefix = ''
diff --git a/chromium/build/config/linux/pkg_config.gni b/chromium/build/config/linux/pkg_config.gni
index 23cec376f08..7358f8e763c 100644
--- a/chromium/build/config/linux/pkg_config.gni
+++ b/chromium/build/config/linux/pkg_config.gni
@@ -51,21 +51,23 @@ pkg_config_script = "//build/config/linux/pkg-config.py"
# Define the args we pass to the pkg-config script for other build files that
# need to invoke it manually.
+pkg_config_args = []
+
if (sysroot != "") {
# Pass the sysroot if we're using one (it requires the CPU arch also).
- pkg_config_args = [
+ pkg_config_args += [
"-s",
rebase_path(sysroot),
"-a",
current_cpu,
]
-} else if (pkg_config != "") {
- pkg_config_args = [
+}
+
+if (pkg_config != "") {
+ pkg_config_args += [
"-p",
pkg_config,
]
-} else {
- pkg_config_args = []
}
# Only use the custom libdir when building with the target sysroot.
diff --git a/chromium/build/config/mac/BuildInfo.plist b/chromium/build/config/mac/BuildInfo.plist
index b0856e3591d..d32bf2ea7f4 100644
--- a/chromium/build/config/mac/BuildInfo.plist
+++ b/chromium/build/config/mac/BuildInfo.plist
@@ -14,13 +14,5 @@
<string>${XCODE_VERSION}</string>
<key>DTXcodeBuild</key>
<string>${XCODE_BUILD}</string>
- <key>CFBundleShortVersionString</key>
- <string>${VERSION}</string>
- <key>CFBundleVersion</key>
- <string>${VERSION_BUILD}</string>
- <key>CFBundleIdentifier</key>
- <string>org.chromium.${PRODUCT_NAME:rfc1034identifier}</string>
- <key>SCM_REVISION</key>
- <string>${COMMIT_HASH}</string>
</dict>
</plist>
diff --git a/chromium/build/config/mac/base_rules.gni b/chromium/build/config/mac/base_rules.gni
index 341c7508a46..941b5dff105 100644
--- a/chromium/build/config/mac/base_rules.gni
+++ b/chromium/build/config/mac/base_rules.gni
@@ -196,6 +196,11 @@ template("info_plist") {
"XCODE_BUILD=$xcode_build",
"XCODE_VERSION=$xcode_version",
]
+ if (is_mac) {
+ substitutions += [ "MACOSX_DEPLOYMENT_TARGET=$mac_deployment_target" ]
+ } else if (is_ios) {
+ substitutions += [ "IOS_DEPLOYMENT_TARGET=$ios_deployment_target" ]
+ }
if (defined(invoker.extra_substitutions)) {
substitutions += invoker.extra_substitutions
}
diff --git a/chromium/build/config/mac/compile_ib_files.py b/chromium/build/config/mac/compile_ib_files.py
index 4923d82984c..281e554e1d3 100644
--- a/chromium/build/config/mac/compile_ib_files.py
+++ b/chromium/build/config/mac/compile_ib_files.py
@@ -40,17 +40,21 @@ def main():
ibtool_section_re = re.compile(r'/\*.*\*/')
ibtool_re = re.compile(r'.*note:.*is clipping its content')
- ibtoolout = subprocess.Popen(ibtool_args, stdout=subprocess.PIPE)
+ try:
+ stdout = subprocess.check_output(ibtool_args)
+ except subprocess.CalledProcessError as e:
+ print(e.output)
+ raise
current_section_header = None
- for line in ibtoolout.stdout:
+ for line in stdout.splitlines():
if ibtool_section_re.match(line):
current_section_header = line
elif not ibtool_re.match(line):
if current_section_header:
- sys.stdout.write(current_section_header)
+ print(current_section_header)
current_section_header = None
- sys.stdout.write(line)
- return ibtoolout.returncode
+ print(line)
+ return 0
if __name__ == '__main__':
diff --git a/chromium/build/config/mac/mac_sdk.gni b/chromium/build/config/mac/mac_sdk.gni
index 2b2501c7a38..5aa4ef173ce 100644
--- a/chromium/build/config/mac/mac_sdk.gni
+++ b/chromium/build/config/mac/mac_sdk.gni
@@ -3,19 +3,13 @@
# found in the LICENSE file.
import("//build/config/chrome_build.gni")
+import("//build/config/mac/mac_sdk_overrides.gni")
import("//build/toolchain/toolchain.gni")
-# See https://bugs.chromium.org/p/webrtc/issues/detail?id=5453.
-# We can drop the rtc_require_mac_10_7_deployment flag when Chromium
-# also requires a 10.7 deployment target.
-import("//build_overrides/build.gni")
-
declare_args() {
- # Minimum supported version of the Mac SDK.
- mac_sdk_min = mac_sdk_min_build_override
-
- # Minimum supported version of OSX.
- mac_deployment_target = "10.9"
+ # Minimum supported version of macOS. Must be of the form x.x.x for
+ # Info.plist files.
+ mac_deployment_target = "10.9.0"
# Path to a specific version of the Mac SDK, not including a slash at the end.
# If empty, the path to the lowest version greater than or equal to
@@ -79,7 +73,7 @@ xcode_version = _mac_sdk_result.xcode_version
xcode_build = _mac_sdk_result.xcode_build
machine_os_build = _mac_sdk_result.machine_os_build
-if (mac_sdk_version != mac_sdk_min_build_override &&
+if (mac_sdk_version != mac_sdk_min &&
exec_script("//build/check_return_value.py",
[
"test",
@@ -95,7 +89,7 @@ if (mac_sdk_version != mac_sdk_min_build_override &&
print(
" either upgrade Xcode to the latest version or install the Mac OS X")
print(
- " $mac_sdk_min_build_override SDK. For more information, see https://crbug.com/620127.")
+ " $mac_sdk_min SDK. For more information, see https://crbug.com/620127.")
print()
print(" Current SDK Version: $mac_sdk_version")
print(" Current Xcode Version: $xcode_version ($xcode_build)")
diff --git a/chromium/build/config/mac/mac_sdk_overrides.gni b/chromium/build/config/mac/mac_sdk_overrides.gni
new file mode 100644
index 00000000000..2c8949254c4
--- /dev/null
+++ b/chromium/build/config/mac/mac_sdk_overrides.gni
@@ -0,0 +1,22 @@
+# Copyright 2017 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.
+
+# This file contains arguments that subprojects may choose to override. It
+# asserts that those overrides are used, to prevent unused args warnings.
+
+_sdk_min_from_env = getenv("FORCE_MAC_SDK_MIN")
+declare_args() {
+ # Minimum supported version of the Mac SDK.
+ if (_sdk_min_from_env == "") {
+ mac_sdk_min = "10.10"
+ } else {
+ mac_sdk_min = _sdk_min_from_env
+ }
+}
+
+# Always assert that mac_sdk_min is used on non-macOS platforms to prevent
+# unused args warnings.
+if (!is_mac) {
+ assert(mac_sdk_min == "10.10" || true)
+}
diff --git a/chromium/build/config/mac/plist_util.py b/chromium/build/config/mac/plist_util.py
index 0928fa138d6..dd6fe4c93ac 100644
--- a/chromium/build/config/mac/plist_util.py
+++ b/chromium/build/config/mac/plist_util.py
@@ -21,25 +21,13 @@ SUBST_RE = re.compile(r'\$\{(?P<id>[^}]*?)(?P<modifier>:[^}]*)?\}')
IDENT_RE = re.compile(r'[_/\s]')
-def InterpolateList(values, substitutions):
- """Interpolates variable references into |value| using |substitutions|.
+class SubstitutionError(Exception):
+ def __init__(self, key):
+ super(SubstitutionError, self).__init__()
+ self.key = key
- Inputs:
- values: a list of values
- substitutions: a mapping of variable names to values
-
- Returns:
- A new list of values with all variables references ${VARIABLE} replaced
- by their value in |substitutions| or None if any of the variable has no
- subsitution.
- """
- result = []
- for value in values:
- interpolated = InterpolateValue(value, substitutions)
- if interpolated is None:
- return None
- result.append(interpolated)
- return result
+ def __str__(self):
+ return "SubstitutionError: {}".format(self.key)
def InterpolateString(value, substitutions):
@@ -51,29 +39,28 @@ def InterpolateString(value, substitutions):
Returns:
A new string with all variables references ${VARIABLES} replaced by their
- value in |substitutions| or None if any of the variable has no substitution.
+ value in |substitutions|. Raises SubstitutionError if a variable has no
+ substitution.
"""
- result = value
- for match in reversed(list(SUBST_RE.finditer(value))):
+ def repl(match):
variable = match.group('id')
if variable not in substitutions:
- return None
+ raise SubstitutionError(variable)
# Some values need to be identifier and thus the variables references may
# contains :modifier attributes to indicate how they should be converted
# to identifiers ("identifier" replaces all invalid characters by '_' and
# "rfc1034identifier" replaces them by "-" to make valid URI too).
modifier = match.group('modifier')
if modifier == ':identifier':
- interpolated = IDENT_RE.sub('_', substitutions[variable])
+ return IDENT_RE.sub('_', substitutions[variable])
elif modifier == ':rfc1034identifier':
- interpolated = IDENT_RE.sub('-', substitutions[variable])
+ return IDENT_RE.sub('-', substitutions[variable])
else:
- interpolated = substitutions[variable]
- result = result[:match.start()] + interpolated + result[match.end():]
- return result
+ return substitutions[variable]
+ return SUBST_RE.sub(repl, value)
-def InterpolateValue(value, substitutions):
+def Interpolate(value, substitutions):
"""Interpolates variable references into |value| using |substitutions|.
Inputs:
@@ -82,38 +69,18 @@ def InterpolateValue(value, substitutions):
Returns:
A new value with all variables references ${VARIABLES} replaced by their
- value in |substitutions| or None if any of the variable has no substitution.
+ value in |substitutions|. Raises SubstitutionError if a variable has no
+ substitution.
"""
if isinstance(value, dict):
- return Interpolate(value, substitutions)
+ return {k: Interpolate(v, substitutions) for k, v in value.iteritems()}
if isinstance(value, list):
- return InterpolateList(value, substitutions)
+ return [Interpolate(v, substitutions) for v in value]
if isinstance(value, str):
return InterpolateString(value, substitutions)
return value
-def Interpolate(plist, substitutions):
- """Interpolates variable references into |value| using |substitutions|.
-
- Inputs:
- plist: a dictionary representing a Property List (.plist) file
- substitutions: a mapping of variable names to values
-
- Returns:
- A new plist with all variables references ${VARIABLES} replaced by their
- value in |substitutions|. All values that contains references with no
- substitutions will be removed and the corresponding key will be cleared
- from the plist (not recursively).
- """
- result = {}
- for key in plist:
- value = InterpolateValue(plist[key], substitutions)
- if value is not None:
- result[key] = value
- return result
-
-
def LoadPList(path):
"""Loads Plist at |path| and returns it as a dictionary."""
fd, name = tempfile.mkstemp()
@@ -153,19 +120,12 @@ def MergePList(plist1, plist2):
recursively, otherwise |plist2| value is used. If values are list, they
are concatenated.
"""
- if not isinstance(plist1, dict) or not isinstance(plist2, dict):
- if plist2 is not None:
- return plist2
- else:
- return plist1
- result = {}
- for key in set(plist1) | set(plist2):
- if key in plist2:
- value = plist2[key]
- else:
- value = plist1[key]
+ result = plist1.copy()
+ for key, value in plist2.iteritems():
if isinstance(value, dict):
- value = MergePList(plist1.get(key, None), plist2.get(key, None))
+ old_value = result.get(key)
+ if isinstance(old_value, dict):
+ value = MergePList(old_value, value)
if isinstance(value, list):
value = plist1.get(key, []) + plist2.get(key, [])
result[key] = value
diff --git a/chromium/build/config/mac/sdk_info.py b/chromium/build/config/mac/sdk_info.py
index e63ac0bd19b..8a9edc1479d 100644
--- a/chromium/build/config/mac/sdk_info.py
+++ b/chromium/build/config/mac/sdk_info.py
@@ -25,6 +25,7 @@ def FillXcodeVersion(settings):
"""Fills the Xcode version and build number into |settings|."""
lines = subprocess.check_output(['xcodebuild', '-version']).splitlines()
settings['xcode_version'] = FormatVersion(lines[0].split()[-1])
+ settings['xcode_version_int'] = int(settings['xcode_version'], 10)
settings['xcode_build'] = lines[-1].split()[-1]
@@ -70,4 +71,7 @@ if __name__ == '__main__':
FillSDKPathAndVersion(settings, unknownargs[0], settings['xcode_version'])
for key in sorted(settings):
- print '%s="%s"' % (key, settings[key])
+ value = settings[key]
+ if isinstance(value, str):
+ value = '"%s"' % value
+ print '%s=%s' % (key, value)
diff --git a/chromium/build/config/merge_for_jumbo.py b/chromium/build/config/merge_for_jumbo.py
new file mode 100755
index 00000000000..ae435d059c7
--- /dev/null
+++ b/chromium/build/config/merge_for_jumbo.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+#
+# Copyright 2016 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.
+
+"""This script creates a "jumbo" file which merges all incoming files
+for compiling.
+
+"""
+
+from __future__ import print_function
+
+import argparse
+import cStringIO
+import os
+
+
+def write_jumbo_files(inputs, outputs, written_input_set, written_output_set):
+ output_count = len(outputs)
+ input_count = len(inputs)
+
+ written_inputs = 0
+ for output_index, output_file in enumerate(outputs):
+ written_output_set.add(output_file)
+ if os.path.isfile(output_file):
+ with open(output_file, "r") as current:
+ current_jumbo_file = current.read()
+ else:
+ current_jumbo_file = None
+
+ out = cStringIO.StringIO()
+ out.write("/* This is a Jumbo file. Don't edit. */\n\n")
+ out.write("/* Generated with merge_for_jumbo.py. */\n\n")
+ input_limit = (output_index + 1) * input_count / output_count
+ while written_inputs < input_limit:
+ filename = inputs[written_inputs]
+ written_inputs += 1
+ out.write("#include \"%s\"\n" % filename)
+ written_input_set.add(filename)
+ new_jumbo_file = out.getvalue()
+ out.close()
+
+ if new_jumbo_file != current_jumbo_file:
+ with open(output_file, "w") as out:
+ out.write(new_jumbo_file)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--outputs", nargs="+", required=True,
+ help='List of output files to split input into')
+ parser.add_argument("--file-list", required=True)
+ parser.add_argument("--verbose", action="store_true")
+ args = parser.parse_args()
+
+ lines = []
+ # If written with gn |write_file| each file is on its own line.
+ with open(args.file_list) as file_list_file:
+ lines = [line.strip() for line in file_list_file if line.strip()]
+ # If written with gn |response_file_contents| the files are space separated.
+ all_inputs = []
+ for line in lines:
+ all_inputs.extend(line.split())
+
+ written_output_set = set() # Just for double checking
+ written_input_set = set() # Just for double checking
+ for language_ext in (".cc", ".c", ".mm"):
+ if language_ext == ".cc":
+ ext_pattern = (".cc", ".cpp")
+ else:
+ ext_pattern = tuple([language_ext])
+
+ outputs = [x for x in args.outputs if x.endswith(ext_pattern)]
+ inputs = [x for x in all_inputs if x.endswith(ext_pattern)]
+
+ if not outputs:
+ assert not inputs
+ continue
+
+ write_jumbo_files(inputs, outputs, written_input_set, written_output_set)
+
+ header_files = set([x for x in all_inputs if x.endswith(".h")])
+ assert set(args.outputs) == written_output_set, "Did not fill all outputs"
+ files_not_included = set(all_inputs) - written_input_set - header_files
+ assert not files_not_included, ("Jumbo build left out files: %s" %
+ files_not_included)
+ if args.verbose:
+ print("Generated %s (%d files) based on %s" % (
+ str(args.outputs), len(written_input_set), args.file_list))
+
+if __name__ == "__main__":
+ main()
diff --git a/chromium/build/config/mips.gni b/chromium/build/config/mips.gni
index 5604ca66f25..ca582e10853 100644
--- a/chromium/build/config/mips.gni
+++ b/chromium/build/config/mips.gni
@@ -8,7 +8,8 @@ import("//build/config/v8_target_cpu.gni")
# MIPS code is being compiled. But they can also be relevant in the
# other contexts when the code will change its behavior based on the
# cpu it wants to generate code for.
-if (current_cpu == "mipsel" || v8_current_cpu == "mipsel") {
+if (current_cpu == "mipsel" || v8_current_cpu == "mipsel" ||
+ current_cpu == "mips" || v8_current_cpu == "mips") {
declare_args() {
# MIPS arch variant. Possible values are:
# "r1"
@@ -36,7 +37,8 @@ if (current_cpu == "mipsel" || v8_current_cpu == "mipsel") {
# "fpxx": sets the GCC -mfpxx option.
mips_fpu_mode = "fp32"
}
-} else if (current_cpu == "mips64el" || v8_current_cpu == "mips64el") {
+} else if (current_cpu == "mips64el" || v8_current_cpu == "mips64el" ||
+ current_cpu == "mips64" || v8_current_cpu == "mips64") {
# MIPS arch variant. Possible values are:
# "r2"
# "r6"
diff --git a/chromium/build/config/nacl/rules.gni b/chromium/build/config/nacl/rules.gni
index c8956b4e6da..1c1a9121eb9 100644
--- a/chromium/build/config/nacl/rules.gni
+++ b/chromium/build/config/nacl/rules.gni
@@ -74,14 +74,16 @@ template("generate_nmf") {
# Starts empty so the code below can use += everywhere.
data = []
- nmfflags += [ "--library-path=" + rebase_path(root_out_dir) ]
+ nmfflags +=
+ [ "--library-path=" + rebase_path(root_out_dir, root_build_dir) ]
# NOTE: There is no explicit dependency for the lib directory
# (lib32 and lib64 for x86/x64) created in the product directory.
# They are created as a side-effect of nmf creation.
if (current_cpu != "x86" && current_cpu != "x64") {
nmfflags +=
- [ "--library-path=" + rebase_path("${nacl_toolchain_tooldir}/lib") ]
+ [ "--library-path=" +
+ rebase_path("${nacl_toolchain_tooldir}/lib", root_build_dir) ]
if (current_cpu == "arm") {
data += [ "${lib_path}/libarm/" ]
} else {
@@ -90,8 +92,9 @@ template("generate_nmf") {
} else {
# For x86-32, the lib/ directory is called lib32/ instead.
if (current_cpu == "x86") {
- nmfflags += [ "--library-path=" +
- rebase_path("${nacl_toolchain_tooldir}/lib32") ]
+ nmfflags +=
+ [ "--library-path=" +
+ rebase_path("${nacl_toolchain_tooldir}/lib32", root_build_dir) ]
data += [ "${lib_path}/lib32/" ]
}
@@ -112,8 +115,9 @@ template("generate_nmf") {
"root_out_dir")
}
nmfflags += [
- "--library-path=" + rebase_path(x64_out_dir),
- "--library-path=" + rebase_path("${nacl_toolchain_tooldir}/lib"),
+ "--library-path=" + rebase_path(x64_out_dir, root_build_dir),
+ "--library-path=" +
+ rebase_path("${nacl_toolchain_tooldir}/lib", root_build_dir),
]
data += [ "${lib_path}/lib64/" ]
}
@@ -121,7 +125,7 @@ template("generate_nmf") {
}
args = [
"--no-default-libpath",
- "--objdump=" + objdump,
+ "--objdump=" + rebase_path(objdump, root_build_dir),
"--output=" + rebase_path(nmf, root_build_dir),
] + nmfflags + rebase_path(sources, root_build_dir)
if (is_nacl_glibc && current_cpu == "arm") {
diff --git a/chromium/build/config/sanitizers/BUILD.gn b/chromium/build/config/sanitizers/BUILD.gn
index f6b88c71894..ff0e60b6cb8 100644
--- a/chromium/build/config/sanitizers/BUILD.gn
+++ b/chromium/build/config/sanitizers/BUILD.gn
@@ -18,9 +18,6 @@ if (is_ios) {
# "//build/config:exe_and_shlib_deps" to pull in this target.
group("deps") {
visibility = [ "//build/config:exe_and_shlib_deps" ]
- public_deps = [
- ":deps_no_options",
- ]
if (using_sanitizer) {
public_configs = [
":sanitizer_options_link_helper",
@@ -33,32 +30,15 @@ group("deps") {
deps = [
":options_sources",
]
- }
- if (use_afl) {
- deps += [ "//third_party/afl" ]
- }
-}
-
-group("deps_no_options") {
- if (using_sanitizer) {
- public_configs = [
- # Even when a target removes default_sanitizer_flags, it may be depending
- # on a library that did not remove default_sanitizer_flags. Thus, we need
- # to add the ldflags here as well as in default_sanitizer_flags.
- ":default_sanitizer_ldflags",
- ]
- deps = []
- public_deps = []
-
- data = [
- "//tools/valgrind/asan/",
- ]
if (is_win) {
exe = ".exe"
} else {
exe = ""
}
- data += [ "$clang_base_path/bin/llvm-symbolizer${exe}" ]
+ data = [
+ "//tools/valgrind/asan/",
+ "$clang_base_path/bin/llvm-symbolizer${exe}",
+ ]
if (is_linux) {
# llvm-symbolizer needs this.
data += [ "$clang_base_path/lib/libstdc++.so.6" ]
@@ -68,10 +48,6 @@ group("deps_no_options") {
use_locally_built_instrumented_libraries) {
deps += [ "//third_party/instrumented_libraries:deps" ]
}
- if (use_custom_libcxx) {
- public_deps += [ "//buildtools/third_party/libc++:libcxx_proxy" ]
- data += [ "$root_out_dir/libc++.so" ]
- }
# ASAN is supported on iOS but the runtime library depends on the compiler
# used (Chromium version of clang versus Xcode version of clang). Only copy
@@ -82,7 +58,9 @@ group("deps_no_options") {
]
}
if (is_mac || (is_ios && !use_xcode_clang)) {
- public_deps += [ ":asan_runtime_bundle_data" ]
+ public_deps = [
+ ":asan_runtime_bundle_data",
+ ]
}
}
}
@@ -240,10 +218,10 @@ config("default_sanitizer_ldflags") {
]
}
if (use_cfi_diag) {
- ldflags += [
- "-fno-sanitize-trap=cfi",
- "-fsanitize-recover=cfi",
- ]
+ ldflags += [ "-fno-sanitize-trap=cfi" ]
+ if (use_cfi_recover) {
+ ldflags += [ "-fsanitize-recover=cfi" ]
+ }
}
}
} else if (is_win && is_asan) {
@@ -275,13 +253,14 @@ config("default_sanitizer_ldflags") {
config("common_sanitizer_flags") {
cflags = []
- cflags_cc = []
# Sanitizers need line table info for stack traces. They don't need type info
# or variable info, so we can leave that out to speed up the build (unless
# it's explicitly asked for by setting |sanitizer_keep_symbols| to true).
if (using_sanitizer) {
assert(is_clang, "sanitizers only supported with clang")
+ assert(!is_official_build, "sanitizers not supported in official builds")
+
if (!sanitizer_keep_symbols) {
cflags += [ "-gline-tables-only" ]
}
@@ -292,27 +271,14 @@ config("common_sanitizer_flags") {
# of reports to CLs, so turn it on there.
"-gcolumn-info",
]
- }
- # Common options for AddressSanitizer, LeakSanitizer, ThreadSanitizer,
- # MemorySanitizer and non-official CFI builds.
- if (using_sanitizer || (is_cfi && !is_official_build)) {
+ # Disable frame pointer elimination for better stack traces.
if (is_posix) {
cflags += [ "-fno-omit-frame-pointer" ]
} else {
cflags += [ "/Oy-" ]
}
}
-
- if (use_custom_libcxx) {
- prefix = "//buildtools/third_party"
- include = "trunk/include"
- cflags_cc += [
- "-nostdinc++",
- "-isystem" + rebase_path("$prefix/libc++/$include", root_build_dir),
- "-isystem" + rebase_path("$prefix/libc++abi/$include", root_build_dir),
- ]
- }
}
config("asan_flags") {
@@ -402,12 +368,14 @@ config("cfi_flags") {
if (use_cfi_diag) {
cflags += [
"-fno-sanitize-trap=cfi",
- "-fsanitize-recover=cfi",
"-fno-inline-functions",
"-fno-inline",
"-fno-omit-frame-pointer",
"-O1",
]
+ if (use_cfi_recover) {
+ cflags += [ "-fsanitize-recover=cfi" ]
+ }
} else {
defines = [ "CFI_ENFORCEMENT" ]
}
diff --git a/chromium/build/config/sanitizers/sanitizers.gni b/chromium/build/config/sanitizers/sanitizers.gni
index 17f4d9633f0..fb2a83cca95 100644
--- a/chromium/build/config/sanitizers/sanitizers.gni
+++ b/chromium/build/config/sanitizers/sanitizers.gni
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import("//build/config/chrome_build.gni")
+import("//build/config/chromecast_build.gni")
import("//build/toolchain/toolchain.gni")
declare_args() {
@@ -67,10 +68,13 @@ declare_args() {
# https://crbug.com/701919
use_cfi_icall = false
- # By default, Control Flow Integrity will crash the program if it detects a
- # violation. Set this to true to print detailed diagnostics instead.
+ # Print detailed diagnostics when Control Flow Integrity detects a violation.
use_cfi_diag = false
+ # Let Control Flow Integrity continue execution instead of crashing when
+ # printing diagnostics (use_cfi_diag = true).
+ use_cfi_recover = false
+
# Compile for fuzzing with LLVM LibFuzzer.
# See http://www.chromium.org/developers/testing/libfuzzer
use_libfuzzer = false
@@ -122,7 +126,7 @@ if (current_toolchain != default_toolchain) {
sanitizer_coverage_flags = ""
use_afl = false
use_cfi_diag = false
- use_custom_libcxx = false
+ use_cfi_recover = false
use_drfuzz = false
use_libfuzzer = false
use_prebuilt_instrumented_libraries = false
@@ -134,13 +138,6 @@ if (current_toolchain != default_toolchain) {
# declare_args block. User overrides are only applied at the end of a
# declare_args block.
declare_args() {
- # Use libc++ (buildtools/third_party/libc++ and
- # buildtools/third_party/libc++abi) instead of stdlibc++ as standard library.
- # This is intended to be used for instrumented builds.
- use_custom_libcxx =
- (is_asan && is_linux && !is_chromeos) || is_tsan || is_msan || is_ubsan ||
- is_ubsan_security || use_libfuzzer || use_afl
-
# Enable -fsanitize-coverage.
use_sanitizer_coverage =
use_libfuzzer || use_afl || sanitizer_coverage_flags != ""
@@ -157,9 +154,12 @@ if ((use_afl || use_libfuzzer) && sanitizer_coverage_flags == "") {
sanitizer_coverage_flags = "trace-pc-guard,indirect-calls"
}
+# Whether we are linking against a sanitizer runtime library. Among other
+# things, this changes the default symbol level and other settings in order to
+# prepare to create stack traces "live" using the sanitizer runtime.
using_sanitizer =
is_asan || is_lsan || is_tsan || is_msan || is_ubsan || is_ubsan_null ||
- is_ubsan_vptr || is_ubsan_security || use_sanitizer_coverage
+ is_ubsan_vptr || is_ubsan_security || use_sanitizer_coverage || use_cfi_diag
assert(!using_sanitizer || is_clang,
"Sanitizers (is_*san) require setting is_clang = true in 'gn args'")
@@ -201,3 +201,8 @@ assert(!is_msan || (is_linux && current_cpu == "x64"),
# allocation functions is hard on Windows and not yet implemented in LLVM.
assert(!is_win || !is_debug || !is_asan,
"ASan on Windows doesn't work in debug (set is_debug=false).")
+
+# Make sure that if we recover on detection (i.e. not crash), diagnostics are
+# printed.
+assert(!use_cfi_recover || use_cfi_diag,
+ "Only use CFI recovery together with diagnostics.")
diff --git a/chromium/build/config/sysroot.gni b/chromium/build/config/sysroot.gni
index 51f106ec2e8..1d2a2207eeb 100644
--- a/chromium/build/config/sysroot.gni
+++ b/chromium/build/config/sysroot.gni
@@ -15,8 +15,9 @@ declare_args() {
# The absolute path to directory containing linux sysroot images
target_sysroot_dir = "//build/linux"
- use_sysroot = current_cpu != "s390x" && current_cpu != "s390" &&
- current_cpu != "ppc64" && current_cpu != "ppc"
+ use_sysroot =
+ current_cpu == "x86" || current_cpu == "x64" || current_cpu == "arm" ||
+ current_cpu == "arm64" || current_cpu == "mipsel"
}
if (current_os == target_os && current_cpu == target_cpu &&
diff --git a/chromium/build/download_gold_plugin.py b/chromium/build/download_gold_plugin.py
deleted file mode 100755
index 8123167806d..00000000000
--- a/chromium/build/download_gold_plugin.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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.
-
-"""Script to download LLVM gold plugin from google storage."""
-
-import find_depot_tools
-import json
-import os
-import shutil
-import subprocess
-import sys
-import zipfile
-
-SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
-CHROME_SRC = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir))
-
-
-DEPOT_PATH = find_depot_tools.add_depot_tools_to_path()
-GSUTIL_PATH = os.path.join(DEPOT_PATH, 'gsutil.py')
-
-LLVM_BUILD_PATH = os.path.join(CHROME_SRC, 'third_party', 'llvm-build',
- 'Release+Asserts')
-CLANG_UPDATE_PY = os.path.join(CHROME_SRC, 'tools', 'clang', 'scripts',
- 'update.py')
-CLANG_REVISION = os.popen(CLANG_UPDATE_PY + ' --print-revision').read().rstrip()
-
-CLANG_BUCKET = 'gs://chromium-browser-clang/Linux_x64'
-
-def main():
- targz_name = 'llvmgold-%s.tgz' % CLANG_REVISION
- remote_path = '%s/%s' % (CLANG_BUCKET, targz_name)
-
- os.chdir(LLVM_BUILD_PATH)
-
- subprocess.check_call(['python', GSUTIL_PATH,
- 'cp', remote_path, targz_name])
- subprocess.check_call(['tar', 'xzf', targz_name])
- os.remove(targz_name)
- return 0
-
-if __name__ == '__main__':
- sys.exit(main())
diff --git a/chromium/build/env_dump.py b/chromium/build/env_dump.py
index 21edfe633c7..3f8217398c4 100755
--- a/chromium/build/env_dump.py
+++ b/chromium/build/env_dump.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/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.
diff --git a/chromium/build/find_depot_tools.py b/chromium/build/find_depot_tools.py
index 9596d2ffe51..b70ace46b08 100755
--- a/chromium/build/find_depot_tools.py
+++ b/chromium/build/find_depot_tools.py
@@ -15,6 +15,10 @@ import os
import sys
+# Path to //src
+SRC = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
+
+
def IsRealDepotTools(path):
expanded_path = os.path.expanduser(path)
return os.path.isfile(os.path.join(expanded_path, 'gclient.py'))
@@ -22,7 +26,13 @@ def IsRealDepotTools(path):
def add_depot_tools_to_path():
"""Search for depot_tools and add it to sys.path."""
- # First look if depot_tools is already in PYTHONPATH.
+ # First, check if we have a DEPS'd in "depot_tools".
+ deps_depot_tools = os.path.join(SRC, 'third_party', 'depot_tools')
+ if IsRealDepotTools(deps_depot_tools):
+ sys.path.append(deps_depot_tools)
+ return deps_depot_tools
+
+ # Then look if depot_tools is already in PYTHONPATH.
for i in sys.path:
if i.rstrip(os.sep).endswith('depot_tools') and IsRealDepotTools(i):
return i
diff --git a/chromium/build/fuchsia/OWNERS b/chromium/build/fuchsia/OWNERS
new file mode 100644
index 00000000000..22e1b69b8f6
--- /dev/null
+++ b/chromium/build/fuchsia/OWNERS
@@ -0,0 +1,9 @@
+jamesr@chromium.org
+kmarshall@chromium.org
+scottmg@chromium.org
+sergeyu@chromium.org
+thakis@chromium.org
+wez@chromium.org
+
+# TEAM: cr-fuchsia@chromium.org
+# COMPONENT: Internals>PlatformIntegration
diff --git a/chromium/build/fuchsia/create_test_runner_script.py b/chromium/build/fuchsia/create_test_runner_script.py
new file mode 100755
index 00000000000..c85e7ce5300
--- /dev/null
+++ b/chromium/build/fuchsia/create_test_runner_script.py
@@ -0,0 +1,114 @@
+#!/usr/bin/env python
+#
+# Copyright 2017 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 a script to run a Fushsia test (typically on QEMU) by delegating to
+build/fuchsia/test_runner.py.
+"""
+
+import argparse
+import os
+import re
+import sys
+
+
+SCRIPT_TEMPLATE = """\
+#!/usr/bin/env python
+#
+# This file was generated by build/fuchsia/create_test_runner_script.py
+
+import os
+import sys
+
+def main():
+ script_directory = os.path.dirname(__file__)
+
+ def ResolvePath(path):
+ \"\"\"Returns an absolute filepath given a path relative to this script.
+ \"\"\"
+ return os.path.abspath(os.path.join(script_directory, path))
+
+ test_runner_path = ResolvePath('{test_runner_path}')
+ test_runner_args = {test_runner_args}
+ test_runner_path_args = {test_runner_path_args}
+ for arg, path in test_runner_path_args:
+ test_runner_args.extend([arg, ResolvePath(path)])
+
+ os.execv(test_runner_path,
+ [test_runner_path] + test_runner_args + sys.argv[1:])
+
+if __name__ == '__main__':
+ sys.exit(main())
+"""
+
+
+def MakeDirectory(dir_path):
+ try:
+ os.makedirs(dir_path)
+ except OSError:
+ pass
+
+
+def WriteDepfile(depfile_path, first_gn_output, inputs=None):
+ assert depfile_path != first_gn_output
+ inputs = inputs or []
+ MakeDirectory(os.path.dirname(depfile_path))
+ # Ninja does not support multiple outputs in depfiles.
+ with open(depfile_path, 'w') as depfile:
+ depfile.write(first_gn_output.replace(' ', '\\ '))
+ depfile.write(': ')
+ depfile.write(' '.join(i.replace(' ', '\\ ') for i in inputs))
+ depfile.write('\n')
+
+
+def main(args):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--script-output-path',
+ help='Output path for executable script.')
+ parser.add_argument('--depfile',
+ help='Path to the depfile. This must be specified as '
+ 'the action\'s first output.')
+ parser.add_argument('--test-runner-path',
+ help='Path to test_runner.py (optional).')
+ group = parser.add_argument_group('Test runner path arguments.')
+ group.add_argument('--output-directory')
+ group.add_argument('--runtime-deps-path')
+ group.add_argument('--test-name')
+ args, test_runner_args = parser.parse_known_args(args)
+
+ def RelativizePathToScript(path):
+ """Returns the path relative to the output script directory."""
+ return os.path.relpath(path, os.path.dirname(args.script_output_path))
+
+ test_runner_path = args.test_runner_path or os.path.join(
+ os.path.dirname(__file__), 'test_runner.py')
+ test_runner_path = RelativizePathToScript(test_runner_path)
+
+ test_runner_path_args = []
+ if args.output_directory:
+ test_runner_path_args.append(
+ ('--output-directory', RelativizePathToScript(args.output_directory)))
+ if args.runtime_deps_path:
+ test_runner_path_args.append(
+ ('--runtime-deps-path', RelativizePathToScript(args.runtime_deps_path)))
+ if args.test_name:
+ test_runner_path_args.append(
+ ('--test-name', RelativizePathToScript(args.test_name)))
+
+ with open(args.script_output_path, 'w') as script:
+ script.write(SCRIPT_TEMPLATE.format(
+ test_runner_path=str(test_runner_path),
+ test_runner_args=str(test_runner_args),
+ test_runner_path_args=str(test_runner_path_args)))
+
+ os.chmod(args.script_output_path, 0750)
+
+ if args.depfile:
+ WriteDepfile(args.depfile, args.script_output_path,
+ [__file__])
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/chromium/build/fuchsia/test_runner.py b/chromium/build/fuchsia/test_runner.py
new file mode 100755
index 00000000000..87e52b333a3
--- /dev/null
+++ b/chromium/build/fuchsia/test_runner.py
@@ -0,0 +1,350 @@
+#!/usr/bin/env python
+#
+# Copyright 2017 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.
+
+"""Packages a user.bootfs for a Fuchsia QEMU image, pulling in the runtime
+dependencies of a test binary, and then uses QEMU from the Fuchsia SDK to run
+it. Does not yet implement running on real hardware."""
+
+import argparse
+import multiprocessing
+import os
+import re
+import subprocess
+import sys
+import tempfile
+
+
+DIR_SOURCE_ROOT = os.path.abspath(
+ os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
+SDK_ROOT = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'fuchsia-sdk')
+
+
+def RunAndCheck(dry_run, args):
+ if dry_run:
+ print 'Run:', args
+ else:
+ subprocess.check_call(args)
+
+
+def DumpFile(dry_run, name, description):
+ """Prints out the contents of |name| if |dry_run|."""
+ if not dry_run:
+ return
+ print
+ print 'Contents of %s (for %s)' % (name, description)
+ print '-' * 80
+ with open(name) as f:
+ sys.stdout.write(f.read())
+ print '-' * 80
+
+
+def MakeTargetImageName(common_prefix, output_directory, location):
+ """Generates the relative path name to be used in the file system image.
+ common_prefix: a prefix of both output_directory and location that
+ be removed.
+ output_directory: an optional prefix on location that will also be removed.
+ location: the file path to relativize.
+
+ .so files will be stored into the lib subdirectory to be able to be found by
+ default by the loader.
+
+ Examples:
+
+ >>> MakeTargetImageName(common_prefix='/work/cr/src/',
+ ... output_directory='/work/cr/src/out/fuch',
+ ... location='/work/cr/src/base/test/data/xyz.json')
+ 'base/test/data/xyz.json'
+
+ >>> MakeTargetImageName(common_prefix='/work/cr/src/',
+ ... output_directory='/work/cr/src/out/fuch',
+ ... location='/work/cr/src/out/fuch/icudtl.dat')
+ 'icudtl.dat'
+
+ >>> MakeTargetImageName(common_prefix='/work/cr/src/',
+ ... output_directory='/work/cr/src/out/fuch',
+ ... location='/work/cr/src/out/fuch/libbase.so')
+ 'lib/libbase.so'
+ """
+ assert output_directory.startswith(common_prefix)
+ output_dir_no_common_prefix = output_directory[len(common_prefix):]
+ assert location.startswith(common_prefix)
+ loc = location[len(common_prefix):]
+ if loc.startswith(output_dir_no_common_prefix):
+ loc = loc[len(output_dir_no_common_prefix)+1:]
+ # TODO(fuchsia): The requirements for finding/loading .so are in flux, so this
+ # ought to be reconsidered at some point. See https://crbug.com/732897.
+ if location.endswith('.so'):
+ loc = 'lib/' + loc
+ return loc
+
+
+def AddToManifest(manifest_file, target_name, source, mapper):
+ """Appends |source| to the given |manifest_file| (a file object) in a format
+ suitable for consumption by mkbootfs.
+
+ If |source| is a file it's directly added. If |source| is a directory, its
+ contents are recursively added.
+
+ |source| must exist on disk at the time this function is called.
+ """
+ if os.path.isdir(source):
+ files = [os.path.join(dp, f) for dp, dn, fn in os.walk(source) for f in fn]
+ for f in files:
+ # We pass None as the mapper because this should never recurse a 2nd time.
+ AddToManifest(manifest_file, mapper(f), f, None)
+ elif os.path.exists(source):
+ manifest_file.write('%s=%s\n' % (target_name, source))
+ else:
+ raise Exception('%s does not exist' % source)
+
+
+def BuildBootfs(output_directory, runtime_deps_path, test_name, child_args,
+ test_launcher_filter_file, dry_run):
+ with open(runtime_deps_path) as f:
+ lines = f.readlines()
+
+ locations_to_add = [os.path.abspath(os.path.join(output_directory, x.strip()))
+ for x in lines]
+ locations_to_add.append(
+ os.path.abspath(os.path.join(output_directory, test_name)))
+
+ common_prefix = os.path.commonprefix(locations_to_add)
+ target_source_pairs = zip(
+ [MakeTargetImageName(common_prefix, output_directory, loc)
+ for loc in locations_to_add],
+ locations_to_add)
+
+ # Add extra .so's that are required for running to system/lib
+ sysroot_libs = [
+ 'libc++abi.so.1',
+ 'libc++.so.2',
+ 'libunwind.so.1',
+ ]
+ sysroot_lib_path = os.path.join(SDK_ROOT, 'sysroot', 'x86_64-fuchsia', 'lib')
+ for lib in sysroot_libs:
+ target_source_pairs.append(
+ ('lib/' + lib, os.path.join(sysroot_lib_path, lib)))
+
+ if test_launcher_filter_file:
+ test_launcher_filter_file = os.path.normpath(
+ os.path.join(output_directory, test_launcher_filter_file))
+ filter_file_on_device = MakeTargetImageName(
+ common_prefix, output_directory, test_launcher_filter_file)
+ child_args.append('--test-launcher-filter-file=/system/' +
+ filter_file_on_device)
+ target_source_pairs.append(
+ [filter_file_on_device, test_launcher_filter_file])
+
+ # Generate a little script that runs the test binaries and then shuts down
+ # QEMU.
+ autorun_file = tempfile.NamedTemporaryFile()
+ autorun_file.write('#!/bin/sh\n')
+ autorun_file.write('/system/' + os.path.basename(test_name))
+
+ for arg in child_args:
+ autorun_file.write(' "%s"' % arg);
+
+ autorun_file.write('\n')
+ # If shutdown happens too soon after the test completion, log statements from
+ # the end of the run will be lost, so sleep for a bit before shutting down.
+ autorun_file.write('msleep 3000\n')
+ autorun_file.write('dm poweroff\n')
+ autorun_file.flush()
+ os.chmod(autorun_file.name, 0750)
+ DumpFile(dry_run, autorun_file.name, 'autorun')
+ target_source_pairs.append(('autorun', autorun_file.name))
+
+ # Generate an initial.config for application_manager that tells it to run
+ # our autorun script with sh.
+ initial_config_file = tempfile.NamedTemporaryFile()
+ initial_config_file.write('''{
+ "initial-apps": [
+ [ "file:///boot/bin/sh", "/system/autorun" ]
+ ]
+}
+''')
+ initial_config_file.flush()
+ DumpFile(dry_run, initial_config_file.name, 'initial.config')
+ target_source_pairs.append(('data/appmgr/initial.config',
+ initial_config_file.name))
+
+ manifest_file = tempfile.NamedTemporaryFile()
+ bootfs_name = runtime_deps_path + '.bootfs'
+
+ for target, source in target_source_pairs:
+ AddToManifest(manifest_file.file, target, source,
+ lambda x: MakeTargetImageName(
+ common_prefix, output_directory, x))
+
+ mkbootfs_path = os.path.join(SDK_ROOT, 'tools', 'mkbootfs')
+
+ manifest_file.flush()
+ DumpFile(dry_run, manifest_file.name, 'manifest')
+ RunAndCheck(dry_run,
+ [mkbootfs_path, '-o', bootfs_name,
+ '--target=boot', os.path.join(SDK_ROOT, 'bootdata.bin'),
+ '--target=system', manifest_file.name,
+ ])
+ return bootfs_name
+
+
+def SymbolizeEntry(entry):
+ addr2line_output = subprocess.check_output(
+ ['addr2line', '-Cipf', '--exe=' + entry[1], entry[2]])
+ prefix = '#%s: ' % entry[0]
+ # addr2line outputs a second line for inlining information, offset
+ # that to align it properly after the frame index.
+ addr2line_filtered = addr2line_output.strip().replace(
+ '(inlined', ' ' * len(prefix) + '(inlined')
+ return '#%s: %s' % (prefix, addr2line_filtered)
+
+
+def ParallelSymbolizeBacktrace(backtrace):
+ p = multiprocessing.Pool(multiprocessing.cpu_count())
+ return p.imap(SymbolizeEntry, backtrace)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--dry-run', '-n', action='store_true', default=False,
+ help='Just print commands, don\'t execute them.')
+ parser.add_argument('--output-directory',
+ type=os.path.realpath,
+ help=('Path to the directory in which build files are'
+ ' located (must include build type).'))
+ parser.add_argument('--runtime-deps-path',
+ type=os.path.realpath,
+ help='Runtime data dependency file from GN.')
+ parser.add_argument('--test-name',
+ type=os.path.realpath,
+ help='Name of the the test')
+ parser.add_argument('--gtest_filter',
+ help='GTest filter to use in place of any default.')
+ parser.add_argument('--gtest_repeat',
+ help='GTest repeat value to use.')
+ parser.add_argument('--single-process-tests', action='store_true',
+ default=False,
+ help='Runs the tests and the launcher in the same '
+ 'process. Useful for debugging.')
+ parser.add_argument('--test-launcher-batch-limit',
+ type=int,
+ help='Sets the limit of test batch to run in a single '
+ 'process.')
+ # --test-launcher-filter-file is specified relative to --output-directory,
+ # so specifying type=os.path.* will break it.
+ parser.add_argument('--test-launcher-filter-file',
+ help='Pass filter file through to target process.')
+ parser.add_argument('--test-launcher-jobs',
+ type=int,
+ help='Sets the number of parallel test jobs.')
+ parser.add_argument('--test_launcher_summary_output',
+ help='Currently ignored for 2-sided roll.')
+ parser.add_argument('child_args', nargs='*',
+ help='Arguments for the test process.')
+ args = parser.parse_args()
+
+ child_args = ['--test-launcher-retry-limit=0']
+
+ if int(os.environ.get('CHROME_HEADLESS', 0)) != 0:
+ # When running on bots (without KVM) execution is quite slow. The test
+ # launcher times out a subprocess after 45s which can be too short. Make the
+ # timeout twice as long.
+ child_args.append('--test-launcher-timeout=90000')
+
+ if args.single_process_tests:
+ child_args.append('--single-process-tests')
+
+ if args.test_launcher_batch_limit:
+ child_args.append('--test-launcher-batch-limit=%d' %
+ args.test_launcher_batch_limit)
+ if args.test_launcher_jobs:
+ child_args.append('--test-launcher-jobs=%d' %
+ args.test_launcher_jobs)
+ if args.gtest_filter:
+ child_args.append('--gtest_filter=' + args.gtest_filter)
+ if args.gtest_repeat:
+ child_args.append('--gtest_repeat=' + args.gtest_repeat)
+ if args.child_args:
+ child_args.extend(args.child_args)
+
+ bootfs = BuildBootfs(args.output_directory, args.runtime_deps_path,
+ args.test_name, child_args,
+ args.test_launcher_filter_file, args.dry_run)
+
+ qemu_path = os.path.join(SDK_ROOT, 'qemu', 'bin', 'qemu-system-x86_64')
+
+ qemu_command = [qemu_path,
+ '-m', '2048',
+ '-nographic',
+ '-net', 'none',
+ '-smp', '4',
+ '-machine', 'q35',
+ '-kernel', os.path.join(SDK_ROOT, 'kernel', 'magenta.bin'),
+ '-initrd', bootfs,
+
+ # Use stdio for the guest OS only; don't attach the QEMU interactive
+ # monitor.
+ '-serial', 'stdio',
+ '-monitor', 'none',
+
+ # TERM=dumb tells the guest OS to not emit ANSI commands that trigger
+ # noisy ANSI spew from the user's terminal emulator.
+ '-append', 'TERM=dumb kernel.halt_on_panic=true']
+ if int(os.environ.get('CHROME_HEADLESS', 0)) == 0:
+ qemu_command += ['-enable-kvm', '-cpu', 'host,migratable=no']
+ else:
+ qemu_command += ['-cpu', 'Haswell,+smap,-check']
+
+ if args.dry_run:
+ print 'Run:', qemu_command
+ else:
+ prefix = r'^.*> '
+ bt_with_offset_re = re.compile(prefix +
+ 'bt#(\d+): pc 0x[0-9a-f]+ sp (0x[0-9a-f]+) \((\S+),(0x[0-9a-f]+)\)$')
+ bt_end_re = re.compile(prefix + 'bt#(\d+): end')
+
+ # We pass a separate stdin stream to qemu. Sharing stdin across processes
+ # leads to flakiness due to the OS prematurely killing the stream and the
+ # Python script panicking and aborting.
+ # The precise root cause is still nebulous, but this fix works.
+ # See crbug.com/741194 .
+ qemu_popen = subprocess.Popen(
+ qemu_command, stdout=subprocess.PIPE, stdin=open(os.devnull))
+
+ # A buffer of backtrace entries awaiting symbolization, stored as tuples.
+ # Element #0: backtrace frame number (starting at 0).
+ # Element #1: path to executable code corresponding to the current frame.
+ # Element #2: memory offset within the executable.
+ bt_entries = []
+
+ success = False
+ while True:
+ line = qemu_popen.stdout.readline()
+ if not line:
+ break
+ print line,
+ if 'SUCCESS: all tests passed.' in line:
+ success = True
+ if bt_end_re.match(line.strip()):
+ if bt_entries:
+ print '----- start symbolized stack'
+ for processed in ParallelSymbolizeBacktrace(bt_entries):
+ print processed
+ print '----- end symbolized stack'
+ bt_entries = []
+ else:
+ m = bt_with_offset_re.match(line.strip())
+ if m:
+ bt_entries.append((m.group(1), args.test_name, m.group(4)))
+ qemu_popen.wait()
+
+ return 0 if success else 1
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/build/get_landmines.py b/chromium/build/get_landmines.py
index 05e7b1a5e10..48197005865 100755
--- a/chromium/build/get_landmines.py
+++ b/chromium/build/get_landmines.py
@@ -28,6 +28,16 @@ def print_landmines():
# need to be cleaned up. If you're writing a new CL that causes build
# dependency problems, fix the dependency problems instead of adding a
# landmine.
+ #
+ # Before adding or changing a landmine consider the consequences of doing so.
+ # Doing so will wipe out every output directory on every Chrome developer's
+ # machine. This can be particularly problematic on Windows where the directory
+ # deletion may well fail (locked files, command prompt in the directory,
+ # etc.), and generated .sln and .vcxproj files will be deleted.
+ #
+ # This output directory deletion will be repeated when going back and forth
+ # across the change that added the landmine, adding to the cost. There are
+ # usually less troublesome alternatives.
if distributor() == 'goma' and platform() == 'win32':
print 'Need to clobber winja goma due to backend cwd cache fix.'
@@ -74,6 +84,7 @@ def print_landmines():
print 'Clobber to get past mojo gen build error (crbug.com/679607)'
if platform() == 'win':
print 'Clobber Windows to fix strange PCH-not-rebuilt errors.'
+ print 'CLobber all to fix GN breakage (crbug.com/736215)'
def main():
print_landmines()
diff --git a/chromium/build/install-build-deps.sh b/chromium/build/install-build-deps.sh
index c965a9b38e0..0a1e3f3346f 100755
--- a/chromium/build/install-build-deps.sh
+++ b/chromium/build/install-build-deps.sh
@@ -112,7 +112,7 @@ fi
distro_codename=$(lsb_release --codename --short)
distro_id=$(lsb_release --id --short)
-supported_codenames="(trusty|xenial|yakkety)"
+supported_codenames="(trusty|xenial|yakkety|zesty)"
supported_ids="(Debian)"
if [ 0 -eq "${do_unsupported-0}" ] && [ 0 -eq "${do_quick_check-0}" ] ; then
if [[ ! $distro_codename =~ $supported_codenames &&
@@ -121,6 +121,7 @@ if [ 0 -eq "${do_unsupported-0}" ] && [ 0 -eq "${do_quick_check-0}" ] ; then
"\tUbuntu 14.04 (trusty)\n" \
"\tUbuntu 16.04 (xenial)\n" \
"\tUbuntu 16.10 (yakkety)\n" \
+ "\tUbuntu 17.04 (zesty)\n" \
"\tDebian 8 (jessie) or later" >&2
exit 1
fi
@@ -307,7 +308,7 @@ else
fi
# 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf
-lib32_list="linux-libc-dev:i386"
+lib32_list="linux-libc-dev:i386 libpci3:i386"
# arm cross toolchain packages needed to build chrome on armhf
EM_REPO="deb http://emdebian.org/tools/debian/ jessie main"
@@ -359,7 +360,7 @@ case $distro_codename in
arm_list+=" g++-4.8-multilib-arm-linux-gnueabihf
gcc-4.8-multilib-arm-linux-gnueabihf"
;;
- xenial|yakkety)
+ xenial|yakkety|zesty)
arm_list+=" g++-5-multilib-arm-linux-gnueabihf
gcc-5-multilib-arm-linux-gnueabihf
gcc-arm-linux-gnueabihf"
diff --git a/chromium/build/ios/clean_env.py b/chromium/build/ios/clean_env.py
index 548e2b92eef..bf56b2fe818 100755
--- a/chromium/build/ios/clean_env.py
+++ b/chromium/build/ios/clean_env.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright (c) 2012 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.
diff --git a/chromium/build/landmines.py b/chromium/build/landmines.py
index 1b2f1cdbb08..991ec04573a 100755
--- a/chromium/build/landmines.py
+++ b/chromium/build/landmines.py
@@ -11,6 +11,16 @@ directory.
A landmine is tripped when a builder checks out a different revision, and the
diff between the new landmines and the old ones is non-null. At this point, the
build is clobbered.
+
+Before adding or changing a landmine consider the consequences of doing so.
+Doing so will wipe out every output directory on every Chrome developer's
+machine. This can be particularly problematic on Windows where the directory
+deletion may well fail (locked files, command prompt in the directory, etc.),
+and generated .sln and .vcxproj files will be deleted.
+
+This output directory deletion will be repated when going back and forth across
+the change that added the landmine, adding to the cost. There are usually less
+troublesome alternatives.
"""
import difflib
diff --git a/chromium/build/linux/BUILD.gn b/chromium/build/linux/BUILD.gn
index 0449f82170b..caa860e8765 100644
--- a/chromium/build/linux/BUILD.gn
+++ b/chromium/build/linux/BUILD.gn
@@ -29,25 +29,10 @@ if (use_gio) {
# GYP build.
#ignore_libs = true # Loader generated below.
}
-
- deps = [
- "//build/linux/libgio",
- ]
}
# Looking for libspeechd? Use //third_party/speech-dispatcher
-group("fontconfig") {
- if (is_chromecast) {
- # Chromecast platform does not provide fontconfig
- public_deps = [
- "//third_party/fontconfig",
- ]
- } else {
- public_configs = [ "//build/config/linux:fontconfig" ]
- }
-}
-
if (!is_chromecast) {
# Only provided for distributions which prefer to keep linking to FreeType on
# the system, use with caution,for details see build/config/freetype/BUILD.gn.
diff --git a/chromium/build/linux/bin/eu-strip.sha1 b/chromium/build/linux/bin/eu-strip.sha1
deleted file mode 100644
index 43f290a701a..00000000000
--- a/chromium/build/linux/bin/eu-strip.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0a9b8f68615ce388b65201e6d22da7a9cf2e729c \ No newline at end of file
diff --git a/chromium/build/linux/sysroot_scripts/build_and_upload.py b/chromium/build/linux/sysroot_scripts/build_and_upload.py
index bdbd73dddf5..78eaa6319e4 100755
--- a/chromium/build/linux/sysroot_scripts/build_and_upload.py
+++ b/chromium/build/linux/sysroot_scripts/build_and_upload.py
@@ -44,10 +44,10 @@ def build_and_upload(script_path, distro, release, arch, lock):
run_script([script_path, 'BuildSysroot%s' % arch])
run_script([script_path, 'UploadSysroot%s' % arch, revision])
- tarball = '%s_%s_%s_sysroot.tgz' % (distro, release, arch.lower())
- tgz_path = os.path.join(script_dir, "..", "..", "..", "out", "sysroot-build",
- release, tarball)
- sha1sum = sha1sumfile(tgz_path)
+ tarball = '%s_%s_%s_sysroot.tar.xz' % (distro, release, arch.lower())
+ tarxz_path = os.path.join(script_dir, "..", "..", "..", "out",
+ "sysroot-build", release, tarball)
+ sha1sum = sha1sumfile(tarxz_path)
sysroot_dir = '%s_%s_%s-sysroot' % (distro, release, arch.lower())
sysroot_metadata = {
diff --git a/chromium/build/linux/sysroot_scripts/debian-archive-jessie-stable.gpg b/chromium/build/linux/sysroot_scripts/debian-archive-jessie-stable.gpg
index 6a3696efc28..ead40d275a1 100644
--- a/chromium/build/linux/sysroot_scripts/debian-archive-jessie-stable.gpg
+++ b/chromium/build/linux/sysroot_scripts/debian-archive-jessie-stable.gpg
Binary files differ
diff --git a/chromium/build/linux/sysroot_scripts/install-sysroot.py b/chromium/build/linux/sysroot_scripts/install-sysroot.py
index 90b70689d54..181ac9368fc 100755
--- a/chromium/build/linux/sysroot_scripts/install-sysroot.py
+++ b/chromium/build/linux/sysroot_scripts/install-sysroot.py
@@ -64,17 +64,17 @@ def DetectHostArch():
detected_host_arch = detect_host_arch.HostArch()
if detected_host_arch == 'x64':
return 'amd64'
- elif detected_host_arch == 'ia32':
+ if detected_host_arch == 'ia32':
return 'i386'
- elif detected_host_arch == 'arm':
+ if detected_host_arch == 'arm':
return 'arm'
- elif detected_host_arch == 'arm64':
+ if detected_host_arch == 'arm64':
return 'arm64'
- elif detected_host_arch == 'mips':
+ if detected_host_arch == 'mips':
return 'mips'
- elif detected_host_arch == 'ppc':
+ if detected_host_arch == 'ppc':
return 'ppc'
- elif detected_host_arch == 's390':
+ if detected_host_arch == 's390':
return 's390'
raise Error('Unrecognized host arch: %s' % detected_host_arch)
@@ -93,13 +93,13 @@ def DetectTargetArch():
target_arch = gyp_defines.get('target_arch')
if target_arch == 'x64':
return 'amd64'
- elif target_arch == 'ia32':
+ if target_arch == 'ia32':
return 'i386'
- elif target_arch == 'arm':
+ if target_arch == 'arm':
return 'arm'
- elif target_arch == 'arm64':
+ if target_arch == 'arm64':
return 'arm64'
- elif target_arch == 'mipsel':
+ if target_arch == 'mipsel':
return 'mips'
return None
diff --git a/chromium/build/linux/sysroot_scripts/packagelist.jessie.amd64 b/chromium/build/linux/sysroot_scripts/packagelist.jessie.amd64
index 855e61c89ca..8854e62a1d3 100644
--- a/chromium/build/linux/sysroot_scripts/packagelist.jessie.amd64
+++ b/chromium/build/linux/sysroot_scripts/packagelist.jessie.amd64
@@ -1,210 +1,210 @@
-main/a/alsa-lib/libasound2_1.0.28-1_amd64.deb
-main/a/alsa-lib/libasound2-dev_1.0.28-1_amd64.deb
-main/a/atk1.0/libatk1.0-0_2.14.0-1_amd64.deb
-main/a/atk1.0/libatk1.0-dev_2.14.0-1_amd64.deb
-main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_amd64.deb
-main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_amd64.deb
-main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_amd64.deb
-main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_amd64.deb
-main/a/attr/libattr1_2.4.47-2_amd64.deb
-main/a/audit/libaudit1_2.4-1+b1_amd64.deb
-main/a/avahi/libavahi-client3_0.6.31-5_amd64.deb
-main/a/avahi/libavahi-common3_0.6.31-5_amd64.deb
-main/b/bluez/libbluetooth3_5.23-2+b1_amd64.deb
-main/b/bluez/libbluetooth-dev_5.23-2+b1_amd64.deb
-main/b/brltty/libbrlapi0.6_5.2~20141018-5_amd64.deb
-main/b/brltty/libbrlapi-dev_5.2~20141018-5_amd64.deb
-main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_amd64.deb
-main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_amd64.deb
-main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_amd64.deb
-main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_amd64.deb
-main/c/cups/libcups2_1.7.5-11+deb8u1_amd64.deb
-main/c/cups/libcups2-dev_1.7.5-11+deb8u1_amd64.deb
-main/d/dbus-glib/libdbus-glib-1-2_0.102-1_amd64.deb
-main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_amd64.deb
-main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_amd64.deb
-main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_amd64.deb
-main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_amd64.deb
-main/e/elfutils/libelf1_0.159-4.2_amd64.deb
-main/e/elfutils/libelf-dev_0.159-4.2_amd64.deb
-main/e/expat/libexpat1_2.1.0-6+deb8u3_amd64.deb
-main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_amd64.deb
-main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_amd64.deb
-main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_amd64.deb
-main/f/freetype/libfreetype6_2.5.2-3+deb8u1_amd64.deb
-main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u1_amd64.deb
-main/g/gcc-4.8/libasan0_4.8.4-1_amd64.deb
-main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_amd64.deb
-main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_amd64.deb
-main/g/gcc-4.9/libatomic1_4.9.2-10_amd64.deb
-main/g/gcc-4.9/libcilkrts5_4.9.2-10_amd64.deb
-main/g/gcc-4.9/libgcc1_4.9.2-10_amd64.deb
-main/g/gcc-4.9/libgomp1_4.9.2-10_amd64.deb
-main/g/gcc-4.9/libitm1_4.9.2-10_amd64.deb
-main/g/gcc-4.9/liblsan0_4.9.2-10_amd64.deb
-main/g/gcc-4.9/libquadmath0_4.9.2-10_amd64.deb
-main/g/gcc-4.9/libstdc++6_4.9.2-10_amd64.deb
-main/g/gcc-4.9/libtsan0_4.9.2-10_amd64.deb
-main/g/gcc-4.9/libubsan0_4.9.2-10_amd64.deb
-main/g/gconf/libgconf2-4_3.2.6-3_amd64.deb
-main/g/gconf/libgconf-2-4_3.2.6-3_amd64.deb
-main/g/gconf/libgconf2-dev_3.2.6-3_amd64.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_amd64.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_amd64.deb
-main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_amd64.deb
-main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_amd64.deb
-main/g/glibc/libc6_2.19-18+deb8u7_amd64.deb
-main/g/glibc/libc6-dev_2.19-18+deb8u7_amd64.deb
-main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u4_amd64.deb
-main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u4_amd64.deb
-main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u4_amd64.deb
-main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u4_amd64.deb
-main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_amd64.deb
-main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_amd64.deb
-main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_amd64.deb
-main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_amd64.deb
-main/h/harfbuzz/libharfbuzz0b_0.9.35-2_amd64.deb
-main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_amd64.deb
-main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_amd64.deb
-main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_amd64.deb
-main/k/keyutils/libkeyutils1_1.5.9-5+b1_amd64.deb
-main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_amd64.deb
-main/libc/libcap2/libcap2_2.24-8_amd64.deb
-main/libc/libcap2/libcap-dev_2.24-8_amd64.deb
-main/libd/libdrm/libdrm2_2.4.58-2_amd64.deb
-main/libd/libdrm/libdrm-dev_2.4.58-2_amd64.deb
-main/libd/libdrm/libdrm-intel1_2.4.58-2_amd64.deb
-main/libd/libdrm/libdrm-nouveau2_2.4.58-2_amd64.deb
-main/libd/libdrm/libdrm-radeon1_2.4.58-2_amd64.deb
-main/libf/libffi/libffi6_3.1-2+b2_amd64.deb
-main/libf/libffi/libffi-dev_3.1-2+b2_amd64.deb
-main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_amd64.deb
-main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_amd64.deb
-main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_amd64.deb
-main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_amd64.deb
-main/libg/libgpg-error/libgpg-error0_1.17-3_amd64.deb
-main/libg/libgpg-error/libgpg-error-dev_1.17-3_amd64.deb
-main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_amd64.deb
-main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_amd64.deb
-main/libn/libnss-db/libnss-db_2.2.3pre1-5+b3_amd64.deb
-main/libp/libp11/libp11-2_0.2.8-5_amd64.deb
-main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_amd64.deb
-main/libp/libpng/libpng12-dev_1.2.50-2+deb8u3_amd64.deb
-main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_amd64.deb
-main/libs/libselinux/libselinux1_2.3-2_amd64.deb
-main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u2_amd64.deb
-main/libx/libx11/libx11-6_1.6.2-3_amd64.deb
-main/libx/libx11/libx11-dev_1.6.2-3_amd64.deb
-main/libx/libx11/libx11-xcb1_1.6.2-3_amd64.deb
-main/libx/libx11/libx11-xcb-dev_1.6.2-3_amd64.deb
-main/libx/libxau/libxau6_1.0.8-1_amd64.deb
-main/libx/libxau/libxau-dev_1.0.8-1_amd64.deb
-main/libx/libxcb/libxcb1_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb1-dev_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-glx0_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-present0_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-render0_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-shm0_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_amd64.deb
-main/libx/libxcb/libxcb-sync1_1.10-3+b1_amd64.deb
-main/libx/libxcomposite/libxcomposite1_0.4.4-1_amd64.deb
-main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_amd64.deb
-main/libx/libxcursor/libxcursor1_1.1.14-1+b1_amd64.deb
-main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_amd64.deb
-main/libx/libxdamage/libxdamage1_1.1.4-2+b1_amd64.deb
-main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_amd64.deb
-main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_amd64.deb
-main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_amd64.deb
-main/libx/libxext/libxext6_1.3.3-1_amd64.deb
-main/libx/libxext/libxext-dev_1.3.3-1_amd64.deb
-main/libx/libxfixes/libxfixes3_5.0.1-2+b2_amd64.deb
-main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_amd64.deb
-main/libx/libxi/libxi6_1.7.4-1+b2_amd64.deb
-main/libx/libxi/libxi-dev_1.7.4-1+b2_amd64.deb
-main/libx/libxinerama/libxinerama1_1.1.3-1+b1_amd64.deb
-main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_amd64.deb
-main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_amd64.deb
-main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_amd64.deb
-main/libx/libxrandr/libxrandr2_1.4.2-1+b1_amd64.deb
-main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_amd64.deb
-main/libx/libxrender/libxrender1_0.9.8-1+b1_amd64.deb
-main/libx/libxrender/libxrender-dev_0.9.8-1+b1_amd64.deb
-main/libx/libxshmfence/libxshmfence1_1.1-4_amd64.deb
-main/libx/libxss/libxss1_1.2.2-1_amd64.deb
-main/libx/libxss/libxss-dev_1.2.2-1_amd64.deb
-main/libx/libxt/libxt6_1.1.4-1+b1_amd64.deb
-main/libx/libxt/libxt-dev_1.1.4-1+b1_amd64.deb
-main/libx/libxtst/libxtst6_1.2.2-1+b1_amd64.deb
-main/libx/libxtst/libxtst-dev_1.2.2-1+b1_amd64.deb
-main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_amd64.deb
-main/l/linux/linux-libc-dev_3.16.7-ckt25-2_amd64.deb
-main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_amd64.deb
-main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_amd64.deb
-main/m/mesa/libgbm1_10.3.2-1+deb8u1_amd64.deb
-main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_amd64.deb
-main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_amd64.deb
-main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_amd64.deb
-main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_amd64.deb
-main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_amd64.deb
-main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_amd64.deb
-main/n/nspr/libnspr4_4.12-1+debu8u1_amd64.deb
-main/n/nspr/libnspr4-dev_4.12-1+debu8u1_amd64.deb
-main/n/nss/libnss3_3.26-1+debu8u1_amd64.deb
-main/n/nss/libnss3-dev_3.26-1+debu8u1_amd64.deb
-main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u5_amd64.deb
-main/o/openssl/libssl-dev_1.0.1t-1+deb8u5_amd64.deb
-main/o/orbit2/liborbit2_2.14.19-0.3_amd64.deb
-main/p/p11-kit/libp11-kit0_0.20.7-1_amd64.deb
-main/p/pam/libpam0g_1.1.8-3.1+deb8u2_amd64.deb
-main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_amd64.deb
-main/p/pango1.0/libpango-1.0-0_1.36.8-3_amd64.deb
-main/p/pango1.0/libpango1.0-dev_1.36.8-3_amd64.deb
-main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_amd64.deb
-main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_amd64.deb
-main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_amd64.deb
-main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_amd64.deb
-main/p/pciutils/libpci3_3.2.1-3_amd64.deb
-main/p/pciutils/libpci-dev_3.2.1-3_amd64.deb
-main/p/pcre3/libpcre3_8.35-3.3+deb8u4_amd64.deb
-main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_amd64.deb
-main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_amd64.deb
-main/p/pixman/libpixman-1-0_0.32.6-3_amd64.deb
-main/p/pixman/libpixman-1-dev_0.32.6-3_amd64.deb
-main/p/pulseaudio/libpulse0_5.0-13_amd64.deb
-main/p/pulseaudio/libpulse-dev_5.0-13_amd64.deb
-main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_amd64.deb
-main/s/speech-dispatcher/libspeechd2_0.8-7_amd64.deb
-main/s/speech-dispatcher/libspeechd-dev_0.8-7_amd64.deb
-main/s/speech-dispatcher/speech-dispatcher_0.8-7_amd64.deb
-main/s/systemd/libudev1_215-17+deb8u6_amd64.deb
-main/s/systemd/libudev-dev_215-17+deb8u6_amd64.deb
-main/w/wayland/libwayland-client0_1.6.0-2_amd64.deb
-main/w/wayland/libwayland-cursor0_1.6.0-2_amd64.deb
-main/w/wayland/libwayland-dev_1.6.0-2_amd64.deb
-main/w/wayland/libwayland-server0_1.6.0-2_amd64.deb
-main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
-main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
-main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
-main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
-main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
-main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
-main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
-main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
-main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
-main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
-main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
-main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
-main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_amd64.deb
-main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.0.28-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.0.28-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.14.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.14.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.4-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.6.31-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.6.31-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.23-2+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.23-2+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.2~20141018-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.2~20141018-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.102-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.159-4.2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.159-4.2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libasan0_4.8.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libatomic1_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libcilkrts5_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgcc1_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgomp1_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libitm1_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/liblsan0_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libquadmath0_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libstdc++6_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libtsan0_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libubsan0_4.9.2-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-4_3.2.6-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf-2-4_3.2.6-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-dev_3.2.6-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_0.9.35-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-5+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.24-8_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.24-8_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.58-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.58-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-intel1_2.4.58-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.58-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.58-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.1-2+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.1-2+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error0_1.17-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.17-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-5+b3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libp11/libp11-2_0.2.8-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.3-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.2-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.2-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.2-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.2-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.10-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.14-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage1_1.1.4-2+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext6_1.3.3-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext-dev_1.3.3-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes3_5.0.1-2+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.4-1+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.4-1+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.4.2-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.8-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.8-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.1-4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.4-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.4-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.2-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.2-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_3.16.7-ckt25-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-0.3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.20.7-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.1+deb8u2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.36.8-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.36.8-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.2.1-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.2.1-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3_8.35-3.3+deb8u4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.32.6-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.32.6-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_5.0-13_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_5.0-13_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_215-17+deb8u7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_215-17+deb8u7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.6.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.6.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.6.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.6.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_amd64.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2_1.7.5-11+deb8u1_amd64.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2-dev_1.7.5-11+deb8u1_amd64.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1_2.1.0-6+deb8u3_amd64.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_amd64.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_amd64.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_amd64.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6_2.5.2-3+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_amd64.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_amd64.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6_2.19-18+deb8u3_amd64.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6-dev_2.19-18+deb8u3_amd64.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-dev_1.2.50-2+deb8u2_amd64.deb
+http://security.debian.org/pool/updates/main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u3_amd64.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4_4.12-1+debu8u1_amd64.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4-dev_4.12-1+debu8u1_amd64.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3_3.26-1+debu8u1_amd64.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3-dev_3.26-1+debu8u1_amd64.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_amd64.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl-dev_1.0.1t-1+deb8u6_amd64.deb
diff --git a/chromium/build/linux/sysroot_scripts/packagelist.jessie.arm b/chromium/build/linux/sysroot_scripts/packagelist.jessie.arm
index f715469cdf6..0dae53d620f 100644
--- a/chromium/build/linux/sysroot_scripts/packagelist.jessie.arm
+++ b/chromium/build/linux/sysroot_scripts/packagelist.jessie.arm
@@ -1,207 +1,207 @@
-main/a/alsa-lib/libasound2_1.0.28-1_armhf.deb
-main/a/alsa-lib/libasound2-dev_1.0.28-1_armhf.deb
-main/a/atk1.0/libatk1.0-0_2.14.0-1_armhf.deb
-main/a/atk1.0/libatk1.0-dev_2.14.0-1_armhf.deb
-main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_armhf.deb
-main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_armhf.deb
-main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_armhf.deb
-main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_armhf.deb
-main/a/attr/libattr1_2.4.47-2_armhf.deb
-main/a/audit/libaudit1_2.4-1+b1_armhf.deb
-main/a/avahi/libavahi-client3_0.6.31-5_armhf.deb
-main/a/avahi/libavahi-common3_0.6.31-5_armhf.deb
-main/b/bluez/libbluetooth3_5.23-2+b1_armhf.deb
-main/b/bluez/libbluetooth-dev_5.23-2+b1_armhf.deb
-main/b/brltty/libbrlapi0.6_5.2~20141018-5_armhf.deb
-main/b/brltty/libbrlapi-dev_5.2~20141018-5_armhf.deb
-main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_armhf.deb
-main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_armhf.deb
-main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_armhf.deb
-main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_armhf.deb
-main/c/cups/libcups2_1.7.5-11+deb8u1_armhf.deb
-main/c/cups/libcups2-dev_1.7.5-11+deb8u1_armhf.deb
-main/d/dbus-glib/libdbus-glib-1-2_0.102-1_armhf.deb
-main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_armhf.deb
-main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_armhf.deb
-main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_armhf.deb
-main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_armhf.deb
-main/e/elfutils/libelf1_0.159-4.2_armhf.deb
-main/e/elfutils/libelf-dev_0.159-4.2_armhf.deb
-main/e/expat/libexpat1_2.1.0-6+deb8u3_armhf.deb
-main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_armhf.deb
-main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_armhf.deb
-main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_armhf.deb
-main/f/freetype/libfreetype6_2.5.2-3+deb8u1_armhf.deb
-main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u1_armhf.deb
-main/g/gcc-4.8/libasan0_4.8.4-1_armhf.deb
-main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_armhf.deb
-main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_armhf.deb
-main/g/gcc-4.9/libatomic1_4.9.2-10_armhf.deb
-main/g/gcc-4.9/libgcc1_4.9.2-10_armhf.deb
-main/g/gcc-4.9/libgomp1_4.9.2-10_armhf.deb
-main/g/gcc-4.9/libstdc++6_4.9.2-10_armhf.deb
-main/g/gcc-4.9/libubsan0_4.9.2-10_armhf.deb
-main/g/gconf/libgconf2-4_3.2.6-3_armhf.deb
-main/g/gconf/libgconf-2-4_3.2.6-3_armhf.deb
-main/g/gconf/libgconf2-dev_3.2.6-3_armhf.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_armhf.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_armhf.deb
-main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_armhf.deb
-main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_armhf.deb
-main/g/glibc/libc6_2.19-18+deb8u7_armhf.deb
-main/g/glibc/libc6-dev_2.19-18+deb8u7_armhf.deb
-main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u4_armhf.deb
-main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u4_armhf.deb
-main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u4_armhf.deb
-main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u4_armhf.deb
-main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_armhf.deb
-main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_armhf.deb
-main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_armhf.deb
-main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_armhf.deb
-main/h/harfbuzz/libharfbuzz0b_0.9.35-2_armhf.deb
-main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_armhf.deb
-main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_armhf.deb
-main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_armhf.deb
-main/k/keyutils/libkeyutils1_1.5.9-5+b1_armhf.deb
-main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_armhf.deb
-main/libc/libcap2/libcap2_2.24-8_armhf.deb
-main/libc/libcap2/libcap-dev_2.24-8_armhf.deb
-main/libd/libdrm/libdrm2_2.4.58-2_armhf.deb
-main/libd/libdrm/libdrm-dev_2.4.58-2_armhf.deb
-main/libd/libdrm/libdrm-exynos1_2.4.58-2_armhf.deb
-main/libd/libdrm/libdrm-freedreno1_2.4.58-2_armhf.deb
-main/libd/libdrm/libdrm-nouveau2_2.4.58-2_armhf.deb
-main/libd/libdrm/libdrm-omap1_2.4.58-2_armhf.deb
-main/libd/libdrm/libdrm-radeon1_2.4.58-2_armhf.deb
-main/libf/libffi/libffi6_3.1-2+b2_armhf.deb
-main/libf/libffi/libffi-dev_3.1-2+b2_armhf.deb
-main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_armhf.deb
-main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_armhf.deb
-main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_armhf.deb
-main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_armhf.deb
-main/libg/libgpg-error/libgpg-error0_1.17-3_armhf.deb
-main/libg/libgpg-error/libgpg-error-dev_1.17-3_armhf.deb
-main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_armhf.deb
-main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_armhf.deb
-main/libn/libnss-db/libnss-db_2.2.3pre1-5+b3_armhf.deb
-main/libp/libp11/libp11-2_0.2.8-5_armhf.deb
-main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_armhf.deb
-main/libp/libpng/libpng12-dev_1.2.50-2+deb8u3_armhf.deb
-main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_armhf.deb
-main/libs/libselinux/libselinux1_2.3-2_armhf.deb
-main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u2_armhf.deb
-main/libx/libx11/libx11-6_1.6.2-3_armhf.deb
-main/libx/libx11/libx11-dev_1.6.2-3_armhf.deb
-main/libx/libx11/libx11-xcb1_1.6.2-3_armhf.deb
-main/libx/libx11/libx11-xcb-dev_1.6.2-3_armhf.deb
-main/libx/libxau/libxau6_1.0.8-1_armhf.deb
-main/libx/libxau/libxau-dev_1.0.8-1_armhf.deb
-main/libx/libxcb/libxcb1_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb1-dev_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-glx0_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-present0_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-render0_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-shm0_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_armhf.deb
-main/libx/libxcb/libxcb-sync1_1.10-3+b1_armhf.deb
-main/libx/libxcomposite/libxcomposite1_0.4.4-1_armhf.deb
-main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_armhf.deb
-main/libx/libxcursor/libxcursor1_1.1.14-1+b1_armhf.deb
-main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_armhf.deb
-main/libx/libxdamage/libxdamage1_1.1.4-2+b1_armhf.deb
-main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_armhf.deb
-main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_armhf.deb
-main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_armhf.deb
-main/libx/libxext/libxext6_1.3.3-1_armhf.deb
-main/libx/libxext/libxext-dev_1.3.3-1_armhf.deb
-main/libx/libxfixes/libxfixes3_5.0.1-2+b2_armhf.deb
-main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_armhf.deb
-main/libx/libxi/libxi6_1.7.4-1+b2_armhf.deb
-main/libx/libxi/libxi-dev_1.7.4-1+b2_armhf.deb
-main/libx/libxinerama/libxinerama1_1.1.3-1+b1_armhf.deb
-main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_armhf.deb
-main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_armhf.deb
-main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_armhf.deb
-main/libx/libxrandr/libxrandr2_1.4.2-1+b1_armhf.deb
-main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_armhf.deb
-main/libx/libxrender/libxrender1_0.9.8-1+b1_armhf.deb
-main/libx/libxrender/libxrender-dev_0.9.8-1+b1_armhf.deb
-main/libx/libxshmfence/libxshmfence1_1.1-4_armhf.deb
-main/libx/libxss/libxss1_1.2.2-1_armhf.deb
-main/libx/libxss/libxss-dev_1.2.2-1_armhf.deb
-main/libx/libxt/libxt6_1.1.4-1+b1_armhf.deb
-main/libx/libxt/libxt-dev_1.1.4-1+b1_armhf.deb
-main/libx/libxtst/libxtst6_1.2.2-1+b1_armhf.deb
-main/libx/libxtst/libxtst-dev_1.2.2-1+b1_armhf.deb
-main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_armhf.deb
-main/l/linux/linux-libc-dev_3.16.7-ckt25-2_armhf.deb
-main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_armhf.deb
-main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_armhf.deb
-main/m/mesa/libgbm1_10.3.2-1+deb8u1_armhf.deb
-main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_armhf.deb
-main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_armhf.deb
-main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_armhf.deb
-main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_armhf.deb
-main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_armhf.deb
-main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_armhf.deb
-main/n/nspr/libnspr4_4.12-1+debu8u1_armhf.deb
-main/n/nspr/libnspr4-dev_4.12-1+debu8u1_armhf.deb
-main/n/nss/libnss3_3.26-1+debu8u1_armhf.deb
-main/n/nss/libnss3-dev_3.26-1+debu8u1_armhf.deb
-main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u5_armhf.deb
-main/o/openssl/libssl-dev_1.0.1t-1+deb8u5_armhf.deb
-main/o/orbit2/liborbit2_2.14.19-0.3_armhf.deb
-main/p/p11-kit/libp11-kit0_0.20.7-1_armhf.deb
-main/p/pam/libpam0g_1.1.8-3.1+deb8u2_armhf.deb
-main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_armhf.deb
-main/p/pango1.0/libpango-1.0-0_1.36.8-3_armhf.deb
-main/p/pango1.0/libpango1.0-dev_1.36.8-3_armhf.deb
-main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_armhf.deb
-main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_armhf.deb
-main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_armhf.deb
-main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_armhf.deb
-main/p/pciutils/libpci3_3.2.1-3_armhf.deb
-main/p/pciutils/libpci-dev_3.2.1-3_armhf.deb
-main/p/pcre3/libpcre3_8.35-3.3+deb8u4_armhf.deb
-main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_armhf.deb
-main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_armhf.deb
-main/p/pixman/libpixman-1-0_0.32.6-3_armhf.deb
-main/p/pixman/libpixman-1-dev_0.32.6-3_armhf.deb
-main/p/pulseaudio/libpulse0_5.0-13_armhf.deb
-main/p/pulseaudio/libpulse-dev_5.0-13_armhf.deb
-main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_armhf.deb
-main/s/speech-dispatcher/libspeechd2_0.8-7_armhf.deb
-main/s/speech-dispatcher/libspeechd-dev_0.8-7_armhf.deb
-main/s/speech-dispatcher/speech-dispatcher_0.8-7_armhf.deb
-main/s/systemd/libudev1_215-17+deb8u6_armhf.deb
-main/s/systemd/libudev-dev_215-17+deb8u6_armhf.deb
-main/w/wayland/libwayland-client0_1.6.0-2_armhf.deb
-main/w/wayland/libwayland-cursor0_1.6.0-2_armhf.deb
-main/w/wayland/libwayland-dev_1.6.0-2_armhf.deb
-main/w/wayland/libwayland-server0_1.6.0-2_armhf.deb
-main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
-main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
-main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
-main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
-main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
-main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
-main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
-main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
-main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
-main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
-main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
-main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
-main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_armhf.deb
-main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.0.28-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.0.28-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.14.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.14.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.4-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.6.31-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.6.31-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.23-2+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.23-2+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.2~20141018-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.2~20141018-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.102-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.159-4.2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.159-4.2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libasan0_4.8.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libatomic1_4.9.2-10_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgcc1_4.9.2-10_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgomp1_4.9.2-10_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libstdc++6_4.9.2-10_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libubsan0_4.9.2-10_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-4_3.2.6-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf-2-4_3.2.6-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-dev_3.2.6-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_0.9.35-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-5+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.24-8_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.24-8_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.58-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.58-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-exynos1_2.4.58-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-freedreno1_2.4.58-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.58-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-omap1_2.4.58-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.58-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.1-2+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.1-2+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error0_1.17-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.17-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-5+b3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libp11/libp11-2_0.2.8-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.3-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.2-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.2-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.2-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.2-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.10-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.14-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage1_1.1.4-2+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext6_1.3.3-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext-dev_1.3.3-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes3_5.0.1-2+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.4-1+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.4-1+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.4.2-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.8-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.8-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.1-4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.4-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.4-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.2-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.2-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_3.16.7-ckt25-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-0.3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.20.7-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.1+deb8u2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.36.8-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.36.8-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.2.1-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.2.1-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3_8.35-3.3+deb8u4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.32.6-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.32.6-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_5.0-13_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_5.0-13_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_215-17+deb8u7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_215-17+deb8u7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.6.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.6.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.6.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.6.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_armhf.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2_1.7.5-11+deb8u1_armhf.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2-dev_1.7.5-11+deb8u1_armhf.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1_2.1.0-6+deb8u3_armhf.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_armhf.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_armhf.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_armhf.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6_2.5.2-3+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_armhf.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_armhf.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6_2.19-18+deb8u3_armhf.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6-dev_2.19-18+deb8u3_armhf.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-dev_1.2.50-2+deb8u2_armhf.deb
+http://security.debian.org/pool/updates/main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u3_armhf.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4_4.12-1+debu8u1_armhf.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4-dev_4.12-1+debu8u1_armhf.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3_3.26-1+debu8u1_armhf.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3-dev_3.26-1+debu8u1_armhf.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_armhf.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl-dev_1.0.1t-1+deb8u6_armhf.deb
diff --git a/chromium/build/linux/sysroot_scripts/packagelist.jessie.arm64 b/chromium/build/linux/sysroot_scripts/packagelist.jessie.arm64
index 6143d92f02a..431592c6f8f 100644
--- a/chromium/build/linux/sysroot_scripts/packagelist.jessie.arm64
+++ b/chromium/build/linux/sysroot_scripts/packagelist.jessie.arm64
@@ -1,209 +1,209 @@
-main/a/alsa-lib/libasound2_1.0.28-1_arm64.deb
-main/a/alsa-lib/libasound2-dev_1.0.28-1_arm64.deb
-main/a/atk1.0/libatk1.0-0_2.14.0-1_arm64.deb
-main/a/atk1.0/libatk1.0-dev_2.14.0-1_arm64.deb
-main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_arm64.deb
-main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_arm64.deb
-main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_arm64.deb
-main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_arm64.deb
-main/a/attr/libattr1_2.4.47-2_arm64.deb
-main/a/audit/libaudit1_2.4-1+b1_arm64.deb
-main/a/avahi/libavahi-client3_0.6.31-5_arm64.deb
-main/a/avahi/libavahi-common3_0.6.31-5_arm64.deb
-main/b/bluez/libbluetooth3_5.23-2+b1_arm64.deb
-main/b/bluez/libbluetooth-dev_5.23-2+b1_arm64.deb
-main/b/brltty/libbrlapi0.6_5.2~20141018-5_arm64.deb
-main/b/brltty/libbrlapi-dev_5.2~20141018-5_arm64.deb
-main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_arm64.deb
-main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_arm64.deb
-main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_arm64.deb
-main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_arm64.deb
-main/c/cups/libcups2_1.7.5-11+deb8u1_arm64.deb
-main/c/cups/libcups2-dev_1.7.5-11+deb8u1_arm64.deb
-main/d/dbus-glib/libdbus-glib-1-2_0.102-1_arm64.deb
-main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_arm64.deb
-main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_arm64.deb
-main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_arm64.deb
-main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_arm64.deb
-main/e/elfutils/libelf1_0.159-4.2_arm64.deb
-main/e/elfutils/libelf-dev_0.159-4.2_arm64.deb
-main/e/expat/libexpat1_2.1.0-6+deb8u3_arm64.deb
-main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_arm64.deb
-main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_arm64.deb
-main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_arm64.deb
-main/f/freetype/libfreetype6_2.5.2-3+deb8u1_arm64.deb
-main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u1_arm64.deb
-main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_arm64.deb
-main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_arm64.deb
-main/g/gcc-4.9/libatomic1_4.9.2-10_arm64.deb
-main/g/gcc-4.9/libgcc1_4.9.2-10_arm64.deb
-main/g/gcc-4.9/libgomp1_4.9.2-10_arm64.deb
-main/g/gcc-4.9/libitm1_4.9.2-10_arm64.deb
-main/g/gcc-4.9/libstdc++6_4.9.2-10_arm64.deb
-main/g/gconf/libgconf2-4_3.2.6-3_arm64.deb
-main/g/gconf/libgconf-2-4_3.2.6-3_arm64.deb
-main/g/gconf/libgconf2-dev_3.2.6-3_arm64.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_arm64.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_arm64.deb
-main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_arm64.deb
-main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_arm64.deb
-main/g/glibc/libc6_2.19-18+deb8u7_arm64.deb
-main/g/glibc/libc6-dev_2.19-18+deb8u7_arm64.deb
-main/g/gmp/libgmp10_6.0.0+dfsg-6_arm64.deb
-main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u4_arm64.deb
-main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u4_arm64.deb
-main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u4_arm64.deb
-main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u4_arm64.deb
-main/g/graphite2/libgraphite2-3_1.3.6-1~deb8u1_arm64.deb
-main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_arm64.deb
-main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_arm64.deb
-main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_arm64.deb
-main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_arm64.deb
-main/h/harfbuzz/libharfbuzz0b_0.9.35-2_arm64.deb
-main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_arm64.deb
-main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_arm64.deb
-main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_arm64.deb
-main/k/keyutils/libkeyutils1_1.5.9-5+b1_arm64.deb
-main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_arm64.deb
-main/libc/libcap2/libcap2_2.24-8_arm64.deb
-main/libc/libcap2/libcap-dev_2.24-8_arm64.deb
-main/libd/libdatrie/libdatrie1_0.2.8-1_arm64.deb
-main/libd/libdrm/libdrm2_2.4.58-2_arm64.deb
-main/libd/libdrm/libdrm-dev_2.4.58-2_arm64.deb
-main/libd/libdrm/libdrm-nouveau2_2.4.58-2_arm64.deb
-main/libd/libdrm/libdrm-radeon1_2.4.58-2_arm64.deb
-main/libf/libffi/libffi6_3.1-2+b2_arm64.deb
-main/libf/libffi/libffi-dev_3.1-2+b2_arm64.deb
-main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_arm64.deb
-main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_arm64.deb
-main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_arm64.deb
-main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_arm64.deb
-main/libg/libgpg-error/libgpg-error0_1.17-3_arm64.deb
-main/libg/libgpg-error/libgpg-error-dev_1.17-3_arm64.deb
-main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_arm64.deb
-main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_arm64.deb
-main/libn/libnss-db/libnss-db_2.2.3pre1-5_arm64.deb
-main/libp/libp11/libp11-2_0.2.8-5_arm64.deb
-main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_arm64.deb
-main/libp/libpng/libpng12-dev_1.2.50-2+deb8u3_arm64.deb
-main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_arm64.deb
-main/libs/libselinux/libselinux1_2.3-2_arm64.deb
-main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u2_arm64.deb
-main/libt/libthai/libthai0_0.1.21-1_arm64.deb
-main/libx/libx11/libx11-6_1.6.2-3_arm64.deb
-main/libx/libx11/libx11-dev_1.6.2-3_arm64.deb
-main/libx/libx11/libx11-xcb1_1.6.2-3_arm64.deb
-main/libx/libx11/libx11-xcb-dev_1.6.2-3_arm64.deb
-main/libx/libxau/libxau6_1.0.8-1_arm64.deb
-main/libx/libxau/libxau-dev_1.0.8-1_arm64.deb
-main/libx/libxcb/libxcb1_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb1-dev_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-glx0_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-present0_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-render0_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-shm0_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_arm64.deb
-main/libx/libxcb/libxcb-sync1_1.10-3+b1_arm64.deb
-main/libx/libxcomposite/libxcomposite1_0.4.4-1_arm64.deb
-main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_arm64.deb
-main/libx/libxcursor/libxcursor1_1.1.14-1+b1_arm64.deb
-main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_arm64.deb
-main/libx/libxdamage/libxdamage1_1.1.4-2+b1_arm64.deb
-main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_arm64.deb
-main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_arm64.deb
-main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_arm64.deb
-main/libx/libxext/libxext6_1.3.3-1_arm64.deb
-main/libx/libxext/libxext-dev_1.3.3-1_arm64.deb
-main/libx/libxfixes/libxfixes3_5.0.1-2+b2_arm64.deb
-main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_arm64.deb
-main/libx/libxi/libxi6_1.7.4-1+b2_arm64.deb
-main/libx/libxi/libxi-dev_1.7.4-1+b2_arm64.deb
-main/libx/libxinerama/libxinerama1_1.1.3-1+b1_arm64.deb
-main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_arm64.deb
-main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_arm64.deb
-main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_arm64.deb
-main/libx/libxrandr/libxrandr2_1.4.2-1+b1_arm64.deb
-main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_arm64.deb
-main/libx/libxrender/libxrender1_0.9.8-1+b1_arm64.deb
-main/libx/libxrender/libxrender-dev_0.9.8-1+b1_arm64.deb
-main/libx/libxshmfence/libxshmfence1_1.1-4_arm64.deb
-main/libx/libxss/libxss1_1.2.2-1_arm64.deb
-main/libx/libxss/libxss-dev_1.2.2-1_arm64.deb
-main/libx/libxt/libxt6_1.1.4-1+b1_arm64.deb
-main/libx/libxt/libxt-dev_1.1.4-1+b1_arm64.deb
-main/libx/libxtst/libxtst6_1.2.2-1+b1_arm64.deb
-main/libx/libxtst/libxtst-dev_1.2.2-1+b1_arm64.deb
-main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_arm64.deb
-main/l/linux/linux-libc-dev_3.16.7-ckt25-2_arm64.deb
-main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_arm64.deb
-main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_arm64.deb
-main/m/mesa/libgbm1_10.3.2-1+deb8u1_arm64.deb
-main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_arm64.deb
-main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_arm64.deb
-main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_arm64.deb
-main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_arm64.deb
-main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_arm64.deb
-main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_arm64.deb
-main/n/nettle/libhogweed2_2.7.1-5+deb8u2_arm64.deb
-main/n/nettle/libnettle4_2.7.1-5+deb8u2_arm64.deb
-main/n/nspr/libnspr4_4.12-1+debu8u1_arm64.deb
-main/n/nspr/libnspr4-dev_4.12-1+debu8u1_arm64.deb
-main/n/nss/libnss3_3.26-1+debu8u1_arm64.deb
-main/n/nss/libnss3-dev_3.26-1+debu8u1_arm64.deb
-main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u5_arm64.deb
-main/o/openssl/libssl-dev_1.0.1t-1+deb8u5_arm64.deb
-main/o/orbit2/liborbit2_2.14.19-0.3_arm64.deb
-main/p/p11-kit/libp11-kit0_0.20.7-1_arm64.deb
-main/p/pam/libpam0g_1.1.8-3.1+deb8u2_arm64.deb
-main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_arm64.deb
-main/p/pango1.0/libpango-1.0-0_1.36.8-3_arm64.deb
-main/p/pango1.0/libpango1.0-dev_1.36.8-3_arm64.deb
-main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_arm64.deb
-main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_arm64.deb
-main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_arm64.deb
-main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_arm64.deb
-main/p/pciutils/libpci3_3.2.1-3_arm64.deb
-main/p/pciutils/libpci-dev_3.2.1-3_arm64.deb
-main/p/pcre3/libpcre3_8.35-3.3+deb8u4_arm64.deb
-main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_arm64.deb
-main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_arm64.deb
-main/p/pixman/libpixman-1-0_0.32.6-3_arm64.deb
-main/p/pixman/libpixman-1-dev_0.32.6-3_arm64.deb
-main/p/pulseaudio/libpulse0_5.0-13_arm64.deb
-main/p/pulseaudio/libpulse-dev_5.0-13_arm64.deb
-main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_arm64.deb
-main/s/speech-dispatcher/libspeechd2_0.8-7_arm64.deb
-main/s/speech-dispatcher/libspeechd-dev_0.8-7_arm64.deb
-main/s/speech-dispatcher/speech-dispatcher_0.8-7_arm64.deb
-main/s/systemd/libudev1_215-17+deb8u6_arm64.deb
-main/s/systemd/libudev-dev_215-17+deb8u6_arm64.deb
-main/w/wayland/libwayland-client0_1.6.0-2_arm64.deb
-main/w/wayland/libwayland-cursor0_1.6.0-2_arm64.deb
-main/w/wayland/libwayland-dev_1.6.0-2_arm64.deb
-main/w/wayland/libwayland-server0_1.6.0-2_arm64.deb
-main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
-main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
-main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
-main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
-main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
-main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
-main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
-main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
-main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
-main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
-main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
-main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
-main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_arm64.deb
-main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.0.28-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.0.28-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.14.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.14.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.4-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.6.31-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.6.31-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.23-2+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.23-2+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.2~20141018-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.2~20141018-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.102-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.159-4.2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.159-4.2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libatomic1_4.9.2-10_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgcc1_4.9.2-10_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgomp1_4.9.2-10_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libitm1_4.9.2-10_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libstdc++6_4.9.2-10_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-4_3.2.6-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf-2-4_3.2.6-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-dev_3.2.6-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gmp/libgmp10_6.0.0+dfsg-6_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_0.9.35-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-5+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.24-8_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.24-8_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdatrie/libdatrie1_0.2.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.58-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.58-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.58-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.58-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.1-2+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.1-2+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error0_1.17-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.17-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libp11/libp11-2_0.2.8-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.3-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libt/libthai/libthai0_0.1.21-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.2-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.2-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.2-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.2-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.10-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.14-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage1_1.1.4-2+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext6_1.3.3-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext-dev_1.3.3-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes3_5.0.1-2+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.4-1+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.4-1+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.4.2-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.8-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.8-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.1-4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.4-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.4-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.2-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.2-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_3.16.7-ckt25-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nettle/libhogweed2_2.7.1-5+deb8u2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nettle/libnettle4_2.7.1-5+deb8u2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-0.3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.20.7-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.1+deb8u2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.36.8-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.36.8-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.2.1-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.2.1-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3_8.35-3.3+deb8u4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.32.6-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.32.6-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_5.0-13_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_5.0-13_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_215-17+deb8u7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_215-17+deb8u7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.6.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.6.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.6.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.6.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_arm64.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2_1.7.5-11+deb8u1_arm64.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2-dev_1.7.5-11+deb8u1_arm64.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1_2.1.0-6+deb8u3_arm64.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_arm64.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_arm64.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_arm64.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6_2.5.2-3+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_arm64.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_arm64.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6_2.19-18+deb8u3_arm64.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6-dev_2.19-18+deb8u3_arm64.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/g/graphite2/libgraphite2-3_1.3.6-1~deb8u1_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-dev_1.2.50-2+deb8u2_arm64.deb
+http://security.debian.org/pool/updates/main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u3_arm64.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4_4.12-1+debu8u1_arm64.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4-dev_4.12-1+debu8u1_arm64.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3_3.26-1+debu8u1_arm64.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3-dev_3.26-1+debu8u1_arm64.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_arm64.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl-dev_1.0.1t-1+deb8u6_arm64.deb
diff --git a/chromium/build/linux/sysroot_scripts/packagelist.jessie.i386 b/chromium/build/linux/sysroot_scripts/packagelist.jessie.i386
index 23a167b5b44..a093261ff2f 100644
--- a/chromium/build/linux/sysroot_scripts/packagelist.jessie.i386
+++ b/chromium/build/linux/sysroot_scripts/packagelist.jessie.i386
@@ -1,208 +1,208 @@
-main/a/alsa-lib/libasound2_1.0.28-1_i386.deb
-main/a/alsa-lib/libasound2-dev_1.0.28-1_i386.deb
-main/a/atk1.0/libatk1.0-0_2.14.0-1_i386.deb
-main/a/atk1.0/libatk1.0-dev_2.14.0-1_i386.deb
-main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_i386.deb
-main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_i386.deb
-main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_i386.deb
-main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_i386.deb
-main/a/attr/libattr1_2.4.47-2_i386.deb
-main/a/audit/libaudit1_2.4-1+b1_i386.deb
-main/a/avahi/libavahi-client3_0.6.31-5_i386.deb
-main/a/avahi/libavahi-common3_0.6.31-5_i386.deb
-main/b/bluez/libbluetooth3_5.23-2+b1_i386.deb
-main/b/bluez/libbluetooth-dev_5.23-2+b1_i386.deb
-main/b/brltty/libbrlapi0.6_5.2~20141018-5_i386.deb
-main/b/brltty/libbrlapi-dev_5.2~20141018-5_i386.deb
-main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_i386.deb
-main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_i386.deb
-main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_i386.deb
-main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_i386.deb
-main/c/cups/libcups2_1.7.5-11+deb8u1_i386.deb
-main/c/cups/libcups2-dev_1.7.5-11+deb8u1_i386.deb
-main/d/dbus-glib/libdbus-glib-1-2_0.102-1_i386.deb
-main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_i386.deb
-main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_i386.deb
-main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_i386.deb
-main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_i386.deb
-main/e/elfutils/libelf1_0.159-4.2_i386.deb
-main/e/elfutils/libelf-dev_0.159-4.2_i386.deb
-main/e/expat/libexpat1_2.1.0-6+deb8u3_i386.deb
-main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_i386.deb
-main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_i386.deb
-main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_i386.deb
-main/f/freetype/libfreetype6_2.5.2-3+deb8u1_i386.deb
-main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u1_i386.deb
-main/g/gcc-4.8/libasan0_4.8.4-1_i386.deb
-main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_i386.deb
-main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_i386.deb
-main/g/gcc-4.9/libatomic1_4.9.2-10_i386.deb
-main/g/gcc-4.9/libcilkrts5_4.9.2-10_i386.deb
-main/g/gcc-4.9/libgcc1_4.9.2-10_i386.deb
-main/g/gcc-4.9/libgomp1_4.9.2-10_i386.deb
-main/g/gcc-4.9/libitm1_4.9.2-10_i386.deb
-main/g/gcc-4.9/libquadmath0_4.9.2-10_i386.deb
-main/g/gcc-4.9/libstdc++6_4.9.2-10_i386.deb
-main/g/gcc-4.9/libubsan0_4.9.2-10_i386.deb
-main/g/gconf/libgconf-2-4_3.2.6-3_i386.deb
-main/g/gconf/libgconf2-4_3.2.6-3_i386.deb
-main/g/gconf/libgconf2-dev_3.2.6-3_i386.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_i386.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_i386.deb
-main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_i386.deb
-main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_i386.deb
-main/g/glibc/libc6_2.19-18+deb8u7_i386.deb
-main/g/glibc/libc6-dev_2.19-18+deb8u7_i386.deb
-main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u4_i386.deb
-main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u4_i386.deb
-main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u4_i386.deb
-main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u4_i386.deb
-main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_i386.deb
-main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_i386.deb
-main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_i386.deb
-main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_i386.deb
-main/h/harfbuzz/libharfbuzz0b_0.9.35-2_i386.deb
-main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_i386.deb
-main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_i386.deb
-main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_i386.deb
-main/k/keyutils/libkeyutils1_1.5.9-5+b1_i386.deb
-main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_i386.deb
-main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_i386.deb
-main/libc/libcap2/libcap2_2.24-8_i386.deb
-main/libc/libcap2/libcap-dev_2.24-8_i386.deb
-main/libd/libdrm/libdrm2_2.4.58-2_i386.deb
-main/libd/libdrm/libdrm-dev_2.4.58-2_i386.deb
-main/libd/libdrm/libdrm-intel1_2.4.58-2_i386.deb
-main/libd/libdrm/libdrm-nouveau2_2.4.58-2_i386.deb
-main/libd/libdrm/libdrm-radeon1_2.4.58-2_i386.deb
-main/libf/libffi/libffi6_3.1-2+b2_i386.deb
-main/libf/libffi/libffi-dev_3.1-2+b2_i386.deb
-main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_i386.deb
-main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_i386.deb
-main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_i386.deb
-main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_i386.deb
-main/libg/libgpg-error/libgpg-error0_1.17-3_i386.deb
-main/libg/libgpg-error/libgpg-error-dev_1.17-3_i386.deb
-main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_i386.deb
-main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_i386.deb
-main/libn/libnss-db/libnss-db_2.2.3pre1-5+b3_i386.deb
-main/libp/libp11/libp11-2_0.2.8-5_i386.deb
-main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_i386.deb
-main/libp/libpng/libpng12-dev_1.2.50-2+deb8u3_i386.deb
-main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_i386.deb
-main/libs/libselinux/libselinux1_2.3-2_i386.deb
-main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u2_i386.deb
-main/libx/libx11/libx11-6_1.6.2-3_i386.deb
-main/libx/libx11/libx11-dev_1.6.2-3_i386.deb
-main/libx/libx11/libx11-xcb1_1.6.2-3_i386.deb
-main/libx/libx11/libx11-xcb-dev_1.6.2-3_i386.deb
-main/libx/libxau/libxau6_1.0.8-1_i386.deb
-main/libx/libxau/libxau-dev_1.0.8-1_i386.deb
-main/libx/libxcb/libxcb1_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb1-dev_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-glx0_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-present0_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-render0_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-shm0_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_i386.deb
-main/libx/libxcb/libxcb-sync1_1.10-3+b1_i386.deb
-main/libx/libxcomposite/libxcomposite1_0.4.4-1_i386.deb
-main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_i386.deb
-main/libx/libxcursor/libxcursor1_1.1.14-1+b1_i386.deb
-main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_i386.deb
-main/libx/libxdamage/libxdamage1_1.1.4-2+b1_i386.deb
-main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_i386.deb
-main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_i386.deb
-main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_i386.deb
-main/libx/libxext/libxext6_1.3.3-1_i386.deb
-main/libx/libxext/libxext-dev_1.3.3-1_i386.deb
-main/libx/libxfixes/libxfixes3_5.0.1-2+b2_i386.deb
-main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_i386.deb
-main/libx/libxi/libxi6_1.7.4-1+b2_i386.deb
-main/libx/libxi/libxi-dev_1.7.4-1+b2_i386.deb
-main/libx/libxinerama/libxinerama1_1.1.3-1+b1_i386.deb
-main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_i386.deb
-main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_i386.deb
-main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_i386.deb
-main/libx/libxrandr/libxrandr2_1.4.2-1+b1_i386.deb
-main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_i386.deb
-main/libx/libxrender/libxrender1_0.9.8-1+b1_i386.deb
-main/libx/libxrender/libxrender-dev_0.9.8-1+b1_i386.deb
-main/libx/libxshmfence/libxshmfence1_1.1-4_i386.deb
-main/libx/libxss/libxss1_1.2.2-1_i386.deb
-main/libx/libxss/libxss-dev_1.2.2-1_i386.deb
-main/libx/libxt/libxt6_1.1.4-1+b1_i386.deb
-main/libx/libxt/libxt-dev_1.1.4-1+b1_i386.deb
-main/libx/libxtst/libxtst6_1.2.2-1+b1_i386.deb
-main/libx/libxtst/libxtst-dev_1.2.2-1+b1_i386.deb
-main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_i386.deb
-main/l/linux/linux-libc-dev_3.16.7-ckt25-2_i386.deb
-main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_i386.deb
-main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_i386.deb
-main/m/mesa/libgbm1_10.3.2-1+deb8u1_i386.deb
-main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_i386.deb
-main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_i386.deb
-main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_i386.deb
-main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_i386.deb
-main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_i386.deb
-main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_i386.deb
-main/n/nspr/libnspr4_4.12-1+debu8u1_i386.deb
-main/n/nspr/libnspr4-dev_4.12-1+debu8u1_i386.deb
-main/n/nss/libnss3_3.26-1+debu8u1_i386.deb
-main/n/nss/libnss3-dev_3.26-1+debu8u1_i386.deb
-main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u5_i386.deb
-main/o/openssl/libssl-dev_1.0.1t-1+deb8u5_i386.deb
-main/o/orbit2/liborbit2_2.14.19-0.3_i386.deb
-main/p/p11-kit/libp11-kit0_0.20.7-1_i386.deb
-main/p/pam/libpam0g_1.1.8-3.1+deb8u2_i386.deb
-main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_i386.deb
-main/p/pango1.0/libpango-1.0-0_1.36.8-3_i386.deb
-main/p/pango1.0/libpango1.0-dev_1.36.8-3_i386.deb
-main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_i386.deb
-main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_i386.deb
-main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_i386.deb
-main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_i386.deb
-main/p/pciutils/libpci3_3.2.1-3_i386.deb
-main/p/pciutils/libpci-dev_3.2.1-3_i386.deb
-main/p/pcre3/libpcre3_8.35-3.3+deb8u4_i386.deb
-main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_i386.deb
-main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_i386.deb
-main/p/pixman/libpixman-1-0_0.32.6-3_i386.deb
-main/p/pixman/libpixman-1-dev_0.32.6-3_i386.deb
-main/p/pulseaudio/libpulse0_5.0-13_i386.deb
-main/p/pulseaudio/libpulse-dev_5.0-13_i386.deb
-main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_i386.deb
-main/s/speech-dispatcher/libspeechd2_0.8-7_i386.deb
-main/s/speech-dispatcher/libspeechd-dev_0.8-7_i386.deb
-main/s/speech-dispatcher/speech-dispatcher_0.8-7_i386.deb
-main/s/systemd/libudev1_215-17+deb8u6_i386.deb
-main/s/systemd/libudev-dev_215-17+deb8u6_i386.deb
-main/w/wayland/libwayland-client0_1.6.0-2_i386.deb
-main/w/wayland/libwayland-cursor0_1.6.0-2_i386.deb
-main/w/wayland/libwayland-dev_1.6.0-2_i386.deb
-main/w/wayland/libwayland-server0_1.6.0-2_i386.deb
-main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
-main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
-main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
-main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
-main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
-main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
-main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
-main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
-main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
-main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
-main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
-main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
-main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_i386.deb
-main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.0.28-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.0.28-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.14.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.14.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.4-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.6.31-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.6.31-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.23-2+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.23-2+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.2~20141018-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.2~20141018-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.102-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.159-4.2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.159-4.2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libasan0_4.8.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libatomic1_4.9.2-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libcilkrts5_4.9.2-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgcc1_4.9.2-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgomp1_4.9.2-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libitm1_4.9.2-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libquadmath0_4.9.2-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libstdc++6_4.9.2-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libubsan0_4.9.2-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf-2-4_3.2.6-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-4_3.2.6-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-dev_3.2.6-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_0.9.35-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-5+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.24-8_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.24-8_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.58-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.58-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-intel1_2.4.58-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.58-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.58-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.1-2+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.1-2+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error0_1.17-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.17-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-5+b3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libp11/libp11-2_0.2.8-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.3-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.2-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.2-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.2-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.2-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.10-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.14-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage1_1.1.4-2+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext6_1.3.3-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext-dev_1.3.3-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes3_5.0.1-2+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.4-1+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.4-1+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.4.2-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.8-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.8-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.1-4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.4-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.4-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.2-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.2-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_3.16.7-ckt25-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-0.3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.20.7-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.1+deb8u2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.36.8-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.36.8-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.2.1-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.2.1-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3_8.35-3.3+deb8u4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.32.6-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.32.6-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_5.0-13_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_5.0-13_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_215-17+deb8u7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_215-17+deb8u7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.6.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.6.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.6.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.6.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_i386.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2_1.7.5-11+deb8u1_i386.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2-dev_1.7.5-11+deb8u1_i386.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1_2.1.0-6+deb8u3_i386.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_i386.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_i386.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_i386.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6_2.5.2-3+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_i386.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_i386.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6_2.19-18+deb8u3_i386.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6-dev_2.19-18+deb8u3_i386.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-dev_1.2.50-2+deb8u2_i386.deb
+http://security.debian.org/pool/updates/main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u3_i386.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4_4.12-1+debu8u1_i386.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4-dev_4.12-1+debu8u1_i386.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3_3.26-1+debu8u1_i386.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3-dev_3.26-1+debu8u1_i386.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_i386.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl-dev_1.0.1t-1+deb8u6_i386.deb
diff --git a/chromium/build/linux/sysroot_scripts/packagelist.jessie.mipsel b/chromium/build/linux/sysroot_scripts/packagelist.jessie.mipsel
index 2b169dff142..6bff00e8a74 100644
--- a/chromium/build/linux/sysroot_scripts/packagelist.jessie.mipsel
+++ b/chromium/build/linux/sysroot_scripts/packagelist.jessie.mipsel
@@ -1,202 +1,202 @@
-main/a/alsa-lib/libasound2_1.0.28-1_mipsel.deb
-main/a/alsa-lib/libasound2-dev_1.0.28-1_mipsel.deb
-main/a/atk1.0/libatk1.0-0_2.14.0-1_mipsel.deb
-main/a/atk1.0/libatk1.0-dev_2.14.0-1_mipsel.deb
-main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_mipsel.deb
-main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_mipsel.deb
-main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_mipsel.deb
-main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_mipsel.deb
-main/a/attr/libattr1_2.4.47-2_mipsel.deb
-main/a/audit/libaudit1_2.4-1+b1_mipsel.deb
-main/a/avahi/libavahi-client3_0.6.31-5_mipsel.deb
-main/a/avahi/libavahi-common3_0.6.31-5_mipsel.deb
-main/b/bluez/libbluetooth3_5.23-2+b1_mipsel.deb
-main/b/bluez/libbluetooth-dev_5.23-2+b1_mipsel.deb
-main/b/brltty/libbrlapi0.6_5.2~20141018-5_mipsel.deb
-main/b/brltty/libbrlapi-dev_5.2~20141018-5_mipsel.deb
-main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_mipsel.deb
-main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_mipsel.deb
-main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_mipsel.deb
-main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_mipsel.deb
-main/c/cups/libcups2_1.7.5-11+deb8u1_mipsel.deb
-main/c/cups/libcups2-dev_1.7.5-11+deb8u1_mipsel.deb
-main/d/dbus-glib/libdbus-glib-1-2_0.102-1_mipsel.deb
-main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_mipsel.deb
-main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_mipsel.deb
-main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_mipsel.deb
-main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_mipsel.deb
-main/e/elfutils/libelf1_0.159-4.2_mipsel.deb
-main/e/elfutils/libelf-dev_0.159-4.2_mipsel.deb
-main/e/expat/libexpat1_2.1.0-6+deb8u3_mipsel.deb
-main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_mipsel.deb
-main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_mipsel.deb
-main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_mipsel.deb
-main/f/freetype/libfreetype6_2.5.2-3+deb8u1_mipsel.deb
-main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u1_mipsel.deb
-main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_mipsel.deb
-main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_mipsel.deb
-main/g/gcc-4.9/libatomic1_4.9.2-10_mipsel.deb
-main/g/gcc-4.9/libgcc1_4.9.2-10_mipsel.deb
-main/g/gcc-4.9/libgomp1_4.9.2-10_mipsel.deb
-main/g/gcc-4.9/libstdc++6_4.9.2-10_mipsel.deb
-main/g/gconf/libgconf2-4_3.2.6-3_mipsel.deb
-main/g/gconf/libgconf-2-4_3.2.6-3_mipsel.deb
-main/g/gconf/libgconf2-dev_3.2.6-3_mipsel.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_mipsel.deb
-main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_mipsel.deb
-main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_mipsel.deb
-main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_mipsel.deb
-main/g/glibc/libc6_2.19-18+deb8u7_mipsel.deb
-main/g/glibc/libc6-dev_2.19-18+deb8u7_mipsel.deb
-main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u4_mipsel.deb
-main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u4_mipsel.deb
-main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u4_mipsel.deb
-main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u4_mipsel.deb
-main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_mipsel.deb
-main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_mipsel.deb
-main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_mipsel.deb
-main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_mipsel.deb
-main/h/harfbuzz/libharfbuzz0b_0.9.35-2_mipsel.deb
-main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_mipsel.deb
-main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_mipsel.deb
-main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_mipsel.deb
-main/k/keyutils/libkeyutils1_1.5.9-5+b1_mipsel.deb
-main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_mipsel.deb
-main/libc/libcap2/libcap2_2.24-8_mipsel.deb
-main/libc/libcap2/libcap-dev_2.24-8_mipsel.deb
-main/libd/libdrm/libdrm2_2.4.58-2_mipsel.deb
-main/libd/libdrm/libdrm-dev_2.4.58-2_mipsel.deb
-main/libd/libdrm/libdrm-nouveau2_2.4.58-2_mipsel.deb
-main/libd/libdrm/libdrm-radeon1_2.4.58-2_mipsel.deb
-main/libf/libffi/libffi6_3.1-2+b2_mipsel.deb
-main/libf/libffi/libffi-dev_3.1-2+b2_mipsel.deb
-main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_mipsel.deb
-main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_mipsel.deb
-main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_mipsel.deb
-main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_mipsel.deb
-main/libg/libgpg-error/libgpg-error0_1.17-3_mipsel.deb
-main/libg/libgpg-error/libgpg-error-dev_1.17-3_mipsel.deb
-main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_mipsel.deb
-main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_mipsel.deb
-main/libn/libnss-db/libnss-db_2.2.3pre1-5+b3_mipsel.deb
-main/libp/libp11/libp11-2_0.2.8-5_mipsel.deb
-main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_mipsel.deb
-main/libp/libpng/libpng12-dev_1.2.50-2+deb8u3_mipsel.deb
-main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_mipsel.deb
-main/libs/libselinux/libselinux1_2.3-2_mipsel.deb
-main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u2_mipsel.deb
-main/libx/libx11/libx11-6_1.6.2-3_mipsel.deb
-main/libx/libx11/libx11-dev_1.6.2-3_mipsel.deb
-main/libx/libx11/libx11-xcb1_1.6.2-3_mipsel.deb
-main/libx/libx11/libx11-xcb-dev_1.6.2-3_mipsel.deb
-main/libx/libxau/libxau6_1.0.8-1_mipsel.deb
-main/libx/libxau/libxau-dev_1.0.8-1_mipsel.deb
-main/libx/libxcb/libxcb1_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb1-dev_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-glx0_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-present0_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-render0_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-shm0_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_mipsel.deb
-main/libx/libxcb/libxcb-sync1_1.10-3+b1_mipsel.deb
-main/libx/libxcomposite/libxcomposite1_0.4.4-1_mipsel.deb
-main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_mipsel.deb
-main/libx/libxcursor/libxcursor1_1.1.14-1+b1_mipsel.deb
-main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_mipsel.deb
-main/libx/libxdamage/libxdamage1_1.1.4-2+b1_mipsel.deb
-main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_mipsel.deb
-main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_mipsel.deb
-main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_mipsel.deb
-main/libx/libxext/libxext6_1.3.3-1_mipsel.deb
-main/libx/libxext/libxext-dev_1.3.3-1_mipsel.deb
-main/libx/libxfixes/libxfixes3_5.0.1-2+b2_mipsel.deb
-main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_mipsel.deb
-main/libx/libxi/libxi6_1.7.4-1+b2_mipsel.deb
-main/libx/libxi/libxi-dev_1.7.4-1+b2_mipsel.deb
-main/libx/libxinerama/libxinerama1_1.1.3-1+b1_mipsel.deb
-main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_mipsel.deb
-main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_mipsel.deb
-main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_mipsel.deb
-main/libx/libxrandr/libxrandr2_1.4.2-1+b1_mipsel.deb
-main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_mipsel.deb
-main/libx/libxrender/libxrender1_0.9.8-1+b1_mipsel.deb
-main/libx/libxrender/libxrender-dev_0.9.8-1+b1_mipsel.deb
-main/libx/libxshmfence/libxshmfence1_1.1-4_mipsel.deb
-main/libx/libxss/libxss1_1.2.2-1_mipsel.deb
-main/libx/libxss/libxss-dev_1.2.2-1_mipsel.deb
-main/libx/libxt/libxt6_1.1.4-1+b1_mipsel.deb
-main/libx/libxt/libxt-dev_1.1.4-1+b1_mipsel.deb
-main/libx/libxtst/libxtst6_1.2.2-1+b1_mipsel.deb
-main/libx/libxtst/libxtst-dev_1.2.2-1+b1_mipsel.deb
-main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_mipsel.deb
-main/l/linux/linux-libc-dev_3.16.7-ckt25-2_mipsel.deb
-main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_mipsel.deb
-main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_mipsel.deb
-main/m/mesa/libgbm1_10.3.2-1+deb8u1_mipsel.deb
-main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_mipsel.deb
-main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_mipsel.deb
-main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_mipsel.deb
-main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_mipsel.deb
-main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_mipsel.deb
-main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_mipsel.deb
-main/n/nspr/libnspr4_4.12-1+debu8u1_mipsel.deb
-main/n/nspr/libnspr4-dev_4.12-1+debu8u1_mipsel.deb
-main/n/nss/libnss3_3.26-1+debu8u1_mipsel.deb
-main/n/nss/libnss3-dev_3.26-1+debu8u1_mipsel.deb
-main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u5_mipsel.deb
-main/o/openssl/libssl-dev_1.0.1t-1+deb8u5_mipsel.deb
-main/o/orbit2/liborbit2_2.14.19-0.3_mipsel.deb
-main/p/p11-kit/libp11-kit0_0.20.7-1_mipsel.deb
-main/p/pam/libpam0g_1.1.8-3.1+deb8u2_mipsel.deb
-main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_mipsel.deb
-main/p/pango1.0/libpango-1.0-0_1.36.8-3_mipsel.deb
-main/p/pango1.0/libpango1.0-dev_1.36.8-3_mipsel.deb
-main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_mipsel.deb
-main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_mipsel.deb
-main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_mipsel.deb
-main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_mipsel.deb
-main/p/pciutils/libpci3_3.2.1-3_mipsel.deb
-main/p/pciutils/libpci-dev_3.2.1-3_mipsel.deb
-main/p/pcre3/libpcre3_8.35-3.3+deb8u4_mipsel.deb
-main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_mipsel.deb
-main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_mipsel.deb
-main/p/pixman/libpixman-1-0_0.32.6-3_mipsel.deb
-main/p/pixman/libpixman-1-dev_0.32.6-3_mipsel.deb
-main/p/pulseaudio/libpulse0_5.0-13_mipsel.deb
-main/p/pulseaudio/libpulse-dev_5.0-13_mipsel.deb
-main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_mipsel.deb
-main/s/speech-dispatcher/libspeechd2_0.8-7_mipsel.deb
-main/s/speech-dispatcher/libspeechd-dev_0.8-7_mipsel.deb
-main/s/speech-dispatcher/speech-dispatcher_0.8-7_mipsel.deb
-main/s/systemd/libudev1_215-17+deb8u6_mipsel.deb
-main/s/systemd/libudev-dev_215-17+deb8u6_mipsel.deb
-main/w/wayland/libwayland-client0_1.6.0-2_mipsel.deb
-main/w/wayland/libwayland-cursor0_1.6.0-2_mipsel.deb
-main/w/wayland/libwayland-dev_1.6.0-2_mipsel.deb
-main/w/wayland/libwayland-server0_1.6.0-2_mipsel.deb
-main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
-main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
-main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
-main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
-main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
-main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
-main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
-main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
-main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
-main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
-main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
-main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
-main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_mipsel.deb
-main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.0.28-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.0.28-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.14.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.14.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.14.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.14.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.14.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.14.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.4-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.6.31-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.6.31-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.23-2+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.23-2+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.2~20141018-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.2~20141018-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.14.0-2.1+deb8u2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.14.0-2.1+deb8u2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.14.0-2.1+deb8u2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.14.0-2.1+deb8u2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.102-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.8.22-0+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.8.22-0+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.42.12-2+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcomerr2_1.42.12-2+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.159-4.2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.159-4.2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libgcc-4.8-dev_4.8.4-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.8/libstdc++-4.8-dev_4.8.4-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libatomic1_4.9.2-10_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgcc1_4.9.2-10_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libgomp1_4.9.2-10_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-4.9/libstdc++6_4.9.2-10_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-4_3.2.6-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf-2-4_3.2.6-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gconf/libgconf2-dev_3.2.6-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.42.1-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.42.1-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.25-3+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.25-3+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.14.5-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.14.5-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_0.9.35-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_0.9.35-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_0.9.35-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_0.9.35-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-5+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.24-8_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.24-8_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.58-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.58-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.58-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.58-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.1-2+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.1-2+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring0_3.12.0-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgnome-keyring/libgnome-keyring-dev_3.12.0-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error0_1.17-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.17-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp0_0.6.0~rc2-3.1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp-dev_0.6.0~rc2-3.1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-5+b3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libp11/libp11-2_0.2.8-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.3-4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.3-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.2-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.2-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.2-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.2-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.10-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.14-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor-dev_1.1.14-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage1_1.1.4-2+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdamage/libxdamage-dev_1.1.4-2+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp6_1.1.1-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.1-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext6_1.3.3-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxext/libxext-dev_1.3.3-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes3_5.0.1-2+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.1-2+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.4-1+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.4-1+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.4.3-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.4.3-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.4.2-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr-dev_1.4.2-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender1_0.9.8-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxrender/libxrender-dev_0.9.8-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.1-4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.4-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.4-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.2-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.2-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.3-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_3.16.7-ckt25-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_10.3.2-1+deb8u1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-0.3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.20.7-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.1+deb8u2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.1+deb8u2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.36.8-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.36.8-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.36.8-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.36.8-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.36.8-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.2.1-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.2.1-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3_8.35-3.3+deb8u4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcre3-dev_8.35-3.3+deb8u4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pcre3/libpcrecpp0_8.35-3.3+deb8u4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.32.6-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.32.6-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_5.0-13_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_5.0-13_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_5.0-13_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_215-17+deb8u7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_215-17+deb8u7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.6.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.6.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.6.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.6.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-composite/x11proto-composite-dev_0.4.2-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-core/x11proto-core-dev_7.0.26-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-damage/x11proto-damage-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-fixes/x11proto-fixes-dev_5.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-input/x11proto-input-dev_2.3.1-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-kb/x11proto-kb-dev_1.0.6-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-randr/x11proto-randr-dev_1.4.0-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-record/x11proto-record-dev_1.14.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-render/x11proto-render-dev_0.11.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-scrnsaver/x11proto-scrnsaver-dev_1.2.2-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xext/x11proto-xext-dev_7.3.0-1_all.deb
+http://ftp.us.debian.org/debian/pool/main/x/x11proto-xinerama/x11proto-xinerama-dev_1.2.1-2_all.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g_1.2.8.dfsg-2+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/z/zlib/zlib1g-dev_1.2.8.dfsg-2+b1_mipsel.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2_1.7.5-11+deb8u1_mipsel.deb
+http://security.debian.org/pool/updates/main/c/cups/libcups2-dev_1.7.5-11+deb8u1_mipsel.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1_2.1.0-6+deb8u3_mipsel.deb
+http://security.debian.org/pool/updates/main/e/expat/libexpat1-dev_2.1.0-6+deb8u3_mipsel.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_mipsel.deb
+http://security.debian.org/pool/updates/main/f/fontconfig/libfontconfig1-dev_2.11.0-6.3+deb8u1_mipsel.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6_2.5.2-3+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/f/freetype/libfreetype6-dev_2.5.2-3+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.31.1-2+deb8u5_mipsel.deb
+http://security.debian.org/pool/updates/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.31.1-2+deb8u5_mipsel.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6_2.19-18+deb8u3_mipsel.deb
+http://security.debian.org/pool/updates/main/g/glibc/libc6-dev_2.19-18+deb8u3_mipsel.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls28-dev_3.3.8-6+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-deb0-28_3.3.8-6+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutls-openssl27_3.3.8-6+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/g/gnutls28/libgnutlsxx28_3.3.8-6+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/krb5-multidev_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssapi-krb5-2_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libgssrpc4_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libk5crypto3_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5clnt-mit9_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkadm5srv-mit9_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkdb5-7_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-3_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5-dev_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/k/krb5/libkrb5support0_1.12.1+dfsg-19+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20_1.6.3-2+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/libg/libgcrypt20/libgcrypt20-dev_1.6.3-2+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/libp/libpng/libpng12-dev_1.2.50-2+deb8u2_mipsel.deb
+http://security.debian.org/pool/updates/main/libt/libtasn1-6/libtasn1-6_4.2-3+deb8u3_mipsel.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4_4.12-1+debu8u1_mipsel.deb
+http://security.debian.org/pool/updates/main/n/nspr/libnspr4-dev_4.12-1+debu8u1_mipsel.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3_3.26-1+debu8u1_mipsel.deb
+http://security.debian.org/pool/updates/main/n/nss/libnss3-dev_3.26-1+debu8u1_mipsel.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_mipsel.deb
+http://security.debian.org/pool/updates/main/o/openssl/libssl-dev_1.0.1t-1+deb8u6_mipsel.deb
diff --git a/chromium/build/linux/sysroot_scripts/sysroot-creator-jessie.sh b/chromium/build/linux/sysroot_scripts/sysroot-creator-jessie.sh
index b757bfb20d6..8b668dc7141 100755
--- a/chromium/build/linux/sysroot_scripts/sysroot-creator-jessie.sh
+++ b/chromium/build/linux/sysroot_scripts/sysroot-creator-jessie.sh
@@ -7,13 +7,14 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
DISTRO=debian
DIST=jessie
-DIST_UPDATES=jessie-updates
-PACKAGES_EXT=xz
+APT_SOURCES_LIST="\
+http://ftp.us.debian.org/debian/ jessie main
+http://security.debian.org/ jessie/updates main
+http://ftp.us.debian.org/debian/ jessie-updates main"
-APT_REPO=http://http.us.debian.org/debian
# gpg keyring file generated using:
-# export KEYS="518E17E1 46925553 2B90D010"
+# export KEYS="518E17E1 46925553 2B90D010 C857C906"
# gpg --recv-keys $KEYS
# gpg --output ./debian-archive-jessie-stable.gpg --export $KEYS
KEYRING_FILE="${SCRIPT_DIR}/debian-archive-jessie-stable.gpg"
diff --git a/chromium/build/linux/sysroot_scripts/sysroot-creator.sh b/chromium/build/linux/sysroot_scripts/sysroot-creator.sh
index 899bec486a3..59ddaa2fd20 100644
--- a/chromium/build/linux/sysroot_scripts/sysroot-creator.sh
+++ b/chromium/build/linux/sysroot_scripts/sysroot-creator.sh
@@ -7,10 +7,9 @@
# to define certain environment variables: e.g.
# DISTRO=ubuntu
# DIST=jessie
-# DIST_UPDATES=jessie-updates # optional
-# REPO_EXTRA="universe restricted multiverse" # optional
-# APT_REPO=http://archive.ubuntu.com/ubuntu
-# KEYRING_FILE=/usr/share/keyrings/ubuntu-archive-keyring.gpg
+# # Similar in syntax to /etc/apt/sources.list
+# APT_SOURCES_LIST="http://ftp.us.debian.org/debian/ jessie main"
+# KEYRING_FILE=debian-archive-jessie-stable.gpg
# DEBIAN_PACKAGES="gcc libz libssl"
#@ This script builds Debian/Ubuntu sysroot images for building Google Chrome.
@@ -35,11 +34,6 @@ if [ -z "${DIST:-}" ]; then
exit 1
fi
-if [ -z "${APT_REPO:-}" ]; then
- echo "error: APT_REPO not defined"
- exit 1
-fi
-
if [ -z "${KEYRING_FILE:-}" ]; then
echo "error: KEYRING_FILE not defined"
exit 1
@@ -56,13 +50,13 @@ readonly HAS_ARCH_ARM=${HAS_ARCH_ARM:=0}
readonly HAS_ARCH_ARM64=${HAS_ARCH_ARM64:=0}
readonly HAS_ARCH_MIPS=${HAS_ARCH_MIPS:=0}
-readonly REQUIRED_TOOLS="wget"
+readonly REQUIRED_TOOLS="curl gunzip"
######################################################################
# Package Config
######################################################################
-PACKAGES_EXT=${PACKAGES_EXT:-bz2}
+readonly PACKAGES_EXT=gz
readonly RELEASE_FILE="Release"
readonly RELEASE_FILE_GPG="Release.gpg"
@@ -107,7 +101,9 @@ DownloadOrCopy() {
SubBanner "downloading from $1 -> $2"
# Appending the "$$" shell pid is necessary here to prevent concurrent
# instances of sysroot-creator.sh from trying to write to the same file.
- wget "$1" -O "${2}.partial.$$"
+ # --create-dirs is added in case there are slashes in the filename, as can
+ # happen with the "debian/security" release class.
+ curl "$1" --create-dirs -o "${2}.partial.$$"
mv "${2}.partial.$$" $2
else
SubBanner "copying from $1"
@@ -159,7 +155,7 @@ SanityCheck() {
# This is where the staging sysroot is.
INSTALL_ROOT="${BUILD_DIR}/${DIST}_${ARCH_LOWER}_staging"
- TARBALL="${BUILD_DIR}/${DISTRO}_${DIST}_${ARCH_LOWER}_sysroot.tgz"
+ TARBALL="${BUILD_DIR}/${DISTRO}_${DIST}_${ARCH_LOWER}_sysroot.tar.xz"
if ! mkdir -p "${INSTALL_ROOT}" ; then
echo "ERROR: ${INSTALL_ROOT} can't be created."
@@ -182,78 +178,75 @@ ClearInstallDir() {
CreateTarBall() {
Banner "Creating tarball ${TARBALL}"
- tar zcf ${TARBALL} -C ${INSTALL_ROOT} .
+ tar Jcf ${TARBALL} -C ${INSTALL_ROOT} .
}
-ExtractPackageBz2() {
- if [ "${PACKAGES_EXT}" = "bz2" ]; then
- bzcat "$1" | egrep '^(Package:|Filename:|SHA256:) ' > "$2"
- else
- xzcat "$1" | egrep '^(Package:|Filename:|SHA256:) ' > "$2"
- fi
+ExtractPackageGz() {
+ local src_file="$1"
+ local dst_file="$2"
+ local repo="$3"
+ gunzip -c "${src_file}" | egrep '^(Package:|Filename:|SHA256:) ' |
+ sed "s|Filename: |Filename: ${repo}|" > "${dst_file}"
}
GeneratePackageListDist() {
local arch="$1"
- local apt_url="$2"
- local dist="$3"
- local repo_name="$4"
+ set -- $2
+ local repo="$1"
+ local dist="$2"
+ local repo_name="$3"
TMP_PACKAGE_LIST="${BUILD_DIR}/Packages.${dist}_${repo_name}_${arch}"
- local repo_basedir="${apt_url}/dists/${dist}"
+ local repo_basedir="${repo}/dists/${dist}"
local package_list="${BUILD_DIR}/Packages.${dist}_${repo_name}_${arch}.${PACKAGES_EXT}"
local package_file_arch="${repo_name}/binary-${arch}/Packages.${PACKAGES_EXT}"
local package_list_arch="${repo_basedir}/${package_file_arch}"
DownloadOrCopy "${package_list_arch}" "${package_list}"
- VerifyPackageListing "${package_file_arch}" "${package_list}" ${dist}
- ExtractPackageBz2 "${package_list}" "${TMP_PACKAGE_LIST}"
+ VerifyPackageListing "${package_file_arch}" "${package_list}" ${repo} ${dist}
+ ExtractPackageGz "${package_list}" "${TMP_PACKAGE_LIST}" ${repo}
}
GeneratePackageListCommon() {
local output_file="$1"
local arch="$2"
- local apt_url="$3"
- local packages="$4"
+ local packages="$3"
local dists="${DIST} ${DIST_UPDATES:-}"
local repos="main ${REPO_EXTRA:-}"
local list_base="${BUILD_DIR}/Packages.${DIST}_${arch}"
- > "${list_base}"
- for dist in ${dists}; do
- for repo in ${repos}; do
- GeneratePackageListDist "${arch}" "${apt_url}" "${dist}" "${repo}"
- cat "${TMP_PACKAGE_LIST}" | ./merge-package-lists.py "${list_base}"
- done
+ > "${list_base}" # Create (or truncate) a zero-length file.
+ echo "${APT_SOURCES_LIST}" | while read source; do
+ GeneratePackageListDist "${arch}" "${source}"
+ cat "${TMP_PACKAGE_LIST}" | ./merge-package-lists.py "${list_base}"
done
GeneratePackageList "${list_base}" "${output_file}" "${packages}"
}
GeneratePackageListAmd64() {
- GeneratePackageListCommon "$1" amd64 ${APT_REPO} "${DEBIAN_PACKAGES}
+ GeneratePackageListCommon "$1" amd64 "${DEBIAN_PACKAGES}
${DEBIAN_PACKAGES_X86:=} ${DEBIAN_PACKAGES_AMD64:=}"
}
GeneratePackageListI386() {
- GeneratePackageListCommon "$1" i386 ${APT_REPO} "${DEBIAN_PACKAGES}
+ GeneratePackageListCommon "$1" i386 "${DEBIAN_PACKAGES}
${DEBIAN_PACKAGES_X86:=}"
}
GeneratePackageListARM() {
- GeneratePackageListCommon "$1" armhf ${APT_REPO_ARM:-${APT_REPO}} \
- "${DEBIAN_PACKAGES} ${DEBIAN_PACKAGES_ARM:=}"
+ GeneratePackageListCommon "$1" armhf "${DEBIAN_PACKAGES}
+ ${DEBIAN_PACKAGES_ARM:=}"
}
GeneratePackageListARM64() {
- GeneratePackageListCommon "$1" arm64 ${APT_REPO_ARM64:-${APT_REPO}} \
- "${DEBIAN_PACKAGES} ${DEBIAN_PACKAGES_ARM64:=}"
+ GeneratePackageListCommon "$1" arm64 "${DEBIAN_PACKAGES}
+ ${DEBIAN_PACKAGES_ARM64:=}"
}
GeneratePackageListMips() {
- GeneratePackageListCommon "$1" mipsel ${APT_REPO_MIPS:-${APT_REPO}} \
- "${DEBIAN_PACKAGES}"
+ GeneratePackageListCommon "$1" mipsel "${DEBIAN_PACKAGES}"
}
StripChecksumsFromPackageList() {
@@ -395,8 +388,8 @@ InstallIntoSysroot() {
exit 1
fi
- Banner "Installing ${file}"
- DownloadOrCopy ${APT_REPO}/pool/${file} ${package}
+ Banner "Installing $(basename ${file})"
+ DownloadOrCopy ${file} ${package}
if [ ! -s "${package}" ] ; then
echo
echo "ERROR: bad package ${package}"
@@ -435,7 +428,7 @@ CleanupJailSymlinks() {
echo "${target}" | grep -qs ^/ || continue
echo "${link}: ${target}"
case "${link}" in
- usr/lib/gcc/*-linux-gnu/4.*/* | usr/lib/gcc/arm-linux-gnueabihf/4.*/* |\
+ usr/lib/gcc/*-linux-gnu/4.*/* | usr/lib/gcc/arm-linux-gnueabihf/4.*/* | \
usr/lib/gcc/aarch64-linux-gnu/4.*/*)
# Relativize the symlink.
ln -snfv "../../../../..${target}" "${link}"
@@ -520,7 +513,6 @@ BuildSysrootARM() {
local files_and_sha256sums="$(cat ${package_file})"
StripChecksumsFromPackageList "$package_file"
VerifyPackageFilesMatch "$package_file" "$DEBIAN_DEP_LIST_ARM"
- APT_REPO=${APT_REPO_ARM:=$APT_REPO}
InstallIntoSysroot ${files_and_sha256sums}
CleanupJailSymlinks
HacksAndPatchesARM
@@ -541,7 +533,6 @@ BuildSysrootARM64() {
local files_and_sha256sums="$(cat ${package_file})"
StripChecksumsFromPackageList "$package_file"
VerifyPackageFilesMatch "$package_file" "$DEBIAN_DEP_LIST_ARM64"
- APT_REPO=${APT_REPO_ARM64:=$APT_REPO}
InstallIntoSysroot ${files_and_sha256sums}
CleanupJailSymlinks
HacksAndPatchesARM64
@@ -563,7 +554,6 @@ BuildSysrootMips() {
local files_and_sha256sums="$(cat ${package_file})"
StripChecksumsFromPackageList "$package_file"
VerifyPackageFilesMatch "$package_file" "$DEBIAN_DEP_LIST_MIPS"
- APT_REPO=${APT_REPO_MIPS:=$APT_REPO}
InstallIntoSysroot ${files_and_sha256sums}
CleanupJailSymlinks
HacksAndPatchesMips
@@ -677,9 +667,10 @@ CheckForDebianGPGKeyring() {
VerifyPackageListing() {
local file_path="$1"
local output_file="$2"
- local dist="$3"
+ local repo="$3"
+ local dist="$4"
- local repo_basedir="${APT_REPO}/dists/${dist}"
+ local repo_basedir="${repo}/dists/${dist}"
local release_list="${repo_basedir}/${RELEASE_FILE}"
local release_list_gpg="${repo_basedir}/${RELEASE_FILE_GPG}"
@@ -722,19 +713,18 @@ GeneratePackageList() {
shift
for pkg in $@ ; do
local pkg_full=$(grep -A 1 " ${pkg}\$" "$input_file" | \
- egrep -o "pool/.*")
+ egrep "pool/.*" | sed 's/.*Filename: //')
if [ -z "${pkg_full}" ]; then
echo "ERROR: missing package: $pkg"
exit 1
fi
- local pkg_nopool=$(echo "$pkg_full" | sed "s/^pool\///")
local sha256sum=$(grep -A 4 " ${pkg}\$" "$input_file" | \
grep ^SHA256: | sed 's/^SHA256: //')
if [ "${#sha256sum}" -ne "64" ]; then
echo "Bad sha256sum from Packages"
exit 1
fi
- echo $pkg_nopool $sha256sum >> "$output_file"
+ echo $pkg_full $sha256sum >> "$output_file"
done
# sort -o does an in-place sort of this file
sort "$output_file" -o "$output_file"
diff --git a/chromium/build/linux/sysroot_scripts/sysroots.json b/chromium/build/linux/sysroot_scripts/sysroots.json
index e05f5823b11..8bdc8121422 100644
--- a/chromium/build/linux/sysroot_scripts/sysroots.json
+++ b/chromium/build/linux/sysroot_scripts/sysroots.json
@@ -1,31 +1,31 @@
{
"jessie_amd64": {
- "Revision": "501a18940d0a78a40306050946032cbf8f14e7c0",
- "Sha1Sum": "71260b24e1712844fd5a7c559c5d7b3ccae798a8",
+ "Revision": "ebb50a1c59e577567470b00582f81ed14222353e",
+ "Sha1Sum": "6df0d3f81752547694cafba80f7353189287428f",
"SysrootDir": "debian_jessie_amd64-sysroot",
"Tarball": "debian_jessie_amd64_sysroot.tgz"
},
"jessie_arm": {
- "Revision": "501a18940d0a78a40306050946032cbf8f14e7c0",
- "Sha1Sum": "b1922853e41276d83a4b78ba6772d059d473fb86",
+ "Revision": "ebb50a1c59e577567470b00582f81ed14222353e",
+ "Sha1Sum": "fd0bf9053f11cccd631629f93d4c448ca28a1d85",
"SysrootDir": "debian_jessie_arm-sysroot",
"Tarball": "debian_jessie_arm_sysroot.tgz"
},
"jessie_arm64": {
- "Revision": "501a18940d0a78a40306050946032cbf8f14e7c0",
- "Sha1Sum": "c81e39777cdf32e6cc7a8d8ad7fc8de4ecf003af",
+ "Revision": "ebb50a1c59e577567470b00582f81ed14222353e",
+ "Sha1Sum": "ba54db4a00cb8bc8165ee86cfc3f141a64c822e7",
"SysrootDir": "debian_jessie_arm64-sysroot",
"Tarball": "debian_jessie_arm64_sysroot.tgz"
},
"jessie_i386": {
- "Revision": "501a18940d0a78a40306050946032cbf8f14e7c0",
- "Sha1Sum": "9019e050869dff49e91618b7bfea8de6c82a8b94",
+ "Revision": "ebb50a1c59e577567470b00582f81ed14222353e",
+ "Sha1Sum": "70e26036a0f38509bb632a2db92e09d773a8edc6",
"SysrootDir": "debian_jessie_i386-sysroot",
"Tarball": "debian_jessie_i386_sysroot.tgz"
},
"jessie_mips": {
- "Revision": "501a18940d0a78a40306050946032cbf8f14e7c0",
- "Sha1Sum": "79f2c9fd33caf8c5c90a4621a80c379c747a8f7e",
+ "Revision": "ebb50a1c59e577567470b00582f81ed14222353e",
+ "Sha1Sum": "6a64a448a3412b00a6fed39d9641e3aea45456ca",
"SysrootDir": "debian_jessie_mips-sysroot",
"Tarball": "debian_jessie_mips_sysroot.tgz"
}
diff --git a/chromium/build/linux/unbundle/icu.gn b/chromium/build/linux/unbundle/icu.gn
index f3734b7a01a..d830b3eeb5e 100644
--- a/chromium/build/linux/unbundle/icu.gn
+++ b/chromium/build/linux/unbundle/icu.gn
@@ -50,10 +50,9 @@ source_set("icuuc") {
shim_headers("icui18n_shim") {
root_path = "source/i18n"
headers = [
- # This list can easily be updated using the command below:
- # find third_party/icu/source/i18n/unicode \
- # -iname '*.h' -printf '"%p",\n' | \
- # sed -e 's|third_party/icu/i18n/common/||' | sort -u
+ # This list can easily be updated using the commands below:
+ # cd third_party/icu/source/i18n
+ # find unicode -iname '*.h' -printf ' "%p",\n' | LC_ALL=C sort -u
"unicode/alphaindex.h",
"unicode/basictz.h",
"unicode/calendar.h",
@@ -78,7 +77,6 @@ shim_headers("icui18n_shim") {
"unicode/fpositer.h",
"unicode/gender.h",
"unicode/gregocal.h",
- "unicode/locdspnm.h",
"unicode/measfmt.h",
"unicode/measunit.h",
"unicode/measure.h",
@@ -113,15 +111,12 @@ shim_headers("icui18n_shim") {
"unicode/ucol.h",
"unicode/ucoleitr.h",
"unicode/ucsdet.h",
- "unicode/ucurr.h",
"unicode/udat.h",
"unicode/udateintervalformat.h",
"unicode/udatpg.h",
- "unicode/udisplaycontext.h",
"unicode/ufieldpositer.h",
"unicode/uformattable.h",
"unicode/ugender.h",
- "unicode/uldnames.h",
"unicode/ulocdata.h",
"unicode/umsg.h",
"unicode/unirepl.h",
@@ -130,6 +125,7 @@ shim_headers("icui18n_shim") {
"unicode/upluralrules.h",
"unicode/uregex.h",
"unicode/uregion.h",
+ "unicode/ureldatefmt.h",
"unicode/usearch.h",
"unicode/uspoof.h",
"unicode/utmscale.h",
@@ -141,20 +137,22 @@ shim_headers("icui18n_shim") {
shim_headers("icuuc_shim") {
root_path = "source/common"
headers = [
- # This list can easily be updated using the command below:
- # find third_party/icu/source/common/unicode \
- # -iname '*.h' -printf '"%p",\n' | \
- # sed -e 's|third_party/icu/source/common/||' | sort -u
+ # This list can easily be updated using the commands below:
+ # cd third_party/icu/source/common
+ # find unicode -iname '*.h' -printf ' "%p",\n' | LC_ALL=C sort -u
"unicode/appendable.h",
"unicode/brkiter.h",
"unicode/bytestream.h",
"unicode/bytestrie.h",
"unicode/bytestriebuilder.h",
"unicode/caniter.h",
+ "unicode/casemap.h",
+ "unicode/char16ptr.h",
"unicode/chariter.h",
"unicode/dbbi.h",
"unicode/docmain.h",
"unicode/dtintrv.h",
+ "unicode/edits.h",
"unicode/enumset.h",
"unicode/errorcode.h",
"unicode/filteredbrk.h",
@@ -163,6 +161,7 @@ shim_headers("icuuc_shim") {
"unicode/idna.h",
"unicode/listformatter.h",
"unicode/localpointer.h",
+ "unicode/locdspnm.h",
"unicode/locid.h",
"unicode/messagepattern.h",
"unicode/normalizer2.h",
@@ -176,12 +175,14 @@ shim_headers("icuuc_shim") {
"unicode/rep.h",
"unicode/resbund.h",
"unicode/schriter.h",
+ "unicode/simpleformatter.h",
"unicode/std_string.h",
"unicode/strenum.h",
"unicode/stringpiece.h",
"unicode/stringtriebuilder.h",
"unicode/symtable.h",
"unicode/ubidi.h",
+ "unicode/ubiditransform.h",
"unicode/ubrk.h",
"unicode/ucasemap.h",
"unicode/ucat.h",
@@ -195,10 +196,13 @@ shim_headers("icuuc_shim") {
"unicode/ucnv_err.h",
"unicode/ucnvsel.h",
"unicode/uconfig.h",
+ "unicode/ucurr.h",
"unicode/udata.h",
+ "unicode/udisplaycontext.h",
"unicode/uenum.h",
"unicode/uidna.h",
"unicode/uiter.h",
+ "unicode/uldnames.h",
"unicode/ulistformatter.h",
"unicode/uloc.h",
"unicode/umachine.h",
diff --git a/chromium/build/mac/should_use_hermetic_xcode.py b/chromium/build/mac/should_use_hermetic_xcode.py
index 68e288e32f7..dc1b930eb0d 100755
--- a/chromium/build/mac/should_use_hermetic_xcode.py
+++ b/chromium/build/mac/should_use_hermetic_xcode.py
@@ -3,8 +3,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-"""Prints "1" if Chrome targets should be built with hermetic xcode. Otherwise
-prints "0".
+"""
+Prints "1" if Chrome targets should be built with hermetic Xcode.
+Prints "2" if Chrome targets should be built with hermetic Xcode, but the OS
+version does not meet the minimum requirements of the hermetic version of Xcode.
+Otherwise prints "0".
Usage:
python should_use_hermetic_xcode.py <target_os>
@@ -13,6 +16,12 @@ Usage:
import os
import sys
+_THIS_DIR_PATH = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
+_BUILD_PATH = os.path.join(_THIS_DIR_PATH, os.pardir)
+sys.path.insert(0, _BUILD_PATH)
+
+import mac_toolchain
+
def _IsCorpMachine():
return os.path.isdir('/Library/GoogleCorpSupport/')
@@ -21,6 +30,8 @@ def _IsCorpMachine():
def main():
allow_corp = sys.argv[1] == 'mac' and _IsCorpMachine()
if os.environ.get('FORCE_MAC_TOOLCHAIN') or allow_corp:
+ if not mac_toolchain.PlatformMeetsHermeticXcodeRequirements(sys.argv[1]):
+ return "2"
return "1"
else:
return "0"
diff --git a/chromium/build/mac_toolchain.py b/chromium/build/mac_toolchain.py
index 123e5e0d3c0..534f9d1982b 100755
--- a/chromium/build/mac_toolchain.py
+++ b/chromium/build/mac_toolchain.py
@@ -14,6 +14,7 @@ date:
"""
import os
+import platform
import plistlib
import shutil
import subprocess
@@ -24,10 +25,14 @@ import tempfile
import urllib2
# This can be changed after running /build/package_mac_toolchain.py.
-MAC_TOOLCHAIN_VERSION = '5B1008'
+MAC_TOOLCHAIN_VERSION = '8E2002'
MAC_TOOLCHAIN_SUB_REVISION = 3
MAC_TOOLCHAIN_VERSION = '%s-%s' % (MAC_TOOLCHAIN_VERSION,
MAC_TOOLCHAIN_SUB_REVISION)
+# The toolchain will not be downloaded if the minimum OS version is not met.
+# 16 is the major version number for macOS 10.12.
+MAC_MINIMUM_OS_VERSION = 16
+
IOS_TOOLCHAIN_VERSION = '8C1002'
IOS_TOOLCHAIN_SUB_REVISION = 1
IOS_TOOLCHAIN_VERSION = '%s-%s' % (IOS_TOOLCHAIN_VERSION,
@@ -44,6 +49,13 @@ TOOLCHAIN_BUILD_DIR = os.path.join(BASE_DIR, '%s_files', 'Xcode.app')
STAMP_FILE = os.path.join(BASE_DIR, '%s_files', 'toolchain_build_revision')
TOOLCHAIN_URL = 'gs://chrome-mac-sdk/'
+
+def PlatformMeetsHermeticXcodeRequirements(target_os):
+ if target_os == 'ios':
+ return True
+ return int(platform.release().split('.')[0]) >= MAC_MINIMUM_OS_VERSION
+
+
def GetPlatforms():
default_target_os = ["mac"]
try:
@@ -232,6 +244,10 @@ def main():
return 0
for target_os in GetPlatforms():
+ if not PlatformMeetsHermeticXcodeRequirements(target_os):
+ print 'OS version does not support toolchain.'
+ continue
+
if target_os == 'ios':
default_version = IOS_TOOLCHAIN_VERSION
toolchain_filename = 'ios-toolchain-%s.tgz'
diff --git a/chromium/build/package_mac_toolchain.py b/chromium/build/package_mac_toolchain.py
index ecdc4d73d81..48672bb49a2 100755
--- a/chromium/build/package_mac_toolchain.py
+++ b/chromium/build/package_mac_toolchain.py
@@ -41,7 +41,6 @@ DEFAULT_EXCLUDE_FOLDERS = [
'Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift',
'Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator',
'Contents/Resources/Packages/MobileDevice.pkg',
-'Contents/SharedFrameworks/DNTDocumentationSupport.framework'
]
MAC_EXCLUDE_FOLDERS = [
diff --git a/chromium/build/sanitizers/sanitizer_options.cc b/chromium/build/sanitizers/sanitizer_options.cc
index 1f4250111ec..e7e427981f9 100644
--- a/chromium/build/sanitizers/sanitizer_options.cc
+++ b/chromium/build/sanitizers/sanitizer_options.cc
@@ -82,24 +82,16 @@ const char *kAsanDefaultOptions =
"check_printf=1 use_sigaltstack=1 "
"strip_path_prefix=/../../ fast_unwind_on_fatal=1 "
"detect_stack_use_after_return=1 detect_odr_violation=0 ";
-static const char kNaClDefaultOptions[] = "handle_segv=0";
-static const char kNaClFlag[] = "--type=nacl-loader";
#endif // OS_LINUX
#if defined(OS_LINUX) || defined(OS_MACOSX)
+// Allow NaCl to override the default asan options.
+extern const char* kAsanDefaultOptionsNaCl;
+__attribute__((weak)) const char* kAsanDefaultOptionsNaCl = nullptr;
+
SANITIZER_HOOK_ATTRIBUTE const char *__asan_default_options() {
-#if defined(OS_MACOSX)
- char*** argvp = _NSGetArgv();
- int* argcp = _NSGetArgc();
- if (!argvp || !argcp) return kAsanDefaultOptions;
- char** argv = *argvp;
- int argc = *argcp;
- for (int i = 0; i < argc; ++i) {
- if (strcmp(argv[i], kNaClFlag) == 0) {
- return kNaClDefaultOptions;
- }
- }
-#endif
+ if (kAsanDefaultOptionsNaCl)
+ return kAsanDefaultOptionsNaCl;
return kAsanDefaultOptions;
}
diff --git a/chromium/build/sanitizers/tsan_suppressions.cc b/chromium/build/sanitizers/tsan_suppressions.cc
index e357a9ef0dd..182b8c21177 100644
--- a/chromium/build/sanitizers/tsan_suppressions.cc
+++ b/chromium/build/sanitizers/tsan_suppressions.cc
@@ -245,6 +245,8 @@ char kTSanDefaultSuppressions[] =
// http://crbug.com/587199
"race:base::TimerTest_OneShotTimer_CustomTaskRunner_Test::TestBody\n"
+ "race:base::TimerSequenceTest_OneShotTimerTaskOnPoolThread_Test::TestBody\n"
+ "race:base::TimerSequenceTest_OneShotTimerUsedAndTaskedOnDifferentPools\n"
// http://crbug.com/v8/6065
"race:net::(anonymous namespace)::ProxyResolverV8TracingImpl::RequestImpl"
@@ -260,6 +262,9 @@ char kTSanDefaultSuppressions[] =
"race:base::i18n::IsRTL\n"
"race:base::i18n::SetICUDefaultLocale\n"
+ //
+ "race:third_party/harfbuzz-ng/src/*\n"
+
// End of suppressions.
; // Please keep this semicolon.
diff --git a/chromium/build/secondary/third_party/catapult/devil/BUILD.gn b/chromium/build/secondary/third_party/catapult/devil/BUILD.gn
new file mode 100644
index 00000000000..50e6050cbb6
--- /dev/null
+++ b/chromium/build/secondary/third_party/catapult/devil/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright 2017 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.
+
+import("//testing/android/empty_apk/empty_apk.gni")
+
+empty_apk("empty_system_webview_apk") {
+ package_name = "com.android.webview"
+ apk_name = "EmptySystemWebView"
+}
+
+group("devil") {
+ testonly = true
+ deps = [
+ ":empty_system_webview_apk",
+ "//tools/android/forwarder2",
+ "//tools/android/md5sum",
+ ]
+}
diff --git a/chromium/build/secondary/third_party/libjpeg_turbo/BUILD.gn b/chromium/build/secondary/third_party/libjpeg_turbo/BUILD.gn
index 941c825d279..265d30b076c 100644
--- a/chromium/build/secondary/third_party/libjpeg_turbo/BUILD.gn
+++ b/chromium/build/secondary/third_party/libjpeg_turbo/BUILD.gn
@@ -86,7 +86,6 @@ if (current_cpu == "x86" || current_cpu == "x64") {
if (is_win) {
defines += [ "MSVC" ]
- include_dirs = [ "win" ]
if (current_cpu == "x86") {
defines += [ "WIN32" ]
} else {
@@ -94,10 +93,8 @@ if (current_cpu == "x86" || current_cpu == "x64") {
}
} else if (is_mac || is_ios) {
defines += [ "MACHO" ]
- include_dirs = [ "mac" ]
- } else if (is_linux || is_android) {
+ } else if (is_linux || is_android || is_fuchsia) {
defines += [ "ELF" ]
- include_dirs = [ "linux" ]
}
}
}
diff --git a/chromium/build/toolchain/gcc_toolchain.gni b/chromium/build/toolchain/gcc_toolchain.gni
index d7286635a3d..60aee313af4 100644
--- a/chromium/build/toolchain/gcc_toolchain.gni
+++ b/chromium/build/toolchain/gcc_toolchain.gni
@@ -387,7 +387,8 @@ template("gcc_toolchain") {
# This needs a Python script to avoid using a complex shell command
# requiring sh control structures, pipelines, and POSIX utilities.
# The host might not have a POSIX shell and utilities (e.g. Windows).
- solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py")
+ solink_wrapper =
+ rebase_path("//build/toolchain/gcc_solink_wrapper.py", root_build_dir)
command = "$python_path \"$solink_wrapper\" --readelf=\"$readelf\" --nm=\"$nm\" $strip_switch--sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\"$map_switch --output=\"$sofile\"$whitelist_flag -- $link_command"
rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix"
diff --git a/chromium/build/toolchain/linux/BUILD.gn b/chromium/build/toolchain/linux/BUILD.gn
index 5b7689f9f2d..217a0a69a60 100644
--- a/chromium/build/toolchain/linux/BUILD.gn
+++ b/chromium/build/toolchain/linux/BUILD.gn
@@ -83,6 +83,14 @@ clang_toolchain("clang_x86_v8_mipsel") {
}
}
+clang_toolchain("clang_x86_v8_mips") {
+ toolchain_args = {
+ current_cpu = "x86"
+ v8_current_cpu = "mips"
+ current_os = "linux"
+ }
+}
+
gcc_toolchain("x86") {
cc = "gcc"
cxx = "g++"
@@ -128,6 +136,14 @@ clang_toolchain("clang_x64_v8_mips64el") {
}
}
+clang_toolchain("clang_x64_v8_mips64") {
+ toolchain_args = {
+ current_cpu = "x64"
+ v8_current_cpu = "mips64"
+ current_os = "linux"
+ }
+}
+
gcc_toolchain("x64") {
cc = "gcc"
cxx = "g++"
@@ -154,6 +170,14 @@ clang_toolchain("clang_mipsel") {
}
}
+clang_toolchain("clang_mips64el") {
+ toolchain_args = {
+ current_cpu = "mips64el"
+ current_os = "linux"
+ }
+}
+
+
gcc_toolchain("mipsel") {
cc = "mipsel-linux-gnu-gcc"
cxx = "mipsel-linux-gnu-g++"
@@ -171,6 +195,24 @@ gcc_toolchain("mipsel") {
}
}
+gcc_toolchain("mips64el") {
+ cc = "gcc"
+ cxx = "g++"
+ ar = "ar"
+ ld = cxx
+ readelf = "readelf"
+ nm = "nm"
+
+ toolchain_args = {
+ cc_wrapper = ""
+ current_cpu = "mips64el"
+ current_os = "linux"
+ is_clang = false
+ use_goma = false
+ }
+}
+
+
gcc_toolchain("s390x") {
cc = "gcc"
cxx = "g++"
@@ -202,3 +244,35 @@ gcc_toolchain("ppc64") {
is_clang = false
}
}
+
+gcc_toolchain("mips") {
+ cc = "gcc"
+ cxx = "g++"
+
+ readelf = "readelf"
+ nm = "nm"
+ ar = "ar"
+ ld = cxx
+
+ toolchain_args = {
+ current_cpu = "mips"
+ current_os = "linux"
+ is_clang = false
+ }
+}
+
+gcc_toolchain("mips64") {
+ cc = "gcc"
+ cxx = "g++"
+
+ readelf = "readelf"
+ nm = "nm"
+ ar = "ar"
+ ld = cxx
+
+ toolchain_args = {
+ current_cpu = "mips64"
+ current_os = "linux"
+ is_clang = false
+ }
+}
diff --git a/chromium/build/toolchain/mac/BUILD.gn b/chromium/build/toolchain/mac/BUILD.gn
index b417e76a3b0..f89dd0d1cd0 100644
--- a/chromium/build/toolchain/mac/BUILD.gn
+++ b/chromium/build/toolchain/mac/BUILD.gn
@@ -431,14 +431,17 @@ template("mac_toolchain") {
if (is_ios) {
_sdk_name = ios_sdk_name
_min_deployment_target = ios_deployment_target
+ _compress_pngs = ""
} else {
_sdk_name = mac_sdk_name
_min_deployment_target = mac_deployment_target
+ _compress_pngs = " -c "
}
command = "$env_wrapper rm -f {{output}} && " +
"TOOL_VERSION=${tool_versions.compile_xcassets} " +
"python $_tool -p $_sdk_name -t $_min_deployment_target " +
- "-T {{bundle_product_type}} -o {{output}} {{inputs}}"
+ "$_compress_pngs -T {{bundle_product_type}} -o {{output}} " +
+ "{{inputs}}"
description = "COMPILE_XCASSETS {{output}}"
pool = ":bundle_pool($default_toolchain)"
diff --git a/chromium/build/toolchain/mac/compile_xcassets.py b/chromium/build/toolchain/mac/compile_xcassets.py
index ac0742eb56f..6b0f9001c65 100644
--- a/chromium/build/toolchain/mac/compile_xcassets.py
+++ b/chromium/build/toolchain/mac/compile_xcassets.py
@@ -4,12 +4,80 @@
import argparse
import os
+import re
import subprocess
import sys
+"""Wrapper around actool to compile assets catalog.
-def CompileXCAssets(
- output, platform, product_type, min_deployment_target, inputs):
+The script compile_xcassets.py is a wrapper around actool to compile
+assets catalog to Assets.car that turns warning into errors. It also
+fixes some quirks of actool to make it work from ninja (mostly that
+actool seems to require absolute path but gn generates command-line
+with relative paths).
+
+The wrapper filter out any message that is not a section header and
+not a warning or error message, and fails if filtered output is not
+empty. This should to treat all warnings as error until actool has
+an option to fail with non-zero error code when there are warnings.
+"""
+
+# Pattern matching a section header in the output of actool.
+SECTION_HEADER = re.compile('^/\\* ([^ ]*) \\*/$')
+
+# Name of the section containing informational messages that can be ignored.
+NOTICE_SECTION = 'com.apple.actool.compilation-results'
+
+
+def FilterCompilerOutput(compiler_output, relative_paths):
+ """Filers actool compilation output.
+
+ The compiler output is composed of multiple sections for each different
+ level of output (error, warning, notices, ...). Each section starts with
+ the section name on a single line, followed by all the messages from the
+ section.
+
+ The function filter any lines that are not in com.apple.actool.errors or
+ com.apple.actool.document.warnings sections (as spurious messages comes
+ before any section of the output).
+
+ See crbug.com/730054 and crbug.com/739163 for some example messages that
+ pollute the output of actool and cause flaky builds.
+
+ Args:
+ compiler_output: string containing the output generated by the
+ compiler (contains both stdout and stderr)
+ relative_paths: mapping from absolute to relative paths used to
+ convert paths in the warning and error messages (unknown paths
+ will be left unaltered)
+
+ Returns:
+ The filtered output of the compiler. If the compilation was a
+ success, then the output will be empty, otherwise it will use
+ relative path and omit any irrelevant output.
+ """
+
+ filtered_output = []
+ current_section = None
+ for line in compiler_output.splitlines():
+ match = SECTION_HEADER.search(line)
+ if match is not None:
+ current_section = match.group(1)
+ if current_section != NOTICE_SECTION:
+ filtered_output.append(line + '\n')
+ continue
+ if current_section and current_section != NOTICE_SECTION:
+ absolute_path = line.split(':')[0]
+ relative_path = relative_paths.get(absolute_path, absolute_path)
+ if absolute_path != relative_path:
+ line = relative_path + line[len(absolute_path):]
+ filtered_output.append(line + '\n')
+
+ return ''.join(filtered_output)
+
+
+def CompileAssetCatalog(output, platform, product_type, min_deployment_target,
+ inputs, compress_pngs):
"""Compile the .xcassets bundles to an asset catalog using actool.
Args:
@@ -18,14 +86,17 @@ def CompileXCAssets(
product_type: the bundle type
min_deployment_target: minimum deployment target
inputs: list of absolute paths to .xcassets bundles
+ compress_pngs: whether to enable compression of pngs
"""
command = [
'xcrun', 'actool', '--output-format=human-readable-text',
- '--compress-pngs', '--notices', '--warnings', '--errors',
- '--platform', platform, '--minimum-deployment-target',
- min_deployment_target,
+ '--notices', '--warnings', '--errors', '--platform', platform,
+ '--minimum-deployment-target', min_deployment_target,
]
+ if compress_pngs:
+ command.extend(['--compress-pngs'])
+
if product_type != '':
command.extend(['--product-type', product_type])
@@ -34,10 +105,20 @@ def CompileXCAssets(
else:
command.extend(['--target-device', 'iphone', '--target-device', 'ipad'])
+ relative_paths = {}
+
# actool crashes if paths are relative, so convert input and output paths
- # to absolute paths.
+ # to absolute paths, and record the relative paths to fix them back when
+ # filtering the output.
+ absolute_output = os.path.abspath(output)
+ relative_paths[output] = absolute_output
+ relative_paths[os.path.dirname(output)] = os.path.dirname(absolute_output)
command.extend(['--compile', os.path.dirname(os.path.abspath(output))])
- command.extend(map(os.path.abspath, inputs))
+
+ for relative_path in inputs:
+ absolute_path = os.path.abspath(relative_path)
+ relative_paths[absolute_path] = relative_path
+ command.append(absolute_path)
# Run actool and redirect stdout and stderr to the same pipe (as actool
# is confused about what should go to stderr/stdout).
@@ -45,23 +126,10 @@ def CompileXCAssets(
command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout, _ = process.communicate()
- if process.returncode:
- sys.stderr.write(stdout)
- sys.exit(process.returncode)
-
- # In case of success, the output looks like the following:
- # /* com.apple.actool.compilation-results */
- # /Full/Path/To/Bundle.app/Assets.car
- #
- # Ignore any lines in the output matching those (last line is an empty line)
- # and consider that the build failed if the output contains any other lines.
- for line in stdout.splitlines():
- if not line:
- continue
- if line == '/* com.apple.actool.compilation-results */':
- continue
- if line == os.path.abspath(output):
- continue
+ # Filter the output to remove all garbarge and to fix the paths.
+ stdout = FilterCompilerOutput(stdout, relative_paths)
+
+ if process.returncode or stdout:
sys.stderr.write(stdout)
sys.exit(1)
@@ -80,6 +148,9 @@ def Main():
'--output', '-o', required=True,
help='path to the compiled assets catalog')
parser.add_argument(
+ '--compress-pngs', '-c', action='store_true', default=False,
+ help='recompress PNGs while compiling assets catalog')
+ parser.add_argument(
'--product-type', '-T',
help='type of the containing bundle')
parser.add_argument(
@@ -93,12 +164,13 @@ def Main():
'to the containing bundle: %s\n' % (args.output,))
sys.exit(1)
- CompileXCAssets(
+ CompileAssetCatalog(
args.output,
args.platform,
args.product_type,
args.minimum_deployment_target,
- args.inputs)
+ args.inputs,
+ args.compress_pngs)
if __name__ == '__main__':
diff --git a/chromium/build/toolchain/mac/compile_xcassets_unittests.py b/chromium/build/toolchain/mac/compile_xcassets_unittests.py
new file mode 100644
index 00000000000..6fa41ab0167
--- /dev/null
+++ b/chromium/build/toolchain/mac/compile_xcassets_unittests.py
@@ -0,0 +1,126 @@
+# Copyright 2017 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.
+
+import unittest
+import compile_xcassets
+
+
+class TestFilterCompilerOutput(unittest.TestCase):
+
+ relative_paths = {
+ '/Users/janedoe/chromium/src/Chromium.xcassets':
+ '../../Chromium.xcassets',
+ '/Users/janedoe/chromium/src/out/Default/Chromium.app/Assets.car':
+ 'Chromium.app/Assets.car',
+ }
+
+ def testNoError(self):
+ self.assertEquals(
+ '',
+ compile_xcassets.FilterCompilerOutput(
+ '/* com.apple.actool.compilation-results */\n'
+ '/Users/janedoe/chromium/src/out/Default/Chromium.app/Assets.car\n',
+ self.relative_paths))
+
+ def testNoErrorRandomMessages(self):
+ self.assertEquals(
+ '',
+ compile_xcassets.FilterCompilerOutput(
+ '2017-07-04 04:59:19.460 ibtoold[23487:41214] CoreSimulator is att'
+ 'empting to unload a stale CoreSimulatorService job. Existing'
+ ' job (com.apple.CoreSimulator.CoreSimulatorService.179.1.E8tt'
+ 'yeDeVgWK) is from an older version and is being removed to pr'
+ 'event problems.\n'
+ '/* com.apple.actool.compilation-results */\n'
+ '/Users/janedoe/chromium/src/out/Default/Chromium.app/Assets.car\n',
+ self.relative_paths))
+
+ def testWarning(self):
+ self.assertEquals(
+ '/* com.apple.actool.document.warnings */\n'
+ '../../Chromium.xcassets:./image1.imageset/[universal][][][1x][][][]['
+ '][][]: warning: The file "image1.png" for the image set "image1"'
+ ' does not exist.\n',
+ compile_xcassets.FilterCompilerOutput(
+ '/* com.apple.actool.document.warnings */\n'
+ '/Users/janedoe/chromium/src/Chromium.xcassets:./image1.imageset/['
+ 'universal][][][1x][][][][][][]: warning: The file "image1.png'
+ '" for the image set "image1" does not exist.\n'
+ '/* com.apple.actool.compilation-results */\n'
+ '/Users/janedoe/chromium/src/out/Default/Chromium.app/Assets.car\n',
+ self.relative_paths))
+
+ def testError(self):
+ self.assertEquals(
+ '/* com.apple.actool.errors */\n'
+ '../../Chromium.xcassets: error: The output directory "/Users/janedoe/'
+ 'chromium/src/out/Default/Chromium.app" does not exist.\n',
+ compile_xcassets.FilterCompilerOutput(
+ '/* com.apple.actool.errors */\n'
+ '/Users/janedoe/chromium/src/Chromium.xcassets: error: The output '
+ 'directory "/Users/janedoe/chromium/src/out/Default/Chromium.a'
+ 'pp" does not exist.\n'
+ '/* com.apple.actool.compilation-results */\n',
+ self.relative_paths))
+
+ def testComplexError(self):
+ self.assertEquals(
+ '/* com.apple.actool.errors */\n'
+ ': error: Failed to find a suitable device for the type SimDeviceType '
+ ': com.apple.dt.Xcode.IBSimDeviceType.iPad-2x with runtime SimRunt'
+ 'ime : 10.3.1 (14E8301) - com.apple.CoreSimulator.SimRuntime.iOS-1'
+ '0-3\n'
+ ' Failure Reason: Failed to create SimDeviceSet at path /Users/jane'
+ 'doe/Library/Developer/Xcode/UserData/IB Support/Simulator Devices'
+ '. You\'ll want to check the logs in ~/Library/Logs/CoreSimulator '
+ 'to see why creating the SimDeviceSet failed.\n'
+ ' Underlying Errors:\n'
+ ' Description: Failed to initialize simulator device set.\n'
+ ' Failure Reason: Failed to subscribe to notifications from Cor'
+ 'eSimulatorService.\n'
+ ' Underlying Errors:\n'
+ ' Description: Error returned in reply to notification requ'
+ 'est: Connection invalid\n'
+ ' Failure Reason: Software caused connection abort\n',
+ compile_xcassets.FilterCompilerOutput(
+ '2017-07-07 10:37:27.367 ibtoold[88538:12553239] CoreSimulator det'
+ 'ected Xcode.app relocation or CoreSimulatorService version ch'
+ 'ange. Framework path (/Applications/Xcode.app/Contents/Devel'
+ 'oper/Library/PrivateFrameworks/CoreSimulator.framework) and v'
+ 'ersion (375.21) does not match existing job path (/Library/De'
+ 'veloper/PrivateFrameworks/CoreSimulator.framework/Versions/A/'
+ 'XPCServices/com.apple.CoreSimulator.CoreSimulatorService.xpc)'
+ ' and version (459.13). Attempting to remove the stale servic'
+ 'e in order to add the expected version.\n'
+ '2017-07-07 10:37:27.625 ibtoold[88538:12553256] CoreSimulatorServ'
+ 'ice connection interrupted. Resubscribing to notifications.\n'
+ '2017-07-07 10:37:27.632 ibtoold[88538:12553264] CoreSimulatorServ'
+ 'ice connection became invalid. Simulator services will no lo'
+ 'nger be available.\n'
+ '2017-07-07 10:37:27.642 ibtoold[88538:12553274] CoreSimulatorServ'
+ 'ice connection became invalid. Simulator services will no lo'
+ 'nger be available.\n'
+ '/* com.apple.actool.errors */\n'
+ ': error: Failed to find a suitable device for the type SimDeviceT'
+ 'ype : com.apple.dt.Xcode.IBSimDeviceType.iPad-2x with runtime'
+ ' SimRuntime : 10.3.1 (14E8301) - com.apple.CoreSimulator.SimR'
+ 'untime.iOS-10-3\n'
+ ' Failure Reason: Failed to create SimDeviceSet at path /Users/'
+ 'janedoe/Library/Developer/Xcode/UserData/IB Support/Simulator'
+ ' Devices. You\'ll want to check the logs in ~/Library/Logs/Co'
+ 'reSimulator to see why creating the SimDeviceSet failed.\n'
+ ' Underlying Errors:\n'
+ ' Description: Failed to initialize simulator device set.\n'
+ ' Failure Reason: Failed to subscribe to notifications from'
+ ' CoreSimulatorService.\n'
+ ' Underlying Errors:\n'
+ ' Description: Error returned in reply to notification '
+ 'request: Connection invalid\n'
+ ' Failure Reason: Software caused connection abort\n'
+ '/* com.apple.actool.compilation-results */\n',
+ self.relative_paths))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/chromium/build/toolchain/toolchain.gni b/chromium/build/toolchain/toolchain.gni
index 1746bda9ff2..62b2561c661 100644
--- a/chromium/build/toolchain/toolchain.gni
+++ b/chromium/build/toolchain/toolchain.gni
@@ -16,18 +16,14 @@ declare_args() {
allow_posix_link_time_opt =
is_clang && target_os == "linux" && !is_chromeos && target_cpu == "x64" &&
is_official_build
+}
- # Set to true to use lld, the LLVM linker. This flag may be used on Windows
- # with the shipped LLVM toolchain, or on Linux with a self-built top-of-tree
- # LLVM toolchain (see llvm_force_head_revision in
- # build/config/compiler/BUILD.gn).
- use_lld = is_win && host_os != "win"
-
- # If used with allow_posix_link_time_opt, it enables the experimental support
- # of ThinLTO that links 3x-10x faster but (as of now) does not have all the
- # important optimizations such us devirtualization implemented. See also
+declare_args() {
+ # If used with allow_posix_link_time_opt, it enables support for ThinLTO,
+ # which links 3x-10x faster than full LTO. See also
# http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html
- use_thin_lto = false
+ use_thin_lto = allow_posix_link_time_opt && target_os == "linux" &&
+ !is_chromeos && target_cpu == "x64"
# If this is set to true, or if LLVM_FORCE_HEAD_REVISION is set to 1
# in the environment, we use the revision in the llvm repo to determine
@@ -46,6 +42,10 @@ declare_args() {
# Currently disabled on LLD because of a bug (fixed upstream).
# See https://crbug.com/716209.
generate_linker_map = is_android && is_official_build
+
+ # Use absolute file paths in the compiler diagnostics and __FILE__ macro
+ # if needed.
+ msvc_use_absolute_paths = false
}
if (generate_linker_map) {
@@ -64,7 +64,12 @@ hermetic_xcode_path =
declare_args() {
if (is_clang) {
# Clang compiler version. Clang files are placed at version-dependent paths.
- clang_version = "5.0.0"
+ if (llvm_force_head_revision) {
+ clang_version = "6.0.0"
+ } else {
+ # TODO(hans): Trunk was updated; remove after the next roll.
+ clang_version = "5.0.0"
+ }
}
}
diff --git a/chromium/build/toolchain/win/BUILD.gn b/chromium/build/toolchain/win/BUILD.gn
index 296f829cbb3..90777eb86ca 100644
--- a/chromium/build/toolchain/win/BUILD.gn
+++ b/chromium/build/toolchain/win/BUILD.gn
@@ -135,6 +135,13 @@ template("msvc_toolchain") {
sys_include_flags = ""
}
+ clflags = ""
+
+ # Pass /FC flag to the compiler if needed.
+ if (msvc_use_absolute_paths) {
+ clflags += "/FC "
+ }
+
tool("cc") {
rspfile = "{{output}}.rsp"
precompiled_header_type = "msvc"
@@ -143,7 +150,7 @@ template("msvc_toolchain") {
# Label names may have spaces in them so the pdbname must be quoted. The
# source and output don't need to be quoted because GN knows they're a
# full file name and will quote automatically when necessary.
- command = "$env_wrapper$cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
+ command = "$env_wrapper$cl /nologo /showIncludes ${clflags} @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
depsformat = "msvc"
description = "CC {{output}}"
outputs = [
@@ -160,7 +167,7 @@ template("msvc_toolchain") {
pdbname = "{{target_out_dir}}/{{label_name}}_cc.pdb"
# See comment in CC tool about quoting.
- command = "$env_wrapper$cl /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
+ command = "$env_wrapper$cl /nologo /showIncludes ${clflags} @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
depsformat = "msvc"
description = "CXX {{output}}"
outputs = [
diff --git a/chromium/build/toolchain/win/setup_toolchain.py b/chromium/build/toolchain/win/setup_toolchain.py
index e8b08495745..8150d3a4e4a 100644
--- a/chromium/build/toolchain/win/setup_toolchain.py
+++ b/chromium/build/toolchain/win/setup_toolchain.py
@@ -50,7 +50,7 @@ def _ExtractImportantEnvironment(output_of_set):
# path. Add the path to this python here so that if it's not in the
# path when ninja is run later, python will still be found.
setting = os.path.dirname(sys.executable) + os.pathsep + setting
- env[var.upper()] = setting
+ env[var.upper()] = setting.lower()
break
if sys.platform in ('win32', 'cygwin'):
for required in ('SYSTEMROOT', 'TEMP', 'TMP'):
@@ -139,10 +139,9 @@ def _LoadToolchainEnv(cpu, sdk_dir):
raise Exception('%s is missing - make sure VC++ tools are installed.' %
script_path)
script_path = other_path
- # Chromium requires the 10.0.14393.0 SDK. Previous versions don't have all
- # of the required declarations, and 10.0.15063.0 is buggy.
- args = [script_path, 'amd64_x86' if cpu == 'x86' else 'amd64',
- '10.0.14393.0']
+ # Chromium requires the 10.0.14393.0 SDK or higher - previous versions don't
+ # have all of the required declarations.
+ args = [script_path, 'amd64_x86' if cpu == 'x86' else 'amd64']
variables = _LoadEnvFromBat(args)
return _ExtractImportantEnvironment(variables)
diff --git a/chromium/build/util/LASTCHANGE b/chromium/build/util/LASTCHANGE
index df40e4cbf3d..221a9b9d8e8 100644
--- a/chromium/build/util/LASTCHANGE
+++ b/chromium/build/util/LASTCHANGE
@@ -1 +1 @@
-LASTCHANGE=f117b2ca1a90e2cd7d1a3f880199f55d3b257975-
+LASTCHANGE=4a304aaec98384eea3cb69cd2abc7ff422720cf4-
diff --git a/chromium/build/util/LASTCHANGE.blink b/chromium/build/util/LASTCHANGE.blink
index df40e4cbf3d..221a9b9d8e8 100644
--- a/chromium/build/util/LASTCHANGE.blink
+++ b/chromium/build/util/LASTCHANGE.blink
@@ -1 +1 @@
-LASTCHANGE=f117b2ca1a90e2cd7d1a3f880199f55d3b257975-
+LASTCHANGE=4a304aaec98384eea3cb69cd2abc7ff422720cf4-
diff --git a/chromium/build/util/java_action.py b/chromium/build/util/java_action.py
index abf084cc943..ed9bb601de7 100755
--- a/chromium/build/util/java_action.py
+++ b/chromium/build/util/java_action.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# Copyright 2015 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.
diff --git a/chromium/build/vs_toolchain.py b/chromium/build/vs_toolchain.py
index bb8f96c4e52..3b2c727f51d 100755
--- a/chromium/build/vs_toolchain.py
+++ b/chromium/build/vs_toolchain.py
@@ -311,7 +311,7 @@ def CopyDlls(target_dir, configuration, target_cpu):
def _CopyDebugger(target_dir, target_cpu):
- """Copy dbghelp.dll into the requested directory as needed.
+ """Copy dbghelp.dll and dbgcore.dll into the requested directory as needed.
target_cpu is one of 'x86' or 'x64'.
@@ -319,19 +319,23 @@ def _CopyDebugger(target_dir, target_cpu):
from the SDK directory avoids using the system copy of dbghelp.dll which then
ensures compatibility with recent debug information formats, such as VS
2017 /debug:fastlink PDBs.
+
+ dbgcore.dll is needed when using some functions from dbghelp.dll (like
+ MinidumpWriteDump).
"""
win_sdk_dir = SetEnvironmentAndGetSDKDir()
if not win_sdk_dir:
return
- debug_file = 'dbghelp.dll'
- full_path = os.path.join(win_sdk_dir, 'Debuggers', target_cpu, debug_file)
- if not os.path.exists(full_path):
- raise Exception('dbghelp.dll not found in "%s"\r\nYou must install the '
- '"Debugging Tools for Windows" feature from the Windows '
- '10 SDK.' % full_path)
- target_path = os.path.join(target_dir, debug_file)
- _CopyRuntimeImpl(target_path, full_path)
+ debug_files = ['dbghelp.dll', 'dbgcore.dll']
+ for debug_file in debug_files:
+ full_path = os.path.join(win_sdk_dir, 'Debuggers', target_cpu, debug_file)
+ if not os.path.exists(full_path):
+ raise Exception('%s not found in "%s"\r\nYou must install the '
+ '"Debugging Tools for Windows" feature from the Windows '
+ '10 SDK.' % (debug_file, full_path))
+ target_path = os.path.join(target_dir, debug_file)
+ _CopyRuntimeImpl(target_path, full_path)
def _GetDesiredVsToolchainHashes():
@@ -339,11 +343,11 @@ def _GetDesiredVsToolchainHashes():
to build with."""
env_version = GetVisualStudioVersion()
if env_version == '2015':
- # Update 3 final with patches with 10.0.14393.0 SDK.
- return ['d3cb0e37bdd120ad0ac4650b674b09e81be45616']
+ # Update 3 final with 10.0.15063.468 SDK and no vctip.exe.
+ return ['f53e4598951162bad6330f7a167486c7ae5db1e5']
if env_version == '2017':
- # VS 2017 RTM with 10.0.14393.0 SDK and dbghelp.dll fixes.
- return ['4e8a360587a3c8ff3fa46aa9271e982bf3e948ec']
+ # VS 2017 Update 3 Preview 4 with 10.0.15063.468 SDK.
+ return ['1f52d730755ac72dddaf121b73c9d6fd5c24ddf8']
raise Exception('Unsupported VS version %s' % env_version)
diff --git a/chromium/build/whitespace_file.txt b/chromium/build/whitespace_file.txt
index 57c4c887d52..f2fa9b113c1 100644
--- a/chromium/build/whitespace_file.txt
+++ b/chromium/build/whitespace_file.txt
@@ -170,3 +170,5 @@ I just made two.
Mistakes are the best sometimes.
\o/
This is groovy.
+
+SECRET ENDING: IT WAS _____ ALL ALONG!
diff --git a/chromium/build/win/merge_pgc_files.py b/chromium/build/win/merge_pgc_files.py
index dac547a0b99..fd2718e3b97 100755
--- a/chromium/build/win/merge_pgc_files.py
+++ b/chromium/build/win/merge_pgc_files.py
@@ -23,6 +23,26 @@ sys.path.insert(0, os.path.join(script_dir, os.pardir))
import vs_toolchain
+# Number of PGC files that should be merged in each iteration, merging all
+# the files one by one is really slow but merging more than 10 at a time doesn't
+# really seem to impact the total time (when merging 180 files).
+#
+# Number of pgc merged per iteration | Time (in min)
+# 1 | 27.2
+# 10 | 12.8
+# 20 | 12.0
+# 30 | 11.5
+# 40 | 11.4
+# 50 | 11.5
+# 60 | 11.6
+# 70 | 11.6
+# 80 | 11.7
+#
+# TODO(sebmarchand): Measure the memory usage of pgomgr.exe to see how it get
+# affected by the number of pgc files.
+_BATCH_SIZE_DEFAULT = 10
+
+
def find_pgomgr(chrome_checkout_dir):
"""Find pgomgr.exe."""
win_toolchain_json_file = os.path.join(chrome_checkout_dir, 'build',
@@ -49,6 +69,20 @@ def find_pgomgr(chrome_checkout_dir):
return pgomgr_path
+def merge_pgc_files(pgomgr_path, files, pgd_path):
+ """Merge all the pgc_files in |files| to |pgd_path|."""
+ merge_command = [
+ pgomgr_path,
+ '/merge'
+ ]
+ merge_command.extend(files)
+ merge_command.append(pgd_path)
+ proc = subprocess.Popen(merge_command, stdout=subprocess.PIPE)
+ stdout, _ = proc.communicate()
+ print stdout
+ return proc.returncode
+
+
def main():
parser = optparse.OptionParser(usage='%prog [options]')
parser.add_option('--checkout-dir', help='The Chrome checkout directory.')
@@ -56,6 +90,9 @@ def main():
parser.add_option('--build-dir', help='Chrome build directory.')
parser.add_option('--binary-name', help='The binary for which the PGC files '
'should be merged, without extension.')
+ parser.add_option('--files-per-iter', help='The number of PGC files to merge '
+ 'in each iteration, default to %d.' % _BATCH_SIZE_DEFAULT,
+ type='int', default=_BATCH_SIZE_DEFAULT)
options, _ = parser.parse_args()
if not options.checkout_dir:
@@ -70,25 +107,7 @@ def main():
pgc_files = glob.glob(os.path.join(options.build_dir,
'%s*.pgc' % options.binary_name))
-
- # Number of PGC files that should be merged in each iterations, merging all
- # the files one by one is really slow but merging more to 10 at a time doesn't
- # really seem to impact the total time.
- #
- # Number of pgc merged per iteration | Time (in min)
- # 1 | 27.2
- # 10 | 12.8
- # 20 | 12.0
- # 30 | 11.5
- # 40 | 11.4
- # 50 | 11.5
- # 60 | 11.6
- # 70 | 11.6
- # 80 | 11.7
- #
- # TODO(sebmarchand): Measure the memory usage of pgomgr.exe to see how it get
- # affected by the number of pgc files.
- pgc_per_iter = 20
+ pgd_file = os.path.join(options.build_dir, '%s.pgd' % options.binary_name)
def _split_in_chunks(items, chunk_size):
"""Split |items| in chunks of size |chunk_size|.
@@ -97,25 +116,29 @@ def main():
"""
for i in xrange(0, len(items), chunk_size):
yield items[i:i + chunk_size]
-
- for chunk in _split_in_chunks(pgc_files, pgc_per_iter):
- merge_command = [
- pgomgr_path,
- '/merge'
- ]
+ for chunk in _split_in_chunks(pgc_files, options.files_per_iter):
+ files_to_merge = []
for pgc_file in chunk:
- merge_command.append([
- os.path.join(options.build_dir, os.path.basename(pgc_file))
- ])
-
- merge_command.append([
- os.path.join(options.build_dir, '%s.pgd' % options.binary_name)
- ])
- proc = subprocess.Popen(merge_command, stdout=subprocess.PIPE)
- stdout, stderr = proc.communicate()
- print stdout
- if proc.returncode != 0:
- raise Exception('Error while trying to merge the PGC files:\n%s' % stderr)
+ files_to_merge.append(
+ os.path.join(options.build_dir, os.path.basename(pgc_file)))
+ ret = merge_pgc_files(pgomgr_path, files_to_merge, pgd_file)
+ # pgomgr.exe sometimes fails to merge too many files at the same time (it
+ # usually complains that a stream is missing, but if you try to merge this
+ # file individually it works), try to merge all the PGCs from this batch one
+ # at a time instead. Don't fail the build if we can't merge a file.
+ # TODO(sebmarchand): Report this to Microsoft, check if this is still
+ # happening with VS2017.
+ if ret != 0:
+ print ('Error while trying to merge several PGC files at the same time, '
+ 'trying to merge them one by one.')
+ for pgc_file in chunk:
+ ret = merge_pgc_files(
+ pgomgr_path,
+ [os.path.join(options.build_dir, os.path.basename(pgc_file))],
+ pgd_file
+ )
+ if ret != 0:
+ print 'Error while trying to merge %s, continuing.' % pgc_file
if __name__ == '__main__':