diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-09-18 14:34:04 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-10-04 11:15:27 +0000 |
commit | e6430e577f105ad8813c92e75c54660c4985026e (patch) | |
tree | 88115e5d1fb471fea807111924dcccbeadbf9e4f /chromium/build | |
parent | 53d399fe6415a96ea6986ec0d402a9c07da72453 (diff) | |
download | qtwebengine-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')
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 Binary files differindex 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 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__': |