diff --git a/build/3pp/.style.yapf b/build/3pp_common/.style.yapf similarity index 100% rename from build/3pp/.style.yapf rename to build/3pp_common/.style.yapf diff --git a/build/3pp/README.md b/build/3pp_common/README.md similarity index 100% rename from build/3pp/README.md rename to build/3pp_common/README.md diff --git a/build/3pp/fetch_github_release.py b/build/3pp_common/fetch_github_release.py similarity index 73% rename from build/3pp/fetch_github_release.py rename to build/3pp_common/fetch_github_release.py index 57b2786..148968a 100644 --- a/build/3pp/fetch_github_release.py +++ b/build/3pp_common/fetch_github_release.py @@ -8,6 +8,8 @@ import os import pathlib import re +import sys +from typing import Dict, List import urllib.request @@ -15,7 +17,14 @@ def _fetch_json(url): return json.load(urllib.request.urlopen(url)) -def _latest(api_url, install_scripts=None): +def _find_valid_urls(release, artifact_regex): + urls = [x['browser_download_url'] for x in release['assets']] + if artifact_regex: + urls = [x for x in urls if re.search(artifact_regex, x)] + return urls + + +def _latest(api_url, install_scripts=None, artifact_regex=None): # Make the version change every time this file changes. md5 = hashlib.md5() md5.update(pathlib.Path(__file__).read_bytes()) @@ -27,8 +36,15 @@ def _latest(api_url, install_scripts=None): md5.update(pathlib.Path(path).read_bytes()) file_hash = md5.hexdigest()[:10] - release = _fetch_json(f'{api_url}/releases/latest')['tag_name'] - print('{}.{}'.format(release, file_hash)) + releases: List[Dict] = _fetch_json(f'{api_url}/releases') + for release in releases: + tag_name = release['tag_name'] + urls = _find_valid_urls(release, artifact_regex) + if len(urls) == 1: + print('{}.{}'.format(tag_name, file_hash)) + return + print(f'Bad urls={urls} for tag_name={tag_name}, skipping.', + file=sys.stderr) def _get_url(api_url, @@ -38,13 +54,10 @@ def _get_url(api_url, # Split off our md5 hash. version = os.environ['_3PP_VERSION'].rsplit('.', 1)[0] json_dict = _fetch_json(f'{api_url}/releases/tags/{version}') - urls = [x['browser_download_url'] for x in json_dict['assets']] - - if artifact_regex: - urls = [x for x in urls if re.search(artifact_regex, x)] + urls = _find_valid_urls(json_dict, artifact_regex) if len(urls) != 1: - raise Exception('len(urls) != 1: \n' + '\n'.join(urls)) + raise Exception('len(urls) != 1, urls: \n' + '\n'.join(urls)) partial_manifest = { 'url': urls, @@ -61,8 +74,7 @@ def main(*, artifact_filename=None, artifact_extension=None, artifact_regex=None, - install_scripts=None, - extract_extension=None): + install_scripts=None): """The fetch.py script for a 3pp module. Args: @@ -82,13 +94,11 @@ def main(*, api_url = f'https://api.github.com/repos/{project}' if args.action == 'latest': - _latest(api_url, install_scripts=install_scripts) + _latest(api_url, + install_scripts=install_scripts, + artifact_regex=artifact_regex) else: _get_url(api_url, artifact_filename=artifact_filename, artifact_extension=artifact_extension, artifact_regex=artifact_regex) - - -if __name__ == '__main__': - main() diff --git a/build/3pp/print_cipd_version.py b/build/3pp_common/print_cipd_version.py similarity index 100% rename from build/3pp/print_cipd_version.py rename to build/3pp_common/print_cipd_version.py diff --git a/build/BUILD.gn b/build/BUILD.gn index 58f5f20..00bf4d8 100644 --- a/build/BUILD.gn +++ b/build/BUILD.gn @@ -3,14 +3,18 @@ # found in the LICENSE file. import("//build/buildflag_header.gni") +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") -import("//build/config/chromecast_build.gni") import("//build/config/chromeos/args.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/features.gni") import("//build/util/process_version.gni") import("//build_overrides/build.gni") +if (is_ios) { + import("//build/config/ios/ios_sdk.gni") +} + source_set("buildflag_header_h") { sources = [ "buildflag.h" ] } @@ -29,6 +33,26 @@ buildflag_header("branding_buildflags") { "GOOGLE_CHROME_BRANDING=0", ] } + + if (is_chrome_for_testing) { + assert(!is_chrome_branded, + "`is_chrome_for_testing` is incompatible with `is_chrome_branded`") + + flags += [ "CHROME_FOR_TESTING=1" ] + } else { + flags += [ "CHROME_FOR_TESTING=0" ] + } + + # Note: `GOOGLE_CHROME_FOR_TESTING_BRANDING` and `CHROMIUM_BRANDING` are not + # mutually exclusive. + if (is_chrome_for_testing_branded) { + assert(is_chrome_for_testing, + "`is_chrome_for_testing_branded` requires `is_chrome_for_testing`") + + flags += [ "GOOGLE_CHROME_FOR_TESTING_BRANDING=1" ] + } else { + flags += [ "GOOGLE_CHROME_FOR_TESTING_BRANDING=0" ] + } } buildflag_header("blink_buildflags") { @@ -59,6 +83,17 @@ buildflag_header("chromeos_buildflags") { ] } +buildflag_header("robolectric_buildflags") { + header = "robolectric_buildflags.h" + flags = [ "IS_ROBOLECTRIC=$is_robolectric" ] +} + +buildflag_header("ios_buildflags") { + header = "ios_buildflags.h" + _is_ios_app_extension = is_ios && ios_is_app_extension + flags = [ "IS_IOS_APP_EXTENSION=$_is_ios_app_extension" ] +} + if (build_with_chromium) { group("gold_common_pytype") { testonly = true diff --git a/build/DIR_METADATA b/build/DIR_METADATA index c914ddc..544842a 100644 --- a/build/DIR_METADATA +++ b/build/DIR_METADATA @@ -1,5 +1,7 @@ -monorail { +monorail: { component: "Build" } - team_email: "build@chromium.org" +buganizer_public: { + component_id: 1456832 +} diff --git a/build/OWNERS b/build/OWNERS index e6a4d3c..78049f4 100644 --- a/build/OWNERS +++ b/build/OWNERS @@ -1,14 +1,18 @@ set noparent -# NOTE: keep this in sync with lsc-owners-override@chromium.org owners +# NOTE: keep this in sync with global-owners-override@chromium.org owners # by emailing lsc-policy@chromium.org when this list changes. agrieve@chromium.org brucedawson@chromium.org dpranke@google.com jochen@chromium.org +jwata@google.com +philwo@chromium.org +richardwa@google.com sdefresne@chromium.org thakis@chromium.org thomasanderson@chromium.org tikuta@chromium.org +ukai@google.com # Clang build config changes: file://tools/clang/scripts/OWNERS @@ -17,7 +21,7 @@ file://tools/clang/scripts/OWNERS smaier@chromium.org wnwen@chromium.org -# NOTE: keep this in sync with lsc-owners-override@chromium.org owners +# NOTE: keep this in sync with global-owners-override@chromium.org owners # by emailing lsc-policy@chromium.org when this list changes. # Mac build changes: diff --git a/build/OWNERS.setnoparent b/build/OWNERS.setnoparent index 98f3e9a..b93cd20 100644 --- a/build/OWNERS.setnoparent +++ b/build/OWNERS.setnoparent @@ -47,7 +47,6 @@ file://ui/android/java/res/LAYOUT_OWNERS # The rules are documented at: # https://sites.google.com/a/chromium.org/dev/developers/how-tos/enterprise/adding-new-policies file://components/policy/ENTERPRISE_POLICY_OWNERS -file://components/policy/resources/templates/OWNERS # This restriction is in place due to the complicated compliance regulations # around this code. @@ -58,10 +57,6 @@ file://chrome/android/java/src/org/chromium/chrome/browser/searchwidget/COMPLIAN # deprecation and versioning steps must be taken when doing so. file://chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/NOTIFICATION_CHANNEL_OWNERS -# The Weblayer API is supposed to be stable and will be used outside of the -# chromium repository. -file://weblayer/API_OWNERS - # New features for lock/login UI on Chrome OS need to work stably in all corner # cases. file://ash/login/LOGIN_LOCK_OWNERS diff --git a/build/action_helpers.py b/build/action_helpers.py index 046a292..065a34e 100644 --- a/build/action_helpers.py +++ b/build/action_helpers.py @@ -13,6 +13,9 @@ import gn_helpers +from typing import Optional +from typing import Sequence + @contextlib.contextmanager def atomic_output(path, mode='w+b', only_if_changed=True): @@ -60,7 +63,9 @@ def add_depfile_arg(parser): func('--depfile', help='Path to depfile (refer to "gn help depfile")') -def write_depfile(depfile_path, first_gn_output, inputs=None): +def write_depfile(depfile_path: str, + first_gn_output: str, + inputs: Optional[Sequence[str]] = None) -> None: """Writes a ninja depfile. See notes about how to use depfiles in //build/docs/writing_gn_templates.md. diff --git a/build/apple/OWNERS b/build/apple/OWNERS index 07d900e..a54e222 100644 --- a/build/apple/OWNERS +++ b/build/apple/OWNERS @@ -1,4 +1,3 @@ mark@chromium.org rohitrao@chromium.org -rsesek@chromium.org sdefresne@chromium.org diff --git a/build/apple/tweak_info_plist.py b/build/apple/tweak_info_plist.py index 8aa28b0..e6e8936 100755 --- a/build/apple/tweak_info_plist.py +++ b/build/apple/tweak_info_plist.py @@ -31,12 +31,30 @@ TOP = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) +assert sys.version_info.major >= 3, "Requires python 3.0 or higher." -def _ConvertPlist(source_plist, output_plist, fmt): - """Convert |source_plist| to |fmt| and save as |output_plist|.""" - assert sys.version_info.major == 2, "Use plistlib directly in Python 3" - return subprocess.call( - ['plutil', '-convert', fmt, '-o', output_plist, source_plist]) + +def _WritePlistIfChanged(plist, output_path, fmt): + """Write a plist file. + + Write `plist` to `output_path` in `fmt`. If `output_path` already exist, + the file is only overwritten if its content would be different. This allows + ninja to consider all dependent step to be considered as unnecessary (see + "restat" in ninja documentation). + """ + if os.path.isfile(output_path): + with open(output_path, 'rb') as f: + try: + exising_plist = plistlib.load(f) + if exising_plist == plist: + return + except plistlib.InvalidFileException: + # If the file cannot be parsed by plistlib, then overwrite it. + pass + + with open(output_path, 'wb') as f: + plist_format = {'binary1': plistlib.FMT_BINARY, 'xml1': plistlib.FMT_XML} + plistlib.dump(plist, f, fmt=plist_format[fmt]) def _GetOutput(args): @@ -331,17 +349,9 @@ def Main(argv): print('No --plist specified.', file=sys.stderr) return 1 - # Read the plist into its parsed format. Convert the file to 'xml1' as - # plistlib only supports that format in Python 2.7. - with tempfile.NamedTemporaryFile() as temp_info_plist: - if sys.version_info.major == 2: - retcode = _ConvertPlist(options.plist_path, temp_info_plist.name, 'xml1') - if retcode != 0: - return retcode - plist = plistlib.readPlist(temp_info_plist.name) - else: - with open(options.plist_path, 'rb') as f: - plist = plistlib.load(f) + # Read the plist into its parsed format. + with open(options.plist_path, 'rb') as f: + plist = plistlib.load(f) # Convert overrides. overrides = {} @@ -433,13 +443,7 @@ def Main(argv): # Now that all keys have been mutated, rewrite the file. # Convert Info.plist to the format requested by the --format flag. Any # format would work on Mac but iOS requires specific format. - if sys.version_info.major == 2: - with tempfile.NamedTemporaryFile() as temp_info_plist: - plistlib.writePlist(plist, temp_info_plist.name) - return _ConvertPlist(temp_info_plist.name, output_path, options.format) - with open(output_path, 'wb') as f: - plist_format = {'binary1': plistlib.FMT_BINARY, 'xml1': plistlib.FMT_XML} - plistlib.dump(plist, f, fmt=plist_format[options.format]) + _WritePlistIfChanged(plist, output_path, options.format) if __name__ == '__main__': diff --git a/build/build_config.h b/build/build_config.h index 1b38c7e..1174a91 100644 --- a/build/build_config.h +++ b/build/build_config.h @@ -358,19 +358,19 @@ // Type detection for wchar_t. #if defined(OS_WIN) -#define WCHAR_T_IS_UTF16 +#define WCHAR_T_IS_16_BIT #elif defined(OS_FUCHSIA) -#define WCHAR_T_IS_UTF32 +#define WCHAR_T_IS_32_BIT #elif defined(OS_POSIX) && defined(COMPILER_GCC) && defined(__WCHAR_MAX__) && \ (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff) -#define WCHAR_T_IS_UTF32 +#define WCHAR_T_IS_32_BIT #elif defined(OS_POSIX) && defined(COMPILER_GCC) && defined(__WCHAR_MAX__) && \ (__WCHAR_MAX__ == 0x7fff || __WCHAR_MAX__ == 0xffff) // On Posix, we'll detect short wchar_t, but projects aren't guaranteed to // compile in this mode (in particular, Chrome doesn't). This is intended for // other projects using base who manage their own dependencies and make sure // short wchar works for them. -#define WCHAR_T_IS_UTF16 +#define WCHAR_T_IS_16_BIT #else #error Please add support for your compiler in build/build_config.h #endif diff --git a/build/check_gn_headers_whitelist.txt b/build/check_gn_headers_whitelist.txt index dfefd7d..7ef998d 100644 --- a/build/check_gn_headers_whitelist.txt +++ b/build/check_gn_headers_whitelist.txt @@ -53,7 +53,6 @@ chrome/install_static/install_modes.h chrome/install_static/install_util.h chrome/install_static/test/scoped_install_details.h chrome/installer/util/google_update_settings.h -components/cdm/browser/cdm_message_filter_android.h components/device_event_log/device_event_log_export.h components/login/login_export.h components/media_router/common/providers/cast/certificate/cast_crl_root_ca_cert_der-inc.h diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn index 53511ac..f341687 100644 --- a/build/config/BUILD.gn +++ b/build/config/BUILD.gn @@ -3,8 +3,8 @@ # found in the LICENSE file. import("//build/config/c++/c++.gni") +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") -import("//build/config/chromecast_build.gni") import("//build/config/dcheck_always_on.gni") import("//build/config/features.gni") @@ -252,7 +252,7 @@ group("common_deps") { if (is_fuchsia) { public_deps += - [ "//third_party/fuchsia-sdk/sdk/build/config:runtime_library_group" ] + [ "//third_party/fuchsia-gn-sdk/src/config:runtime_library_group" ] if (is_asan) { public_deps += [ "//build/config/fuchsia:asan_runtime_library" ] } diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn index cab7285..8352342 100644 --- a/build/config/BUILDCONFIG.gn +++ b/build/config/BUILDCONFIG.gn @@ -339,7 +339,6 @@ default_compiler_configs = [ "//build/config/compiler:default_optimization", "//build/config/compiler:default_stack_frames", "//build/config/compiler:default_symbols", - "//build/config/compiler:export_dynamic", "//build/config/compiler:no_exceptions", "//build/config/compiler:no_rtti", # PATCH(build-gn): This would break building loadable modules. @@ -428,6 +427,7 @@ if (is_win) { # Executable defaults. default_executable_configs = default_compiler_configs + [ + "//build/config/compiler:export_dynamic", "//build/config:default_libs", "//build/config:executable_config", ] + _linker_configs @@ -570,8 +570,6 @@ foreach(_target_type, if (defined(output_extension)) { _shlib_extension = ".$output_extension" - } else if (is_component_build && _target_type != "loadable_module") { - _shlib_extension = ".cr.so" } else { _shlib_extension = ".so" } @@ -628,6 +626,11 @@ template("component") { if (defined(_output_name)) { output_name = _output_name } + if (is_component_build && is_android) { + # By appending .cr, we prevent name collisions with libraries already + # loaded by the Android zygote. + output_extension = "cr.so" + } forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) } @@ -669,6 +672,7 @@ set_defaults("component") { # Variables needed by rbe.gni aren't available at the top of this file. import("//build/toolchain/rbe.gni") +import("//build/toolchain/siso.gni") # TODO(b/253987456): Add action_foreach support. foreach(_target_type, [ "action" ]) { @@ -703,8 +707,10 @@ foreach(_target_type, [ "action" ]) { # If remote execution is desired, only run remotely when use_remoteexec # is enabled, and the environment is not nacl. + # Siso doesn't use action_remote.py wrapper because it sends requests to + # Reproxy directly without actions_remote.py/rewrapper. # TODO(b/259381924): Investigate enabling in nacl config. - if (allow_remote && use_remoteexec && !is_nacl) { + if (allow_remote && use_remoteexec && !is_nacl && !use_siso) { pool = "//build/toolchain:remote_action_pool($default_toolchain)" script = "//build/util/action_remote.py" inputs = [ invoker.script ] diff --git a/build/config/OWNERS b/build/config/OWNERS index 580fa2e..3787744 100644 --- a/build/config/OWNERS +++ b/build/config/OWNERS @@ -1,4 +1,4 @@ per-file ozone.gni=file://ui/ozone/OWNERS per-file ozone_extra.gni=file://ui/ozone/OWNERS per-file rust.gni=file://build/rust/OWNERS -per-file chromecast_build.gni=file://build/config/chromecast/OWNERS +per-file cast.gni=file://build/config/chromecast/OWNERS diff --git a/build/config/android/BUILD.gn b/build/config/android/BUILD.gn index e7c18c0..810b1da 100644 --- a/build/config/android/BUILD.gn +++ b/build/config/android/BUILD.gn @@ -24,6 +24,9 @@ config("compiler") { defines = [ "ANDROID", + # https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#weak-symbols-for-api-definitions + "__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__", + # The NDK has these things, but doesn't define the constants to say that it # does. Define them here instead. "HAVE_SYS_UIO_H", @@ -33,19 +36,23 @@ config("compiler") { "ANDROID_NDK_VERSION_ROLL=${android_ndk_version}_1", ] + if (android_64bit_current_cpu) { + _max_page_size = 16384 + } else { + _max_page_size = 4096 + } + ldflags = [ # Don't allow visible symbols from libraries that contain # assembly code with symbols that aren't hidden properly. # http://crbug.com/448386 "-Wl,--exclude-libs=libvpx_assembly_arm.a", - ] - if (current_cpu == "arm64") { # Reduce the page size from 65536 in order to reduce binary size slightly # by shrinking the alignment gap between segments. This also causes all # segments to be mapped adjacently, which breakpad relies on. - ldflags += [ "-Wl,-z,max-page-size=4096" ] - } + "-Wl,-z,max-page-size=$_max_page_size", + ] if (current_cpu == "arm64") { if (arm_control_flow_integrity == "standard") { @@ -78,20 +85,6 @@ config("compiler") { # that is Android-only. Please see that target for advice on what should go in # :runtime_library vs. :compiler. config("runtime_library") { - libs = [] - ldflags = [] - - # On 64-bit platforms, the only symbols provided by libandroid_support.a are - # strto{d,f,l,ul}_l. These symbols are not used by our libc++, and newer NDKs - # don't provide a libandroid_support.a on 64-bit platforms, so we only depend - # on this library on 32-bit platforms. - if (current_cpu == "arm" || current_cpu == "x86") { - libs += [ "android_support" ] - } - - if (current_cpu == "arm" && arm_version == 6) { - libs += [ "atomic" ] - } } config("hide_all_but_jni_onload") { @@ -143,16 +136,7 @@ config("default_orderfile_instrumentation") { } } -config("jni_include_dir") { - include_dirs = [ jni_headers_dir ] -} - if (current_toolchain == default_toolchain) { - pool("goma_javac_pool") { - # Override action_pool when goma is enabled for javac. - depth = 10000 - } - # nocompile tests share output directory to avoid them all needing to rebuild # things. But this also means they can't run in parallel. pool("nocompile_pool") { diff --git a/build/config/android/abi.gni b/build/config/android/abi.gni index 1a082cf..e59373c 100644 --- a/build/config/android/abi.gni +++ b/build/config/android/abi.gni @@ -88,6 +88,9 @@ if (target_cpu == "arm64" || target_cpu == "x64" || target_cpu == "mips64el" || assert(false, "Unknown target CPU: $target_cpu") } +android_64bit_current_cpu = current_cpu == "arm64" || target_cpu == "x64" || + target_cpu == "mips64el" || current_cpu == "riscv64" + # Do not define android_secondary_abi_cpu or android_app_secondary_abi for # target_cpu's that are 32-bit-only or 64-bit-only, as they are not used. The # presence of this variable may be used in conjunction with android_64bit_target_cpu diff --git a/build/config/android/config.gni b/build/config/android/config.gni index 0a4ea11..ae6136c 100644 --- a/build/config/android/config.gni +++ b/build/config/android/config.gni @@ -18,14 +18,18 @@ declare_args() { is_java_debug = is_debug || incremental_install } +# Toolchain used to create native libraries for robolectric_binary() targets. +robolectric_toolchain = "//build/toolchain/android:robolectric_$host_cpu" + # NOTE: Because Chrome OS builds may depend on targets built with the Android # toolchain, this GNI file may be read and processed from within Chrome OS # toolchains. Checking |is_android| here would therefore be too restrictive. if (is_android || is_chromeos) { import("//build/config/android/channel.gni") - import("//build/config/chromecast_build.gni") + import("//build/config/cast.gni") import("//build/config/clang/clang.gni") import("//build/config/dcheck_always_on.gni") + import("//build/toolchain/siso.gni") import("//build_overrides/build.gni") import("abi.gni") @@ -63,7 +67,7 @@ if (is_android || is_chromeos) { # The default to use for android:minSdkVersion for targets that do # not explicitly set it. - default_min_sdk_version = 24 + default_min_sdk_version = 26 # Static analysis can be either "on" or "off" or "build_server". This # controls how android lint, error-prone, bytecode checks are run. This @@ -83,6 +87,13 @@ if (is_android || is_chromeos) { } } + # Our build system no longer supports legacy multidex. + min_supported_sdk_version = 21 + + assert( + default_min_sdk_version >= min_supported_sdk_version, + "default_min_sdk_version ($default_min_sdk_version) must be >= min_supported_sdk_version ($min_supported_sdk_version)") + # Avoid typos when setting android_static_analysis in args.gn. assert(android_static_analysis == "on" || android_static_analysis == "off" || android_static_analysis == "build_server") @@ -103,11 +114,13 @@ if (is_android || is_chromeos) { if (!defined(default_android_ndk_root)) { default_android_ndk_root = "//third_party/android_toolchain/ndk" - default_android_ndk_version = "r25c" - default_android_ndk_major_version = 25 + if (current_cpu == "riscv64") { + # Today (2023-08-30) only the canary Android NDK supports RISC-V64. + default_android_ndk_root = "//third_party/android_toolchain_canary/ndk" + } + default_android_ndk_version = "r26b" } else { assert(defined(default_android_ndk_version)) - assert(defined(default_android_ndk_major_version)) } public_android_sdk_root = "//third_party/android_sdk/public" @@ -121,13 +134,6 @@ if (is_android || is_chromeos) { public_android_sdk = true } - if (android_sdk_release == "tprivacysandbox") { - default_android_sdk_root = public_android_sdk_root - default_android_sdk_version = "TiramisuPrivacySandbox" - default_android_sdk_build_tools_version = "33.0.0" - public_android_sdk = true - } - # For use downstream when we are building with preview Android SDK if (!defined(final_android_sdk)) { final_android_sdk = public_android_sdk @@ -161,8 +167,6 @@ if (is_android || is_chromeos) { if (!defined(android_protoc_bin)) { android_protoc_bin = "//third_party/android_protoc/protoc" - android_proto_runtime = - "//third_party/android_deps:com_google_protobuf_protobuf_javalite_java" } webview_public_framework_dep = @@ -177,7 +181,6 @@ if (is_android || is_chromeos) { declare_args() { android_ndk_root = default_android_ndk_root android_ndk_version = default_android_ndk_version - android_ndk_major_version = default_android_ndk_major_version # Android API level for 32 bits platforms android32_ndk_api_level = default_min_sdk_version @@ -189,6 +192,10 @@ if (is_android || is_chromeos) { # Android did not support 64 bit before API 21. android64_ndk_api_level = 21 } + if (current_cpu == "riscv64" && default_min_sdk_version < 35) { + # Android did not support RISC-V64 before API 35. + android64_ndk_api_level = 35 + } android_sdk_root = default_android_sdk_root android_sdk_version = default_android_sdk_version @@ -270,8 +277,12 @@ if (is_android || is_chromeos) { enable_startup_profiles = false # The target to use as the system WebView implementation. - if (android_64bit_target_cpu && skip_secondary_abi_for_cq) { - system_webview_apk_target = "//android_webview:system_webview_64_apk" + if (android_64bit_target_cpu) { + if (skip_secondary_abi_for_cq) { + system_webview_apk_target = "//android_webview:system_webview_64_apk" + } else { + system_webview_apk_target = "//android_webview:system_webview_32_64_apk" + } } else { system_webview_apk_target = "//android_webview:system_webview_apk" } @@ -305,6 +316,14 @@ if (is_android || is_chromeos) { assert(!incremental_install || is_java_debug, "incremental_install=true && is_java_debug=false is not supported.") + # We overwrite system_webview_apk_target if it is an alias + if (android_64bit_target_cpu) { + system_webview_apk_target = + string_replace(system_webview_apk_target, + "system_webview_google_apk", + "system_webview_google_32_64_apk") + } + # Host stuff ----------------------------------------------------------------- # Defines the name the Android build gives to the current host CPU @@ -370,15 +389,44 @@ if (is_android || is_chromeos) { android_tool_prefix = "$clang_base_path/bin/llvm-" android_readelf = "${android_tool_prefix}readobj" android_objcopy = "${android_tool_prefix}objcopy" - android_gdbserver = - "$android_ndk_root/prebuilt/$android_prebuilt_arch/gdbserver/gdbserver" android_sdk_tools_bundle_aapt2 = "${android_sdk_tools_bundle_aapt2_dir}/aapt2" - # Actions that use java should add this as an input so that they are rebuilt + _common_inputs_for_jre_jdk = [ + "//third_party/jdk/current/conf/logging.properties", + "//third_party/jdk/current/conf/security/java.security", + "//third_party/jdk/current/lib/ct.sym", + "//third_party/jdk/current/lib/jrt-fs.jar", + "//third_party/jdk/current/lib/jvm.cfg", + "//third_party/jdk/current/lib/libawt.so", + "//third_party/jdk/current/lib/libawt_headless.so", + "//third_party/jdk/current/lib/libawt_xawt.so", + "//third_party/jdk/current/lib/libjava.so", + "//third_party/jdk/current/lib/libjimage.so", + "//third_party/jdk/current/lib/libjli.so", + "//third_party/jdk/current/lib/libjsvml.so", + "//third_party/jdk/current/lib/libmanagement.so", + "//third_party/jdk/current/lib/libmanagement_ext.so", + "//third_party/jdk/current/lib/libnet.so", + "//third_party/jdk/current/lib/libnio.so", + "//third_party/jdk/current/lib/libverify.so", + "//third_party/jdk/current/lib/libzip.so", + "//third_party/jdk/current/lib/modules", + "//third_party/jdk/current/lib/server/classes.jsa", + "//third_party/jdk/current/lib/server/libjvm.so", + "//third_party/jdk/current/lib/tzdb.dat", + ] + + # Actions that use java should add this as inputs so that they are rebuilt # when the JDK changes. - java_path_for_inputs = "//third_party/jdk/current/bin/java.chromium" + java_paths_for_inputs = [ + "//third_party/jdk/current/bin/java", + "//third_party/jdk/current/bin/java.chromium", + ] + _common_inputs_for_jre_jdk + + javac_paths_for_inputs = + [ "//third_party/jdk/current/bin/javac" ] + _common_inputs_for_jre_jdk - # Toolchain used to create native libraries for robolectric_binary() targets. - robolectric_toolchain = "//build/toolchain/android:robolectric_$host_cpu" + # TODO(crbug.com/1426605): Remove. + use_upstream_errorprone_annotations_threadsafe = true } diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index d6bcf85..b1bf874 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni @@ -95,6 +95,7 @@ java_library_patterns = [ java_target_patterns = java_library_patterns + java_resource_patterns _r8_path = "//third_party/r8/lib/r8.jar" +_custom_r8_path = "//third_party/r8/custom_r8.jar" # This duplication is intentional, so we avoid updating the r8.jar used by # dexing unless necessary, since each update invalidates all incremental dexing @@ -120,42 +121,39 @@ build_config_target_suffix = "__build_config_crbug_908819" # See build/android/gyp/write_build_config.py and # build/android/gyp/util/build_utils.py:ExpandFileArgs template("write_build_config") { - _type = invoker.type - _parent_invoker = invoker.invoker - _target_label = - get_label_info(":${_parent_invoker.target_name}", "label_no_toolchain") - - # Ensure targets match naming patterns so that __assetres, __header, __host, - # and __validate targets work properly. - if (filter_exclude([ _type ], _java_resource_types) == []) { - if (filter_exclude([ _target_label ], java_resource_patterns) != []) { - assert(false, "Invalid java resource target name: $_target_label") - } - } else if (filter_exclude([ _type ], _java_library_types) == []) { - if (filter_exclude([ _target_label ], java_library_patterns) != [] || - filter_exclude([ _target_label ], java_resource_patterns) == []) { - assert(false, "Invalid java library target name: $_target_label") - } - } else if (_type == "group") { - if (filter_exclude([ _target_label ], java_target_patterns) != []) { - assert(false, "Invalid java target name: $_target_label") - } - } else if (filter_exclude([ _type ], _java_leaf_types) != []) { - assert(false, "This java type needs a category: $_type") - } + action_with_pydeps(target_name) { + forward_variables_from(invoker, [ "testonly" ]) + _type = invoker.type + _parent_invoker = invoker.invoker + _target_label = + get_label_info(":${_parent_invoker.target_name}", "label_no_toolchain") - if (defined(invoker.public_target_label)) { - _target_label = invoker.public_target_label - } + # Ensure targets match naming patterns so that __assetres, __header, __host, + # and __validate targets work properly. + if (filter_exclude([ _type ], _java_resource_types) == []) { + if (filter_exclude([ _target_label ], java_resource_patterns) != []) { + assert(false, "Invalid java resource target name: $_target_label") + } + } else if (filter_exclude([ _type ], _java_library_types) == []) { + if (filter_exclude([ _target_label ], java_library_patterns) != [] || + filter_exclude([ _target_label ], java_resource_patterns) == []) { + assert(false, "Invalid java library target name: $_target_label") + } + } else if (_type == "group") { + if (filter_exclude([ _target_label ], java_target_patterns) != []) { + assert(false, "Invalid java target name: $_target_label") + } + } else if (filter_exclude([ _type ], _java_leaf_types) != []) { + assert(false, "This java type needs a category: $_type") + } - action_with_pydeps(target_name) { - forward_variables_from(invoker, - [ - "deps", - "testonly", - ]) - if (!defined(deps)) { - deps = [] + if (defined(invoker.public_target_label)) { + _target_label = invoker.public_target_label + } + + deps = [] + if (defined(invoker.deps)) { + deps = invoker.deps } if (defined(invoker.android_manifest_dep)) { deps += [ invoker.android_manifest_dep ] @@ -821,6 +819,12 @@ template("test_runner_script") { ] } + if (use_jacoco_coverage) { + # Keep in sync with recipe constant for recipe to find coverage data + # files from local java tests: https://bit.ly/3Zul6do + _jacoco_coverage_dir_name = "java_coverage" + } + _device_test = true if (_test_type == "gtest") { assert(defined(invoker.test_suite)) @@ -898,7 +902,8 @@ template("test_runner_script") { # Set a default coverage output directory (can be overridden by user # passing the same flag). _rebased_coverage_dir = - rebase_path("$root_out_dir/coverage", root_build_dir) + rebase_path("$root_out_dir/$_jacoco_coverage_dir_name", + root_build_dir) executable_args += [ "--coverage-dir", "@WrappedPath(${_rebased_coverage_dir})", @@ -932,7 +937,8 @@ template("test_runner_script") { # Set a default coverage output directory (can be overridden by user # passing the same flag). _rebased_coverage_dir = - rebase_path("$root_out_dir/coverage", root_build_dir) + rebase_path("$root_out_dir/$_jacoco_coverage_dir_name", + root_build_dir) executable_args += [ "--coverage-dir", "@WrappedPath(${_rebased_coverage_dir})", @@ -1066,20 +1072,26 @@ if (enable_java_templates) { _lint_jar_path = _default_lint_jar_path } - _cache_dir = "$root_build_dir/android_lint_cache" + # It is not safe to run two lint versions concurrently since they will + # wipe the cache on version mismatch. When using a non-default lint + # version, make each target use their own cache directory. + _use_custom_cache_dir = _lint_jar_path != _default_lint_jar_path # Save generated xml files in a consistent location for debugging. - _lint_gen_dir = "$target_gen_dir/$target_name" + if (defined(invoker.lint_gen_dir)) { + _lint_gen_dir = invoker.lint_gen_dir + } else { + _lint_gen_dir = "$target_gen_dir/$target_name" + } _backported_methods = "//third_party/r8/backported_methods.txt" script = "//build/android/gyp/lint.py" depfile = "$target_gen_dir/$target_name.d" - inputs = [ - java_path_for_inputs, - _lint_jar_path, - _custom_lint_jar_path, - _backported_methods, - ] + inputs = java_paths_for_inputs + [ + _lint_jar_path, + _custom_lint_jar_path, + _backported_methods, + ] args = [ "--target-name", @@ -1090,8 +1102,6 @@ if (enable_java_templates) { rebase_path(_lint_jar_path, root_build_dir), "--custom-lint-jar-path", rebase_path(_custom_lint_jar_path, root_build_dir), - "--cache-dir", - rebase_path(_cache_dir, root_build_dir), "--lint-gen-dir", rebase_path(_lint_gen_dir, root_build_dir), "--android-sdk-version=${lint_android_sdk_version}", @@ -1102,6 +1112,17 @@ if (enable_java_templates) { rebase_path(_backported_methods, root_build_dir), ] + if (!_use_custom_cache_dir) { + _cache_dir = "$root_build_dir/android_lint_cache" + _create_cache_stamp_path = "$_cache_dir/build.lint.stamp" + + # By default, lint.py will use "$_lint_gen_dir/cache". + args += [ + "--cache-dir", + rebase_path(_cache_dir, root_build_dir), + ] + } + if (defined(invoker.skip_build_server) && invoker.skip_build_server) { # Nocompile tests need lint to fail through ninja. args += [ "--skip-build-server" ] @@ -1150,14 +1171,15 @@ if (enable_java_templates) { if (defined(invoker.create_cache) && invoker.create_cache) { # Putting the stamp file in the cache dir allows us to depend on ninja # to create the cache dir for us. - _stamp_path = "$_cache_dir/build.lint.stamp" args += [ "--create-cache" ] + _stamp_path = _create_cache_stamp_path } else { _stamp_path = "$target_out_dir/$target_name/build.lint.stamp" - deps += [ - "//build/android:prepare_android_lint_cache", - invoker.build_config_dep, - ] + deps += [ invoker.build_config_dep ] + if (!_use_custom_cache_dir) { + deps += [ "//build/android:prepare_android_lint_cache" ] + inputs += [ _create_cache_stamp_path ] + } inputs += [ invoker.build_config ] _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) @@ -1192,11 +1214,11 @@ if (enable_java_templates) { _script = "//build/android/gyp/proguard.py" _deps = invoker.deps - _inputs = [ - java_path_for_inputs, - invoker.build_config, - _r8_path, - ] + _inputs = java_paths_for_inputs + [ + invoker.build_config, + _r8_path, + _custom_r8_path, + ] if (defined(invoker.inputs)) { _inputs += invoker.inputs } @@ -1234,6 +1256,8 @@ if (enable_java_templates) { "@FileArg($_rebased_build_config:android:sdk_jars)", "--r8-path", rebase_path(_r8_path, root_build_dir), + "--custom-r8-path", + rebase_path(_custom_r8_path, root_build_dir), "--package-name=$_package_name", "--source-file", _source_file_template, @@ -1477,13 +1501,13 @@ if (enable_java_templates) { if (defined(invoker.min_sdk_version)) { _min_sdk_version = invoker.min_sdk_version } + assert( + _min_sdk_version >= min_supported_sdk_version, + get_label_info(":$target_name", "label_no_toolchain") + " has an unsupported min_sdk_version of $_min_sdk_version (min is $min_supported_sdk_version)") _proguard_enabled = defined(invoker.proguard_enabled) && invoker.proguard_enabled _is_dex_merging = defined(invoker.input_dex_filearg) - _enable_multidex = - !defined(invoker.enable_multidex) || invoker.enable_multidex - _enable_main_dex_list = _enable_multidex && _min_sdk_version < 21 _enable_desugar = !defined(invoker.enable_desugar) || invoker.enable_desugar _desugar_needs_classpath = _enable_desugar @@ -1514,10 +1538,6 @@ if (enable_java_templates) { "Proguard is required to support the custom assertion handler.") } - if (_enable_main_dex_list) { - _main_dex_rules = "//build/android/main_dex_classes.flags" - } - if (_desugar_needs_classpath || _proguard_enabled) { _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) } @@ -1583,22 +1603,6 @@ if (enable_java_templates) { args += [ "--apply-mapping=$_rebased_apply_mapping_path" ] } - if (_enable_main_dex_list) { - if (defined(invoker.extra_main_dex_proguard_config)) { - args += [ - "--main-dex-rules-path", - rebase_path(invoker.extra_main_dex_proguard_config, - root_build_dir), - ] - inputs += [ invoker.extra_main_dex_proguard_config ] - } - args += [ - "--main-dex-rules-path", - rebase_path(_main_dex_rules, root_build_dir), - ] - inputs += [ _main_dex_rules ] - } - if (defined(invoker.output)) { output_path = invoker.output } else if (!defined(proguard_mapping_path)) { @@ -1631,10 +1635,13 @@ if (enable_java_templates) { depfile = "$target_gen_dir/$target_name.d" outputs = [ invoker.output ] inputs = [ - java_path_for_inputs, - _d8_path, - _custom_d8_path, - ] + "$android_sdk/optional/android.test.base.jar", + "$android_sdk/optional/org.apache.http.legacy.jar", + "//third_party/jdk/current/bin/java", + _custom_d8_path, + _d8_path, + android_sdk_jar, + ] + java_paths_for_inputs if (defined(invoker.inputs)) { inputs += invoker.inputs } @@ -1652,7 +1659,7 @@ if (enable_java_templates) { "--depfile", rebase_path(depfile, root_build_dir), "--output", - rebase_path(outputs[0], root_build_dir), + rebase_path(invoker.output, root_build_dir), "--min-api=$_min_sdk_version", "--r8-jar-path", rebase_path(_d8_path, root_build_dir), @@ -1674,25 +1681,6 @@ if (enable_java_templates) { rebase_path("$target_out_dir/$target_name", root_build_dir), ] } - - if (_enable_multidex) { - args += [ "--multi-dex" ] - if (_enable_main_dex_list) { - if (defined(invoker.extra_main_dex_proguard_config)) { - args += [ - "--main-dex-rules-path", - rebase_path(invoker.extra_main_dex_proguard_config, - root_build_dir), - ] - inputs += [ invoker.extra_main_dex_proguard_config ] - } - args += [ - "--main-dex-rules-path", - rebase_path(_main_dex_rules, root_build_dir), - ] - inputs += [ _main_dex_rules ] - } - } if (_is_library) { args += [ "--library" ] } @@ -1786,8 +1774,7 @@ if (enable_java_templates) { _jacococli_jar = "//third_party/jacoco/lib/jacococli.jar" script = "//build/android/gyp/jacoco_instr.py" - inputs = invoker.source_files + [ - java_path_for_inputs, + inputs = invoker.source_files + java_paths_for_inputs + [ _jacococli_jar, invoker.input_jar_path, ] @@ -1899,25 +1886,21 @@ if (enable_java_templates) { template("bytecode_processor") { action_with_pydeps(target_name) { - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "data_deps" ]) - _bytecode_checker_script = "$root_build_dir/bin/helper/bytecode_processor" + forward_variables_from(invoker, + TESTONLY_AND_VISIBILITY + [ + "data_deps", + "deps", + ]) script = "//build/android/gyp/bytecode_processor.py" - inputs = [ - java_path_for_inputs, - invoker.build_config, - invoker.input_jar, - _bytecode_checker_script, - ] + inputs = java_paths_for_inputs + [ + invoker.build_config, + invoker.input_jar, + ] outputs = [ "$target_out_dir/$target_name.bytecode.stamp" ] - deps = - invoker.deps + - [ "//build/android/bytecode:bytecode_processor($default_toolchain)" ] _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) args = [ "--target-name", get_label_info(":${target_name}", "label_no_toolchain"), - "--script", - rebase_path(_bytecode_checker_script, root_build_dir), "--gn-target=${invoker.target_label}", "--input-jar", rebase_path(invoker.input_jar, root_build_dir), @@ -1941,26 +1924,23 @@ if (enable_java_templates) { if (treat_warnings_as_errors) { args += [ "--warnings-as-errors" ] } - if (defined(invoker.missing_classes_allowlist)) { - args += [ - "--missing-classes-allowlist=${invoker.missing_classes_allowlist}", - ] - } } } template("merge_manifests") { action_with_pydeps(target_name) { + assert( + invoker.min_sdk_version >= min_supported_sdk_version, + get_label_info(":$target_name", "label_no_toolchain") + " has an unsupported min_sdk_version of ${invoker.min_sdk_version} (min is $min_supported_sdk_version)") forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "deps" ]) script = "//build/android/gyp/merge_manifest.py" depfile = "$target_gen_dir/$target_name.d" - inputs = [ - java_path_for_inputs, - invoker.build_config, - invoker.input_manifest, - _manifest_merger_jar_path, - ] + inputs = java_paths_for_inputs + [ + invoker.build_config, + invoker.input_manifest, + _manifest_merger_jar_path, + ] outputs = [ invoker.output_manifest ] _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) @@ -2157,6 +2137,8 @@ if (enable_java_templates) { # Use resource IDs provided by another APK target when compiling resources # (via. "aapt2 link --stable-ids") # + # override_target_sdk: (optional) + # Update the manifest to target this SDK # # Output variables: # arsc_output: Path to output .ap_ file (optional). @@ -2169,8 +2151,6 @@ if (enable_java_templates) { # proguard_file: (optional) # Path to proguard configuration file for this apk target. # - # proguard_file_main_dex: (optional) - # template("compile_resources") { forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) @@ -2186,10 +2166,43 @@ if (enable_java_templates) { _script = "//build/android/gyp/compile_resources.py" + _target_sdk_version = invoker.target_sdk_version + if(defined(invoker.override_target_sdk)) { + _target_sdk_version = invoker.override_target_sdk + } + _inputs = [ invoker.build_config, android_sdk_tools_bundle_aapt2, android_sdk_jar, + + # TODO(b/315080809#comment4): remove these files after fixing + # build/print_python_deps.py. + "//third_party/protobuf/python/google/__init__.py", + "//third_party/protobuf/python/google/protobuf/__init__.py", + "//third_party/protobuf/python/google/protobuf/descriptor.py", + "//third_party/protobuf/python/google/protobuf/descriptor_database.py", + "//third_party/protobuf/python/google/protobuf/descriptor_pb2.py", + "//third_party/protobuf/python/google/protobuf/descriptor_pool.py", + "//third_party/protobuf/python/google/protobuf/internal/__init__.py", + "//third_party/protobuf/python/google/protobuf/internal/api_implementation.py", + "//third_party/protobuf/python/google/protobuf/internal/builder.py", + "//third_party/protobuf/python/google/protobuf/internal/containers.py", + "//third_party/protobuf/python/google/protobuf/internal/decoder.py", + "//third_party/protobuf/python/google/protobuf/internal/encoder.py", + "//third_party/protobuf/python/google/protobuf/internal/enum_type_wrapper.py", + "//third_party/protobuf/python/google/protobuf/internal/extension_dict.py", + "//third_party/protobuf/python/google/protobuf/internal/message_listener.py", + "//third_party/protobuf/python/google/protobuf/internal/python_message.py", + "//third_party/protobuf/python/google/protobuf/internal/type_checkers.py", + "//third_party/protobuf/python/google/protobuf/internal/well_known_types.py", + "//third_party/protobuf/python/google/protobuf/internal/wire_format.py", + "//third_party/protobuf/python/google/protobuf/message.py", + "//third_party/protobuf/python/google/protobuf/message_factory.py", + "//third_party/protobuf/python/google/protobuf/reflection.py", + "//third_party/protobuf/python/google/protobuf/symbol_database.py", + "//third_party/protobuf/python/google/protobuf/text_encoding.py", + "//third_party/protobuf/python/google/protobuf/text_format.py", ] _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) @@ -2202,7 +2215,7 @@ if (enable_java_templates) { "--dependencies-res-zips=@FileArg($_rebased_build_config:deps_info:dependency_zips)", "--extra-res-packages=@FileArg($_rebased_build_config:deps_info:extra_package_names)", "--min-sdk-version=${invoker.min_sdk_version}", - "--target-sdk-version=${invoker.target_sdk_version}", + "--target-sdk-version=${_target_sdk_version}", "--webp-cache-dir=obj/android-webp-cache", ] @@ -2332,14 +2345,6 @@ if (enable_java_templates) { ] } - if (defined(invoker.proguard_file_main_dex)) { - _outputs += [ invoker.proguard_file_main_dex ] - _args += [ - "--proguard-file-main-dex", - rebase_path(invoker.proguard_file_main_dex, root_build_dir), - ] - } - if (defined(invoker.aapt_locale_allowlist)) { _args += [ "--locale-allowlist=${invoker.aapt_locale_allowlist}" ] } @@ -2560,10 +2565,7 @@ if (enable_java_templates) { script = "//build/android/gyp/unused_resources.py" depfile = "$target_gen_dir/${target_name}.d" _unused_resources_script = "$root_build_dir/bin/helper/unused_resources" - inputs = [ - _unused_resources_script, - java_path_for_inputs, - ] + inputs = [ _unused_resources_script ] + java_paths_for_inputs outputs = [ invoker.output_config, invoker.output_r_txt, @@ -3023,8 +3025,13 @@ if (enable_java_templates) { action_with_pydeps(target_name) { if (invoker.use_turbine) { script = "//build/android/gyp/turbine.py" + inputs = [ + "//third_party/jdk/current/bin/java", + android_sdk_jar, + ] } else { script = "//build/android/gyp/compile_java.py" + inputs = javac_paths_for_inputs } if (target_name == "chrome_java__header") { @@ -3042,10 +3049,12 @@ if (enable_java_templates) { if (!invoker.enable_errorprone && !invoker.use_turbine) { outputs += [ invoker.output_jar_path + ".info" ] } - inputs = invoker.source_files + _java_srcjars + [ - _build_config, - java_path_for_inputs, - ] + inputs += invoker.source_files + _java_srcjars + [ + "$android_sdk/optional/android.test.base.jar", + "$android_sdk/optional/org.apache.http.legacy.jar", + _build_config, + ] + java_paths_for_inputs + if (invoker.source_files != []) { inputs += [ invoker.target_sources_file ] } @@ -3119,13 +3128,6 @@ if (enable_java_templates) { ] } - if (use_java_goma) { - args += [ "--gomacc-path=$goma_dir/gomacc" ] - - # Override the default action_pool when goma is enabled. - pool = "//build/config/android:goma_javac_pool" - } - # Flag enable_kythe_annotations requires # checkout_android_prebuilts_build_tools=True in .gclient. if (enable_kythe_annotations && !invoker.enable_errorprone) { @@ -3154,6 +3156,11 @@ if (enable_java_templates) { "--processorpath=@FileArg($_rebased_errorprone_buildconfig:deps_info:host_classpath)", "--enable-errorprone", ] + inputs += [ + # errorprone requires the plugin directory to detect src dir. + # https://source.chromium.org/chromium/chromium/src/+/main:tools/android/errorprone_plugin/src/org/chromium/tools/errorprone/plugin/UseNetworkAnnotations.java;l=84;drc=dfd88085261b662a5c0a1abea1a3b120b08e8e48 + "//tools/android/errorprone_plugin/OWNERS", + ] } if (defined(invoker.skip_build_server) && invoker.skip_build_server) { # Nocompile tests need lint to fail through ninja. @@ -3254,13 +3261,6 @@ if (enable_java_templates) { args += [ "--classpath=@FileArg($_rebased_build_config:deps_info:javac_full_interface_classpath)" ] - if (use_java_goma) { - args += [ "--gomacc-path=$goma_dir/gomacc" ] - - # Override the default action_pool when goma is enabled. - pool = "//build/config/android:goma_javac_pool" - } - if (_chromium_code) { args += [ "--chromium-code" ] if (treat_warnings_as_errors) { @@ -4000,12 +4000,11 @@ if (enable_java_templates) { _rebased_build_config = rebase_path(_build_config, root_build_dir) action_with_pydeps(_rewritten_jar_target_name) { script = "//build/android/gyp/bytecode_rewriter.py" - inputs = [ - java_path_for_inputs, - _rewriter_path, - _build_config, - _unprocessed_jar_path, - ] + inputs = java_paths_for_inputs + [ + _rewriter_path, + _build_config, + _unprocessed_jar_path, + ] outputs = [ _rewritten_jar ] depfile = "$target_gen_dir/$target_name.d" args = [ @@ -4156,7 +4155,6 @@ if (enable_java_templates) { deps += _header_classpath_deps + _unprocessed_jar_deps } - enable_multidex = false is_library = true # proguard_configs listed on java_library targets need to be marked @@ -4193,13 +4191,18 @@ if (enable_java_templates) { } deps = [ ":$_build_config_target_name" ] if (_is_robolectric) { - # For robolectric tests, we also add the normal sdk jar to the - # classpath since whenever we start using a new Android SDK, - # robolectric doesn't support it, and they often take a few months to - # support it. This causes issues when mocking classes that reference - # new SDK classes, so providing our normal SDK will allow these - # classes to resolve. For an example, see crbug.com/1350963. - extra_classpath_jars = [ android_sdk_jar ] + # For robolectric tests, we add the sdk stub jars so that classes + # that reference Android types can be loaded without throwing + # NoClassDefFoundErrors. The Robolectric sandbox makes these types + # available in non-stub form, but not until test classes are loaded + # into it. Before being loaded into the sandbox, they must be loaded + # outside of it in order to read their annotations (which configure + # the sandbox), and to enumerate test methods. + extra_classpath_jars = [ + android_sdk_jar, + "$android_sdk/optional/android.test.base.jar", + "$android_sdk/optional/android.test.runner.jar", + ] } } } @@ -4253,6 +4256,43 @@ if (enable_java_templates) { if (!defined(deps)) { deps = [] } + if (is_cronet_build) { + _abs_deps = [] + if (defined(invoker.deps)) { + foreach(dep, invoker.deps) { + _abs_deps += [ get_label_info(dep, "label_no_toolchain") ] + } + } + if (defined(invoker.public_deps)) { + foreach(dep, invoker.public_deps) { + _abs_deps += [ get_label_info(dep, "label_no_toolchain") ] + } + } + if (defined(invoker.srcjar_deps)) { + foreach(dep, invoker.srcjar_deps) { + _abs_deps += [ get_label_info(dep, "label_no_toolchain") ] + } + } + _abs_path_source_files = [] + if (defined(invoker.sources)) { + foreach(source_file, invoker.sources) { + _abs_path_source_files += + [ get_path_info(source_file, "abspath") ] + } + } + _abs_jar_path = "" + if (defined(invoker.jar_path)) { + _abs_jar_path = get_path_info(invoker.jar_path, "abspath") + } + # See crbug/1449896 for more details about the metadata fields + # and why they are added. + metadata = { + jar_path = [ _abs_jar_path ] + source_files = _abs_path_source_files + all_deps = _abs_deps + target_type = [ _type ] + } + } if (!defined(public_deps)) { public_deps = [] } diff --git a/build/config/android/jni.gni b/build/config/android/jni.gni deleted file mode 100644 index 0b97fa9..0000000 --- a/build/config/android/jni.gni +++ /dev/null @@ -1,293 +0,0 @@ -# Copyright 2023 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/config/android/config.gni") -import("//build/config/python.gni") -import("//build/partitioned_shared_library.gni") - -declare_args() { - # Enables JNI multiplexing to reduce JNI native methods overhead. - allow_jni_multiplexing = false - - # Use hashed symbol names to reduce JNI symbol overhead. - use_hashed_jni_names = !is_java_debug -} - -# Use a dedicated include dir so that files can #include headers from other -# toolchains without affecting non-JNI #includes. -if (target_os == "android") { - jni_headers_dir = "$root_build_dir/gen/jni_headers" -} else { - # Chrome OS builds cannot share gen/ directories because is_android=false - # within default_toolchain. - jni_headers_dir = "$root_gen_dir/jni_headers" -} - -template("jni_sources_list") { - generated_file(target_name) { - forward_variables_from(invoker, - TESTONLY_AND_VISIBILITY + [ - "deps", - "walk_keys", - ]) - outputs = [ invoker.output ] - data_keys = [ "jni_source_files" ] - rebase = root_build_dir - metadata = { - # This target is just collecting source files used - this is not a - # legitimate dependency. - shared_libraries_barrier = [] - } - } -} - -# Declare a jni registration target. -# -# This target generates a srcjar containing a copy of GEN_JNI.java, which has -# the native methods of all dependent java files. It can also create a .h file -# for use with manual JNI registration. -# -# The script does not scan any generated sources (those within .srcjars, or -# within root_build_dir). This could be fixed by adding deps & logic to scan -# .srcjars, but isn't currently needed. -# -# See third_party/jni_zero/jni_registration_generator.py for more info -# about the format of the header file. -# -# Variables -# java_targets: List of android_* targets that comprise your app. -# native_deps: List of shared_library targets that comprise your app. -# manual_jni_registration: Manually do JNI registration - required for feature -# splits which provide their own native library. (optional) -# namespace: Registration functions will be wrapped into this. (optional) -# require_native_mocks: Enforce that any native calls using -# org.chromium.base.annotations.NativeMethods must have a mock set -# (optional). -# enable_native_mocks: Allow native calls using -# org.chromium.base.annotations.NativeMethods to be mocked in tests -# (optional). -# -# Example -# generate_jni_registration("chrome_jni_registration") { -# java_targets = [ ":chrome_public_apk" ] -# manual_jni_registration = false -# } -template("generate_jni_registration") { - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - if (defined(invoker.native_deps)) { - _native_sources_list = "$target_gen_dir/$target_name.nativesources.txt" - jni_sources_list("${target_name}__native_sources") { - deps = invoker.native_deps - output = _native_sources_list - } - } - - _java_sources_list = "$target_gen_dir/$target_name.javasources.txt" - jni_sources_list("${target_name}__java_sources") { - deps = invoker.java_targets - output = _java_sources_list - - # When apk or bundle module targets are uses, do not pull metadata from - # their native library deps. - walk_keys = [ "java_walk_keys" ] - } - - action_with_pydeps(target_name) { - script = "//third_party/jni_zero/jni_zero.py" - inputs = [] - - # Cannot depend on jni_sources_list targets since they likely depend on - # this target via srcjar_deps. Depfiles are used to add the dep instead. - deps = [] - _srcjar_output = "$target_gen_dir/$target_name.srcjar" - outputs = [ _srcjar_output ] - depfile = "$target_gen_dir/$target_name.d" - - args = [ - "generate-final", - "--srcjar-path", - rebase_path(_srcjar_output, root_build_dir), - "--depfile", - rebase_path(depfile, root_build_dir), - "--java-sources-file", - rebase_path(_java_sources_list, root_build_dir), - ] - - if (defined(_native_sources_list)) { - args += [ - "--native-sources-file", - rebase_path(_native_sources_list, root_build_dir), - ] - } - - if (defined(invoker.include_testonly)) { - _include_testonly = invoker.include_testonly - } else { - _include_testonly = defined(testonly) && testonly - } - if (_include_testonly) { - args += [ "--include-test-only" ] - } - - if (use_hashed_jni_names) { - args += [ "--use-proxy-hash" ] - } - - if (defined(invoker.enable_native_mocks) && invoker.enable_native_mocks) { - args += [ "--enable-proxy-mocks" ] - - if (defined(invoker.require_native_mocks) && - invoker.require_native_mocks) { - args += [ "--require-mocks" ] - } - } - - if (defined(invoker.remove_uncalled_jni) && invoker.remove_uncalled_jni) { - args += [ "--remove-uncalled-methods" ] - } - if (defined(invoker.add_stubs_for_missing_jni) && - invoker.add_stubs_for_missing_jni) { - args += [ "--add-stubs-for-missing-native" ] - } - - _manual_jni_registration = defined(invoker.manual_jni_registration) && - invoker.manual_jni_registration - _enable_jni_multiplexing = defined(invoker.enable_jni_multiplexing) && - invoker.enable_jni_multiplexing - if (_manual_jni_registration) { - args += [ "--manual-jni-registration" ] - } - if (_enable_jni_multiplexing) { - args += [ "--enable-jni-multiplexing" ] - } - - if (_manual_jni_registration || _enable_jni_multiplexing) { - _subdir = rebase_path(target_gen_dir, root_gen_dir) - _jni_header_output = - "$jni_headers_dir/$_subdir/${target_name}_generated.h" - outputs += [ _jni_header_output ] - args += [ - "--header-path", - rebase_path(_jni_header_output, root_build_dir), - ] - - # This gives targets depending on this registration access to our generated header. - public_configs = [ "//build/config/android:jni_include_dir" ] - } - - if (defined(invoker.namespace)) { - args += [ "--namespace=${invoker.namespace}" ] - } - - if (defined(invoker.module_name)) { - args += [ "--module-name=${invoker.module_name}" ] - } - } -} - -# This is a wrapper around an underlying native target which inserts JNI -# registration. -# -# The registration is based on the closure of the native target's generate_jni -# transitive dependencies. Additionally, we use provided java_targets to assert -# that our native and Java sides line up. -# -# In order to depend on the JNI registration, use -# __jni_registration. -template("_native_with_jni") { - _needs_native_dep = - (defined(invoker.manual_jni_registration) && - invoker.manual_jni_registration) || allow_jni_multiplexing - if (_needs_native_dep || current_toolchain == default_toolchain) { - _jni_registration_target_name = "${target_name}__jni_registration" - } - - if (current_toolchain == default_toolchain) { - generate_jni_registration(_jni_registration_target_name) { - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - native_deps = invoker.deps - - if (allow_jni_multiplexing) { - enable_jni_multiplexing = true - } - if (defined(invoker.testonly) && invoker.testonly) { - enable_native_mocks = true - add_stubs_for_missing_jni = true - remove_uncalled_jni = true - } - forward_variables_from(invoker, - [ - "add_stubs_for_missing_jni", - "java_targets", - "manual_jni_registration", - "module_name", - "namespace", - "remove_uncalled_jni", - ]) - } - } else { - not_needed(invoker, - [ - "add_stubs_for_missing_jni", - "java_targets", - "manual_jni_registration", - "module_name", - "namespace", - "remove_uncalled_jni", - ]) - } - - if (!defined(invoker.enable_target) || invoker.enable_target) { - target(invoker.target_type, target_name) { - deps = invoker.deps - if (_needs_native_dep) { - deps += [ ":$_jni_registration_target_name($default_toolchain)" ] - } - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY + [ "deps" ]) - } - } else { - not_needed(invoker, "*") - if (current_toolchain != default_toolchain) { - not_needed([ "target_name" ]) - } - } -} - -# native_with_jni for shared libraries - see _native_with_jni for details. -template("shared_library_with_jni") { - _native_with_jni(target_name) { - forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - target_type = "shared_library" - } -} -set_defaults("shared_library_with_jni") { - configs = default_shared_library_configs -} - -# native_with_jni for partitioned shared libraries - see _native_with_jni for -# details. -template("partitioned_shared_library_with_jni") { - _native_with_jni(target_name) { - forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - target_type = "partitioned_shared_library" - } -} -set_defaults("partitioned_shared_library_with_jni") { - configs = default_shared_library_configs -} - -# native_with_jni for components - see _native_with_jni for details. -template("component_with_jni") { - _native_with_jni(target_name) { - forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - target_type = "component" - } -} -set_defaults("component_with_jni") { - configs = default_component_configs -} diff --git a/build/config/android/linker_version_script.gni b/build/config/android/linker_version_script.gni index 77d9983..3e99868 100644 --- a/build/config/android/linker_version_script.gni +++ b/build/config/android/linker_version_script.gni @@ -3,8 +3,10 @@ # found in the LICENSE file. import("//build/config/android/config.gni") -import("//build/config/android/jni.gni") import("//build/config/python.gni") +if (build_with_chromium) { + import("//third_party/jni_zero/jni_zero.gni") +} # Generate a custom linker version script that can later be used with # "-Wl,--version-script=" ldflags. diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index 1e42bf0..693c79c 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni @@ -6,17 +6,17 @@ # Some projects (e.g. V8) do not have non-build directories DEPS'ed in. import("//build/config/android/config.gni") import("//build/config/android/copy_ex.gni") -import("//build/config/android/jni.gni") import("//build/config/clang/clang.gni") import("//build/config/compiler/compiler.gni") import("//build/config/coverage/coverage.gni") import("//build/config/profiling/profiling.gni") import("//build/config/python.gni") -import("//build/config/rts.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build/config/zip.gni") import("//build/toolchain/toolchain.gni") -assert(is_android || is_robolectric) +assert( + is_android || is_robolectric, + "current_toolchain=$current_toolchain default_toolchain=$default_toolchain") if (target_cpu == "arm") { _sanitizer_arch = "arm" @@ -36,8 +36,6 @@ if (use_cfi_diag || is_ubsan || is_ubsan_security || is_ubsan_vptr) { _BUNDLETOOL_JAR_PATH = "//third_party/android_build_tools/bundletool/bundletool.jar" -_JAVAP_PATH = "//third_party/jdk/current/bin/javap" - # Creates a dist directory for a native executable. # # Running a native executable on a device requires all the shared library @@ -123,224 +121,10 @@ template("create_native_executable_dist") { } } -if (enable_java_templates) { - if (is_android) { - import("//build/config/android/internal_rules.gni") - } - - # JNI target implementation. See generate_jni or generate_jar_jni for usage. - template("_generate_jni_impl") { - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - if (current_toolchain != default_toolchain && target_os == "android") { - # Rather than regenerating .h files in secondary toolchains, re-use the - # ones from the primary toolchain by depending on it and adding the - # root gen directory to the include paths. - # https://crbug.com/1369398 - group(target_name) { - not_needed(invoker, "*") - public_deps = [ ":$target_name($default_toolchain)" ] - public_configs = - [ "//build/config/android:jni_include_dir($default_toolchain)" ] - } - } else { - action_with_pydeps(target_name) { - _subdir = rebase_path(target_gen_dir, root_gen_dir) - _jni_output_dir = "$jni_headers_dir/$_subdir/$target_name" - if (defined(invoker.jni_generator_include)) { - _jni_generator_include = invoker.jni_generator_include - _jni_generator_include_deps = [] - } else { - _jni_generator_include = - "//base/android/jni_generator/jni_generator_helper.h" - _jni_generator_include_deps = [ - # Using //base/android/jni_generator/jni_generator_helper.h introduces - # a dependency on buildflags targets indirectly through - # base/android/jni_android.h, which is part of the //base target. - # This can't depend directly on //base without causing a dependency - # cycle, though. - "//base:debugging_buildflags", - "//base:logging_buildflags", - "//build:chromeos_buildflags", - ] - } - - # The sources aren't compiled so don't check their dependencies. - check_includes = false - script = "//third_party/jni_zero/jni_zero.py" - forward_variables_from(invoker, - [ - "deps", - "metadata", - "public_deps", - ]) - if (!defined(public_deps)) { - public_deps = [] - } - public_deps += _jni_generator_include_deps - - public_configs = [ "//build/config/android:jni_include_dir" ] - if (defined(visibility)) { - # Allow dependency on ourselves from secondary toolchain. - visibility += [ ":$target_name" ] - } - - inputs = [] - outputs = [] - args = [] - if (defined(invoker.classes)) { - args += [ "from-jar" ] - } else { - args += [ "from-source" ] - } - args += [ - "--output-dir", - rebase_path(_jni_output_dir, root_build_dir), - "--extra-include", - rebase_path(_jni_generator_include, _jni_output_dir), - ] - - if (defined(invoker.classes)) { - if (is_robolectric) { - not_needed(invoker, [ "jar_file" ]) - } else { - if (defined(invoker.jar_file)) { - _jar_file = invoker.jar_file - } else { - _jar_file = android_sdk_jar - } - inputs += [ - _jar_file, - _JAVAP_PATH, - ] - args += [ - "--jar-file", - rebase_path(_jar_file, root_build_dir), - "--javap", - rebase_path(_JAVAP_PATH, root_build_dir), - ] - } - _input_args = invoker.classes - _input_names = invoker.classes - if (defined(invoker.unchecked_exceptions) && - invoker.unchecked_exceptions) { - args += [ "--unchecked-exceptions" ] - } - } else { - assert(defined(invoker.sources)) - _srcjar_output = "$target_gen_dir/$target_name.srcjar" - args += [ - "--srcjar-path", - rebase_path(_srcjar_output, root_build_dir), - ] - outputs += [ _srcjar_output ] - inputs += invoker.sources - _input_args = rebase_path(invoker.sources, root_build_dir) - _input_names = invoker.sources - if (use_hashed_jni_names) { - args += [ "--use-proxy-hash" ] - } - - if (defined(invoker.enable_jni_multiplexing) && - invoker.enable_jni_multiplexing) { - args += [ "--enable-jni-multiplexing" ] - } - if (defined(invoker.namespace)) { - args += [ "--namespace=${invoker.namespace}" ] - } - } - if (defined(invoker.split_name)) { - args += [ "--split-name=${invoker.split_name}" ] - } - - foreach(_name, _input_names) { - _name = get_path_info(_name, "name") + "_jni.h" - outputs += [ "$_jni_output_dir/$_name" ] - - # Avoid passing GN lists because not all webrtc embedders use //build. - args += [ - "--output-name", - _name, - ] - } - - foreach(_input, _input_args) { - args += [ "--input-file=$_input" ] - } - - if (enable_profiling) { - args += [ "--enable_profiling" ] - } - } - } - } - - # Declare a jni target - # - # This target generates the native jni bindings for a set of .java files. - # - # See third_party/jni_zero/jni_generator.py for more info about the - # format of generating JNI bindings. - # - # Variables - # sources: list of .java files to generate jni for - # namespace: Specify the namespace for the generated header file. - # deps, public_deps: As normal - # - # Example - # # Target located in base/BUILD.gn. - # generate_jni("foo_jni") { - # # Generates gen/base/foo_jni/Foo_jni.h - # # To use: #include "base/foo_jni/Foo_jni.h" - # sources = [ - # "android/java/src/org/chromium/foo/Foo.java", - # ..., - # ] - # } - template("generate_jni") { - _generate_jni_impl(target_name) { - forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - metadata = { - jni_source_files = sources - } - } - } - - # Declare a jni target for a prebuilt jar - # - # This target generates the native jni bindings for a set of classes in a .jar. - # - # See third_party/jni_zero/jni_generator.py for more info about the - # format of generating JNI bindings. - # - # Variables - # classes: list of .class files in the jar to generate jni for. These should - # include the full path to the .class file. - # jar_file: the path to the .jar. If not provided, will default to the sdk's - # android.jar - # unchecked_exceptions: Don't CHECK() for exceptions in generated stubs. - # This behaves as if every method had @CalledByNativeUnchecked. - # deps, public_deps: As normal - # - # Example - # # Target located in base/BUILD.gn. - # generate_jar_jni("foo_jni") { - # # Generates gen/base/foo_jni/Runnable_jni.h - # # To use: #include "base/foo_jni/Runnable_jni.h" - # classes = [ - # "android/view/Foo.class", - # ] - # } - template("generate_jar_jni") { - _generate_jni_impl(target_name) { - forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - } - } -} # enable_java_templates - # non-robolectric things if (enable_java_templates && is_android) { + import("//build/config/android/internal_rules.gni") + # Declare a target for c-preprocessor-generated java files # # NOTE: For generating Java conterparts to enums prefer using the java_cpp_enum @@ -471,7 +255,7 @@ if (enable_java_templates && is_android) { # # FooSwitches.java.tmpl # - # // Copyright {YEAR} The Chromium Authors. All rights reserved. + # // Copyright {YEAR} The Chromium Authors # // Use of this source code is governed by a BSD-style license that can be # // found in the LICENSE file. # @@ -544,7 +328,7 @@ if (enable_java_templates && is_android) { # # FooFeatures.java.tmpl # - # // Copyright $YEAR The Chromium Authors. All rights reserved. + # // Copyright $YEAR The Chromium Authors # // Use of this source code is governed by a BSD-style license that can be # // found in the LICENSE file. # @@ -684,16 +468,16 @@ if (enable_java_templates && is_android) { rebase_path(depfile, root_build_dir), ] } - if (defined(invoker.main_component_library)) { - args += [ - "--main-component-library", - invoker.main_component_library, - ] - } if (defined(invoker.enable_chromium_linker) && invoker.enable_chromium_linker) { args += [ "--enable-chromium-linker" ] } + if (defined(invoker.native_lib_32_bit) && invoker.native_lib_32_bit) { + args += [ "--native-lib-32-bit" ] + } + if (defined(invoker.native_lib_64_bit) && invoker.native_lib_64_bit) { + args += [ "--native-lib-64-bit" ] + } } } } @@ -1202,6 +986,7 @@ if (enable_java_templates && is_android) { _invoker_deps_minus_assetres = filter_exclude(_invoker_deps, _assetres_deps) _lib_deps = filter_include(_invoker_deps_minus_assetres, java_library_patterns) + _other_deps = _invoker_deps_minus_assetres - _lib_deps _expanded_lib_deps = [] foreach(_lib_dep, _lib_deps) { @@ -1220,7 +1005,10 @@ if (enable_java_templates && is_android) { deps += [ "${_lib_dep}__${_group_name}" ] } if (_group_name == "assetres") { - deps += _assetres_deps + # _other_deps are necessary when generating mergeable_android_manifests. + deps += _assetres_deps + _other_deps + } else if (_group_name == "header" && defined(invoker.jar_deps)) { + deps += invoker.jar_deps } } } @@ -1233,6 +1021,18 @@ if (enable_java_templates && is_android) { deps = [] } deps += [ ":$target_name$build_config_target_suffix" ] + if (is_cronet_build) { + _abs_deps = [] + if (defined(invoker.deps)) { + foreach(dep, invoker.deps) { + _abs_deps += [ get_label_info(dep, "label_no_toolchain") ] + } + } + metadata = { + all_deps = _abs_deps + target_type = [ "java_library" ] + } + } } } @@ -1381,6 +1181,7 @@ if (enable_java_templates && is_android) { arsc_output = _resource_arsc_output min_sdk_version = default_min_sdk_version target_sdk_version = android_sdk_version + forward_variables_from(invoker, [ "override_target_sdk" ]) } # apkbuilder step needed only to add android assets to the .ap_ file. @@ -1428,6 +1229,10 @@ if (enable_java_templates && is_android) { rebase = root_build_dir } } else { + # Needed for generate_jni_registration. Keeping this import guarded so + # that projects who import //build but not //third_party/jni_zero don't + # have issues. + import("//third_party/jni_zero/jni_zero.gni") _jni_srcjar_target_name = "${target_name}__final_jni" generate_jni_registration(_jni_srcjar_target_name) { enable_native_mocks = true @@ -1752,7 +1557,7 @@ if (enable_java_templates && is_android) { # Combines all dependent .jar files into a single proguarded .dex file. # # Variables: - # output: Path to the output dex. + # output: Path to the output .dex or .dex.jar. # proguard_enabled: Whether to enable R8. # proguard_configs: List of proguard configs. # proguard_enable_obfuscation: Whether to enable obfuscation (default=true). @@ -1801,7 +1606,6 @@ if (enable_java_templates && is_android) { ]) deps = [ ":$_build_config_target_name" ] + _deps build_config = _build_config - enable_multidex = false output = invoker.output if (defined(proguard_enabled) && proguard_enabled) { # The individual dependencies would have caught real missing deps in @@ -2086,7 +1890,6 @@ if (enable_java_templates && is_android) { # Variables: # use_final_fields: True to use final fields. When false, all other # variables must not be set. - # enable_multidex: Value for ENABLE_MULTIDEX. # min_sdk_version: Value for MIN_SDK_VERSION. # bundles_supported: Whether or not this target can be treated as a bundle. # resources_version_variable: @@ -2129,9 +1932,6 @@ if (enable_java_templates && is_android) { if (invoker.use_final_fields) { forward_variables_from(invoker, [ "deps" ]) defines += [ "USE_FINAL" ] - if (invoker.enable_multidex) { - defines += [ "ENABLE_MULTIDEX" ] - } if (defined(invoker.min_sdk_version)) { defines += [ "_MIN_SDK_VERSION=${invoker.min_sdk_version}" ] } @@ -2205,9 +2005,8 @@ if (enable_java_templates && is_android) { # loadable_modules: List of paths to native libraries to include. Different # from |shared_libraries| in that: # * dependencies of this .so are not automatically included - # * ".cr.so" is never added # * they are not side-loaded when incremental_install=true. - # * use_chromium_linker, and enable_relocation_packing do not apply + # * they are not included in NativeLibraries.java # Use this instead of shared_libraries when you are going to load the library # conditionally, and only when shared_libraries doesn't work for you. # secondary_abi_loadable_modules: This is the loadable_modules analog to @@ -2288,9 +2087,6 @@ if (enable_java_templates && is_android) { # compiling sources given to this target (optional). # bundles_supported: Enable Java code to treat this target as a bundle # whether (by default determined by the target type). - # main_component_library: Specifies the name of the base component's library - # in a component build. If given, the system will find dependent native - # libraries at runtime by inspecting this library (optional). # expected_libs_and_assets: Verify the list of included native libraries # and assets is consistent with the given expectation file. # expected_libs_and_assets_base: Treat expected_libs_and_assets as a diff @@ -2324,8 +2120,6 @@ if (enable_java_templates && is_android) { } _omit_dex = defined(invoker.omit_dex) && invoker.omit_dex - _enable_multidex = - !defined(invoker.enable_multidex) || invoker.enable_multidex if (!_is_bundle_module) { _final_apk_path = invoker.final_apk_path @@ -2511,11 +2305,6 @@ if (enable_java_templates && is_android) { _final_deps = [ ":$_java_target_name" ] - _enable_main_dex_list = _enable_multidex && _min_sdk_version < 21 - if (_enable_main_dex_list) { - _generated_proguard_main_dex_config = - "$_base_path.resources.main-dex-proguard.txt" - } _generated_proguard_config = "$_base_path.resources.proguard.txt" if (defined(_shared_resources_allowlist_target)) { @@ -2569,6 +2358,7 @@ if (enable_java_templates && is_android) { "expected_android_manifest_version_code_offset", "manifest_package", "max_sdk_version", + "override_target_sdk", "package_id", "png_to_webp", "r_java_root_package_name", @@ -2605,9 +2395,6 @@ if (enable_java_templates && is_android) { emit_ids_out_path = _compile_resources_emit_ids_out size_info_path = _res_size_info_path proguard_file = _generated_proguard_config - if (_enable_main_dex_list) { - proguard_file_main_dex = _generated_proguard_main_dex_config - } build_config = _build_config build_config_dep = ":$_build_config_target" @@ -2759,8 +2546,6 @@ if (enable_java_templates && is_android) { } if (_generate_native_libraries_java) { write_native_libraries_java("${_template_name}__native_libraries") { - forward_variables_from(invoker, [ "main_component_library" ]) - # Do not add a dep on the generated_file target in order to avoid having # to build the native libraries before this target. The dependency is # instead captured via a depfile. @@ -2771,14 +2556,27 @@ if (enable_java_templates && is_android) { if (defined(invoker.static_library_provider_use_secondary_abi) && invoker.static_library_provider_use_secondary_abi) { native_libraries_list_file = "${_prefix}.secondary_abi_native_libs" + _use_secondary_abi = true } else { native_libraries_list_file = "${_prefix}.native_libs" + _use_secondary_abi = false } } else if (_native_libs_deps != []) { native_libraries_list_file = _shared_library_list_file + _use_secondary_abi = false } else if (_secondary_abi_native_libs_deps != []) { native_libraries_list_file = _secondary_abi_shared_library_list_file + _use_secondary_abi = true + } + + if (defined(_use_secondary_abi)) { + if (_use_secondary_abi || !android_64bit_target_cpu) { + native_lib_32_bit = true + } else { + native_lib_64_bit = true + } } + enable_chromium_linker = _use_chromium_linker use_final_fields = true } @@ -2817,7 +2615,6 @@ if (enable_java_templates && is_android) { bundles_supported = _bundles_supported use_final_fields = true assertions_implicitly_enabled = _assertions_implicitly_enabled - enable_multidex = _enable_multidex is_incremental_install = _incremental_apk write_clang_profiling_data = use_clang_coverage && _generate_native_libraries_java @@ -2990,7 +2787,6 @@ if (enable_java_templates && is_android) { proguard_enabled = _proguard_enabled build_config = _build_config output = _final_dex_path - enable_multidex = _enable_multidex deps = [ ":$_build_config_target", ":$_java_target_name", @@ -3015,7 +2811,10 @@ if (enable_java_templates && is_android) { (!defined(testonly) || !testonly) && # Injected JaCoCo code causes -checkdiscards to fail. !use_jacoco_coverage) { - proguard_configs = [ "//build/android/dcheck_is_off.flags" ] + proguard_configs = [ + "//build/android/dcheck_is_off.flags", + "//third_party/jni_zero/checkdiscard_proguard.flags", + ] } } else { if (_min_sdk_version >= default_min_sdk_version) { @@ -3039,12 +2838,6 @@ if (enable_java_templates && is_android) { if (!defined(enable_desugar)) { ignore_desugar_missing_deps = true } - - if (_enable_main_dex_list) { - # Generates main-dex config. - deps += [ ":$_compile_resources_target" ] - extra_main_dex_proguard_config = _generated_proguard_main_dex_config - } } _final_dex_target_dep = ":$_final_dex_target_name" @@ -3316,6 +3109,7 @@ if (enable_java_templates && is_android) { forward_variables_from(invoker, [ "lint_baseline_file", + "lint_gen_dir", "lint_suppressions_file", "min_sdk_version", ]) @@ -3335,6 +3129,7 @@ if (enable_java_templates && is_android) { not_needed(invoker, [ "lint_baseline_file", + "lint_gen_dir", "lint_jar_path", "lint_min_sdk_version", "lint_suppressions_dep", @@ -3434,7 +3229,6 @@ if (enable_java_templates && is_android) { "deps", "enable_lint", "enable_jni_multiplexing", - "enable_multidex", "enable_proguard_checks", "enforce_resource_overlays_in_tests", "expected_android_manifest", @@ -3453,6 +3247,7 @@ if (enable_java_templates && is_android) { "keystore_password", "keystore_path", "lint_baseline_file", + "lint_gen_dir", "lint_min_sdk_version", "lint_suppressions_dep", "lint_suppressions_file", @@ -3461,7 +3256,6 @@ if (enable_java_templates && is_android) { "max_sdk_version", "mergeable_android_manifests", "product_config_java_packages", - "main_component_library", "min_sdk_version", "native_lib_placeholders", "never_incremental", @@ -3582,7 +3376,6 @@ if (enable_java_templates && is_android) { "data_deps", "deps", "enable_jni_multiplexing", - "enable_multidex", "expected_android_manifest", "expected_android_manifest_base", "expected_android_manifest_library_version_offset", @@ -3597,11 +3390,11 @@ if (enable_java_templates && is_android) { "javac_args", "loadable_modules", "product_config_java_packages", - "main_component_library", "manifest_package", "max_sdk_version", "min_sdk_version", "mergeable_android_manifests", + "override_target_sdk", "module_name", "native_lib_placeholders", "package_id", @@ -3676,22 +3469,6 @@ if (enable_java_templates && is_android) { # apk_under_test: ":bar" # } template("instrumentation_test_runner") { - if (use_rts) { - action("${invoker.target_name}__rts_filters") { - script = "//build/add_rts_filters.py" - rts_file = "${root_build_dir}/gen/rts/${invoker.target_name}.filter" - inverted_rts_file = - "${root_build_dir}/gen/rts/${invoker.target_name}_inverted.filter" - args = [ - rebase_path(rts_file, root_build_dir), - rebase_path(inverted_rts_file, root_build_dir), - ] - outputs = [ - rts_file, - inverted_rts_file, - ] - } - } _incremental_apk = !(defined(invoker.never_incremental) && invoker.never_incremental) && incremental_install _apk_operations_target_name = "${target_name}__apk_operations" @@ -3805,12 +3582,6 @@ if (enable_java_templates && is_android) { if (defined(invoker.additional_apks)) { public_deps += invoker.additional_apks } - if (use_rts) { - if (!defined(data_deps)) { - data_deps = [] - } - data_deps += [ ":${invoker.target_name}__rts_filters" ] - } } } @@ -3847,7 +3618,7 @@ if (enable_java_templates && is_android) { data += invoker.data } - deps = [ "//testing/android/broker:broker_java" ] + deps = [] if (defined(invoker.deps)) { deps += invoker.deps } @@ -3887,7 +3658,10 @@ if (enable_java_templates && is_android) { # optimizations that we ship with, but not have them break tests. The # apk under test will still have the same resources, assets, and # manifest, all of which are the ones used in the tests. - proguard_configs = [ "//testing/android/proguard_for_test.flags" ] + proguard_configs = [ + "//testing/android/proguard_for_test.flags", + "//third_party/jni_zero/proguard_for_test.flags", + ] if (defined(invoker.proguard_configs)) { proguard_configs += invoker.proguard_configs } @@ -4570,6 +4344,8 @@ if (enable_java_templates && is_android) { if (!defined(requires_android)) { requires_android = true } + include_java_resources = !defined(invoker.include_java_resources) || + invoker.include_java_resources supports_android = true jar_path = "$_output_path/classes.jar" aar_path = invoker.aar_path @@ -4654,9 +4430,6 @@ if (enable_java_templates && is_android) { # # proguard_enable_obfuscation: Whether to enable obfuscation (default=true) # - # enable_multidex: Optional. Enable multidexing of optimized modules jars - # when using synchronized proguarding. Only applies to base module. - # # proguard_android_sdk_dep: Optional. android_system_java_prebuilt() target # used as a library jar for synchronized proguarding. # @@ -4753,9 +4526,6 @@ if (enable_java_templates && is_android) { _proguard_mapping_path = "${_bundle_path}.mapping" } - assert(_proguard_enabled || !defined(invoker.enable_multidex), - "Bundle only adds dexing step if proguarding is enabled.") - if (defined(invoker.extra_modules)) { _module_count = 0 not_needed([ "_module_count" ]) @@ -4911,11 +4681,10 @@ if (enable_java_templates && is_android) { _stamp = "${target_out_dir}/${target_name}.trace_event_rewrite.stamp" action_with_pydeps(_rewritten_jar_target_name) { script = "//build/android/gyp/trace_event_bytecode_rewriter.py" - inputs = [ - java_path_for_inputs, - _rewriter_path, - _build_config, - ] + inputs = java_paths_for_inputs + [ + _rewriter_path, + _build_config, + ] outputs = [ _stamp ] depfile = "$target_gen_dir/$_rewritten_jar_target_name.d" args = [ @@ -4926,8 +4695,6 @@ if (enable_java_templates && is_android) { "--script", rebase_path(_rewriter_path, root_build_dir), "--classpath", - "@FileArg($_rebased_build_config:deps_info:javac_full_classpath)", - "--classpath", "@FileArg($_rebased_build_config:android:sdk_jars)", "--input-jars", "@FileArg($_rebased_build_config:deps_info:device_classpath)", @@ -4980,7 +4747,10 @@ if (enable_java_templates && is_android) { (!defined(testonly) || !testonly) && # Injected JaCoCo code causes -checkdiscards to fail. !use_jacoco_coverage) { - proguard_configs = [ "//build/android/dcheck_is_off.flags" ] + proguard_configs = [ + "//build/android/dcheck_is_off.flags", + "//third_party/jni_zero/checkdiscard_proguard.flags", + ] } } } @@ -5170,10 +4940,8 @@ if (enable_java_templates && is_android) { _bundle_target_name = "${_target_name}__bundle" action_with_pydeps(_bundle_target_name) { script = "//build/android/gyp/create_app_bundle.py" - inputs = _all_module_zip_paths + _all_module_build_configs + [ - _BUNDLETOOL_JAR_PATH, - java_path_for_inputs, - ] + inputs = _all_module_zip_paths + _all_module_build_configs + + [ _BUNDLETOOL_JAR_PATH ] + java_paths_for_inputs outputs = [ _bundle_path ] deps = _all_create_module_targets + [ ":$_build_config_target" ] args = [ @@ -5358,6 +5126,7 @@ if (enable_java_templates && is_android) { forward_variables_from(invoker, [ "lint_baseline_file", + "lint_gen_dir", "lint_jar_path", "lint_suppressions_file", ]) @@ -5377,6 +5146,7 @@ if (enable_java_templates && is_android) { not_needed(invoker, [ "lint_baseline_file", + "lint_gen_dir", "lint_jar_path", "lint_min_sdk_version", "lint_suppressions_dep", @@ -5403,11 +5173,10 @@ if (enable_java_templates && is_android) { _apks_path = "$root_build_dir/apks/$_bundle_name.apks" action_with_pydeps("${_target_name}_apks") { script = "//build/android/gyp/create_app_bundle_apks.py" - inputs = [ - java_path_for_inputs, - _bundle_path, - _BUNDLETOOL_JAR_PATH, - ] + inputs = java_paths_for_inputs + [ + _bundle_path, + _BUNDLETOOL_JAR_PATH, + ] outputs = [ _apks_path ] data = [ _apks_path ] args = [ @@ -5466,10 +5235,7 @@ if (enable_java_templates && is_android) { _name = get_path_info(invoker.bundle_path, "name") _output_path = "$_dir/$_name.minimal.apks" outputs = [ _output_path ] - inputs = [ - invoker.bundle_path, - java_path_for_inputs, - ] + inputs = [ invoker.bundle_path ] + java_paths_for_inputs args = [ "--bundle", rebase_path(invoker.bundle_path, root_build_dir), @@ -5487,6 +5253,20 @@ if (enable_java_templates && is_android) { ] } } + + template("alias_with_wrapper_script") { + copy(target_name) { + _aliased_wrapper_script_name = + get_label_info(invoker.alias_target, "name") + _aliased_wrapper_script = + "$root_build_dir/bin/$_aliased_wrapper_script_name" + sources = [ _aliased_wrapper_script ] + deps = [ invoker.alias_target ] + + _output_path = "$root_build_dir/bin/$target_name" + outputs = [ _output_path ] + } + } } # Generate an Android resources target that contains localized strings diff --git a/build/config/android/sdk.gni b/build/config/android/sdk.gni index 45e3404..af8496c 100644 --- a/build/config/android/sdk.gni +++ b/build/config/android/sdk.gni @@ -7,7 +7,4 @@ default_android_sdk_release = "u" # SDK releases against which public builds are supported. -public_sdk_releases = [ - "tprivacysandbox", - "u", -] +public_sdk_releases = [ "u" ] diff --git a/build/config/android/system_image.gni b/build/config/android/system_image.gni index 79f8560..d48b562 100644 --- a/build/config/android/system_image.gni +++ b/build/config/android/system_image.gni @@ -54,6 +54,11 @@ template("system_image_stub_apk") { } } + _target_sdk_version = default_android_sdk_version + if (defined(invoker.override_target_sdk)) { + _target_sdk_version = invoker.override_target_sdk + } + action_with_pydeps(_resource_apk_target_name) { script = "//build/android/gyp/compile_resources.py" inputs = [ @@ -65,7 +70,7 @@ template("system_image_stub_apk") { "--aapt2-path", rebase_path(android_sdk_tools_bundle_aapt2, root_build_dir), "--min-sdk-version=$default_min_sdk_version", - "--target-sdk-version=$default_android_sdk_version", + "--target-sdk-version=$_target_sdk_version", "--android-manifest", rebase_path(_manifest_path, root_build_dir), "--arsc-path", @@ -76,6 +81,12 @@ template("system_image_stub_apk") { _package_name = invoker.package_name _version_code = invoker.version_code _version_name = invoker.version_name + + # TODO(crbug.com/1408164): Make static_library_version mandatory. + if (defined(invoker.static_library_version)) { + assert(invoker.static_library_version == _version_code, + "$invoker.static_library_version must equal $_version_code.") + } } else { _target = invoker.package_info_from_target deps += [ "${_target}$build_config_target_suffix" ] @@ -86,7 +97,18 @@ template("system_image_stub_apk") { _package_name = "@FileArg($_rebased_build_config:deps_info:package_name)" _version_code = "@FileArg($_rebased_build_config:deps_info:version_code)" _version_name = "@FileArg($_rebased_build_config:deps_info:version_name)" + + # TODO(crbug.com/1408164): Make static_library_version mandatory. + # Pass this through to ensure that the version code in the build config is + # the same as the static library version. + if (defined(invoker.static_library_version)) { + args += [ + "--static-library-version", + invoker.static_library_version, + ] + } } + args += [ "--rename-manifest-package=$_package_name", "--arsc-package-name=$_package_name", @@ -133,6 +155,7 @@ template("system_image_apks") { [ "static_library_name", "static_library_version", + "override_target_sdk" ]) package_info_from_target = invoker.apk_or_bundle_target stub_output = invoker.stub_output diff --git a/build/config/android/test/classpath_order/BUILD.gn b/build/config/android/test/classpath_order/BUILD.gn deleted file mode 100644 index 376d244..0000000 --- a/build/config/android/test/classpath_order/BUILD.gn +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2021 The Chromium Authors -# 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") - -template("test_resources") { - jinja_template_resources(target_name) { - forward_variables_from(invoker, "*") - testonly = true - variables = [ "resource_name=$resource_name" ] - res_dir = "java/res_template" - resources = [ "java/res_template/values/values.xml" ] - } -} - -template("generate_dummy_android_library") { - # No underscores to avoid crbug.com/908819. - _generate_java_source_target_name = "${target_name}generatejavasource" - jinja_template(_generate_java_source_target_name) { - testonly = true - input = "java/src/org/chromium/build/classpath_order/Dummy.java.jinja2" - output = "$target_gen_dir/java/src/org/chromium/build/classpath_order/${invoker.class_name}.java" - variables = [ "class_name=${invoker.class_name}" ] - } - - android_library(target_name) { - forward_variables_from(invoker, "*") - - if (!defined(invoker.deps)) { - deps = [] - } - - sources = get_target_outputs(":${_generate_java_source_target_name}") - deps += [ ":${_generate_java_source_target_name}" ] - } -} - -# Test that classpath order keeps resources accessible when multiple targets generate -# resources for the same package. Specifically, test that an android_library precedes -# its dependencies regardless of the relative lexographic order. - -test_resources("a1_dependency_resources") { - resource_name = "a1_dependency_resource" -} - -generate_dummy_android_library("a1_dependency_java") { - testonly = true - class_name = "A1Dependency" - resources_package = "org.chromium.build.classpath_order.test1" - deps = [ ":a1_dependency_resources" ] -} - -test_resources("z1_master_resources") { - resource_name = "z1_master_resource" - deps = [ ":a1_dependency_resources" ] -} - -generate_dummy_android_library("z1_master_java") { - testonly = true - class_name = "Z1Master" - resources_package = "org.chromium.build.classpath_order.test1" - deps = [ - ":a1_dependency_java", - ":z1_master_resources", - ] -} - -test_resources("z2_dependency_resources") { - resource_name = "z2_dependency_resource" -} - -generate_dummy_android_library("z2_dependency_java") { - testonly = true - class_name = "Z2Dependency" - resources_package = "org.chromium.build.classpath_order.test2" - deps = [ ":z2_dependency_resources" ] -} - -test_resources("a2_master_resources") { - resource_name = "a2_master_resource" - deps = [ ":z2_dependency_resources" ] -} - -generate_dummy_android_library("a2_master_java") { - testonly = true - class_name = "A2Master" - resources_package = "org.chromium.build.classpath_order.test2" - deps = [ - ":a2_master_resources", - ":z2_dependency_java", - ] -} - -robolectric_library("junit_tests") { - sources = - [ "java/src/org/chromium/build/classpath_order/ClassPathOrderTest.java" ] - deps = [ - ":a1_dependency_java", - ":a2_master_java", - ":z1_master_java", - ":z2_dependency_java", - "//testing/android/junit:junit_test_support", - "//third_party/android_support_test_runner:runner_java", - "//third_party/androidx:androidx_test_runner_java", - "//third_party/junit", - ] -} diff --git a/build/config/android/test/classpath_order/java/res_template/values/values.xml b/build/config/android/test/classpath_order/java/res_template/values/values.xml deleted file mode 100644 index c163c88..0000000 --- a/build/config/android/test/classpath_order/java/res_template/values/values.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - 42 - diff --git a/build/config/android/test/classpath_order/java/src/org/chromium/build/classpath_order/ClassPathOrderTest.java b/build/config/android/test/classpath_order/java/src/org/chromium/build/classpath_order/ClassPathOrderTest.java deleted file mode 100644 index 8d1c444..0000000 --- a/build/config/android/test/classpath_order/java/src/org/chromium/build/classpath_order/ClassPathOrderTest.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.build.classpath_order; - -import static org.junit.Assert.assertTrue; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.annotation.Config; - -import org.chromium.testing.local.LocalRobolectricTestRunner; - -/** - * Test that resources defined in different android_resources() targets but with the same - * package are accessible. - */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public final class ClassPathOrderTest { - @Test - @SmallTest - public void testAll() { - assertTrue(org.chromium.build.classpath_order.test1.R.integer.a1_dependency_resource >= 0); - assertTrue(org.chromium.build.classpath_order.test1.R.integer.z1_master_resource >= 0); - assertTrue(org.chromium.build.classpath_order.test2.R.integer.z2_dependency_resource >= 0); - assertTrue(org.chromium.build.classpath_order.test2.R.integer.a2_master_resource >= 0); - } -} diff --git a/build/config/android/test/classpath_order/java/src/org/chromium/build/classpath_order/Dummy.java.jinja2 b/build/config/android/test/classpath_order/java/src/org/chromium/build/classpath_order/Dummy.java.jinja2 deleted file mode 100644 index 9979f71..0000000 --- a/build/config/android/test/classpath_order/java/src/org/chromium/build/classpath_order/Dummy.java.jinja2 +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.build.classpath_order; - -public class {{class_name}} { -} diff --git a/build/config/android/test/resource_overlay/java/src/org/chromium/build/resource_overlay/ResourceOverlayTest.java b/build/config/android/test/resource_overlay/java/src/org/chromium/build/resource_overlay/ResourceOverlayTest.java index d42450e..20800ef 100644 --- a/build/config/android/test/resource_overlay/java/src/org/chromium/build/resource_overlay/ResourceOverlayTest.java +++ b/build/config/android/test/resource_overlay/java/src/org/chromium/build/resource_overlay/ResourceOverlayTest.java @@ -17,9 +17,7 @@ import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.Batch; -/** - * Test for resource_overlay parameter in android_resources() build rule. - */ +/** Test for resource_overlay parameter in android_resources() build rule. */ @RunWith(BaseJUnit4ClassRunner.class) @Batch(Batch.UNIT_TESTS) public class ResourceOverlayTest { diff --git a/build/config/buildflags_paint_preview.gni b/build/config/buildflags_paint_preview.gni index 951b660..f5eabf4 100644 --- a/build/config/buildflags_paint_preview.gni +++ b/build/config/buildflags_paint_preview.gni @@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") import("//build/config/features.gni") declare_args() { diff --git a/build/config/c++/BUILD.gn b/build/config/c++/BUILD.gn index abe15b4..1cf9619 100644 --- a/build/config/c++/BUILD.gn +++ b/build/config/c++/BUILD.gn @@ -44,6 +44,15 @@ config("runtime_library") { defines += [ "CR_LIBCXX_REVISION=$libcxx_revision" ] + # Temporarily add a define to force a rebuild when changing + # buildtools/third_party/libc++/__config_site which isn't picked up by + # dependency tracking (because it's an #include of headers included via + # -isysroot). + # TODO(thakis): Remove this after a few days. + if (is_asan) { + defines += [ "TEMP_REBUILD_HACK" ] + } + if (is_win) { # Intentionally not using libc++abi on Windows because libc++abi only # implements the Itanium C++ ABI, and not the Microsoft ABI which we use on diff --git a/build/config/c++/libc++.natvis b/build/config/c++/libc++.natvis index 26580db..bceb435 100644 --- a/build/config/c++/libc++.natvis +++ b/build/config/c++/libc++.natvis @@ -248,6 +248,14 @@ + + nullopt + {__val_} + + __val_ + + + {c} diff --git a/build/config/chromecast_build.gni b/build/config/cast.gni similarity index 95% rename from build/config/chromecast_build.gni rename to build/config/cast.gni index e8294ce..6657414 100644 --- a/build/config/chromecast_build.gni +++ b/build/config/cast.gni @@ -5,12 +5,10 @@ # The args declared in this file should be referenced by components outside of # //chromecast. Args needed only in //chromecast should be declared in # //chromecast/chromecast.gni. -# -# TODO(crbug.com/1294964): Rename this file after is_chromecast is removed. declare_args() { # Set this true for an audio-only Chromecast build. - # TODO(crbug.com/1293538): Replace with a buildflag for speaker-only builds not - # specific to Cast. + # TODO(https://crbug.com/1516671): Remove this arg as CastOS builds are no + # longer supported. is_cast_audio_only = false # If non empty, rpath of executables is set to this. diff --git a/build/config/chrome_build.gni b/build/config/chrome_build.gni index b5156d5..4100059 100644 --- a/build/config/chrome_build.gni +++ b/build/config/chrome_build.gni @@ -22,7 +22,9 @@ declare_args() { # Set to true to enable settings for high end Android devices, typically # enhancing speed at the expense of resources such as binary sizes and memory. - is_high_end_android = false + # Non-official builds should ignore this argument so that arm64 builders + # remain fast and independent from PGO without having to set the value to false. + is_high_end_android = target_cpu == "arm64" if (is_android) { # By default, Trichrome channels are compiled using separate package names. @@ -33,13 +35,20 @@ declare_args() { } } -assert( - !is_chrome_for_testing || !is_chrome_branded, - "`is_chrome_for_testing = true` is incompatible with `is_chrome_branded = true`") +# Ensure !is_android implies !is_high_end_android. +is_high_end_android = is_high_end_android && is_android -assert( - is_chrome_for_testing || !is_chrome_for_testing_branded, - "`is_chrome_for_testing_branded = true` requires `is_chrome_for_testing = true`") +declare_args() { + # Whether to apply size->speed trade-offs to the secondary toolchain. + # Relevant only for 64-bit target_cpu. + is_high_end_android_secondary_toolchain = is_high_end_android +} + +assert(!is_chrome_for_testing || !is_chrome_branded, + "`is_chrome_for_testing` is incompatible with `is_chrome_branded`") + +assert(is_chrome_for_testing || !is_chrome_for_testing_branded, + "`is_chrome_for_testing_branded` requires `is_chrome_for_testing`") declare_args() { # Refers to the subdirectory for branding in various places including diff --git a/build/config/chromecast/BUILD.gn b/build/config/chromecast/BUILD.gn index acaf990..97bbef7 100644 --- a/build/config/chromecast/BUILD.gn +++ b/build/config/chromecast/BUILD.gn @@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") assert(is_castos || is_cast_android) diff --git a/build/config/chromeos/rules.gni b/build/config/chromeos/rules.gni index 732afc3..0b71d77 100644 --- a/build/config/chromeos/rules.gni +++ b/build/config/chromeos/rules.gni @@ -68,11 +68,8 @@ if (cros_sdk_version != "") { ] if (_cros_is_vm) { # VM-related tools. - _symlinks += [ - rebase_path("${_cache_path_prefix}+sys-firmware/seabios"), - rebase_path("${_cache_path_prefix}+chromiumos_test_image.tar.xz"), - rebase_path("${_cache_path_prefix}+app-emulation/qemu"), - ] + _symlinks += + [ rebase_path("${_cache_path_prefix}+chromiumos_test_image.tar.xz") ] } _symlink_map += [ [ b, @@ -150,11 +147,7 @@ template("generate_chromeos_sdk_deps") { } if (_cros_is_vm) { # Add vm sdk items. - _sdk_data += [ - _symlink_targets[3], - _symlink_targets[4], - _symlink_targets[5], - ] + _sdk_data += [ _symlink_targets[3] ] } } } @@ -170,6 +163,9 @@ template("generate_chromeos_sdk_deps") { # as data here so that changes to it will trigger analyze. "//chromeos/CHROMEOS_LKGM", ] + if (cros_boards_with_qemu_images != "") { + data += [ "//build/cros_cache/cipd/" ] + } } } @@ -304,7 +300,8 @@ template("generate_runner_script") { ]) if (!defined(skip_generating_board_args)) { - skip_generating_board_args = false + # --board should be assigned by the autotest wrapper on skylab builders + skip_generating_board_args = is_skylab } if (skip_generating_board_args) { @@ -370,6 +367,9 @@ template("generate_runner_script") { # then do testing. # See more at //docs/testing/chromeos_integration. if (test_exe == "chromeos_integration_tests") { + # Run the test sudo helper. + executable_args += [ "--run-test-sudo-helper" ] + if (is_chromeos_ash) { # For ash, it need to first stop the existing ash. executable_args += [ "--stop-ui" ] @@ -384,6 +384,10 @@ template("generate_runner_script") { "/run/chrome", ] } + + # Make the tests match the browser's selinux tags so it gets the same + # security context as the browser would. + executable_args += [ "--set-selinux-label=chromeos_integration_tests=u:object_r:chrome_browser_exec:s0" ] } if (defined(runtime_deps_file)) { executable_args += [ @@ -441,7 +445,7 @@ template("generate_runner_script") { executable_args += [ "--strip-chrome" ] } - if (!skip_generating_board_args || is_skylab) { + if (!skip_generating_board_args) { executable_args += [ "--board", cros_board, @@ -631,7 +635,10 @@ template("lacros_tast_tests") { if (is_skylab) { generate_skylab_tast_filter(target_name) { - data = _lacros_data + [ "//third_party/chromite/" ] + data = _lacros_data + [ + "//.vpython3", + "//third_party/chromite/", + ] data_deps = _lacros_data_deps # To disable a test on specific milestones, add it to the appropriate diff --git a/build/config/clang/BUILD.gn b/build/config/clang/BUILD.gn index fe044e2..5f17171 100644 --- a/build/config/clang/BUILD.gn +++ b/build/config/clang/BUILD.gn @@ -30,6 +30,43 @@ config("find_bad_constructs") { "-plugin-arg-find-bad-constructs", "-Xclang", "check-stack-allocated", + + # TODO(danakj): Delete this after the next clang roll. + "-Xclang", + "-plugin-arg-find-bad-constructs", + "-Xclang", + "check-allow-auto-typedefs-better-nested", + + "-Xclang", + "-plugin-arg-find-bad-constructs", + "-Xclang", + "check-raw-ptr-to-stack-allocated", + + "-Xclang", + "-plugin-arg-find-bad-constructs", + "-Xclang", + "disable-check-raw-ptr-to-stack-allocated-error", + + # TODO(https://crbug.com/1504043): Remove when raw_ptr check has been + # enabled for the dawn repo. + "-Xclang", + "-plugin-arg-find-bad-constructs", + "-Xclang", + "raw-ptr-exclude-path=/third_party/dawn/", + + # TODO(bartekn): Remove once clang plugin with crrev.com/c/5205312 rolls. + "-Xclang", + "-plugin-arg-find-bad-constructs", + "-Xclang", + "raw-ptr-exclude-path=base/logging.h", + "-Xclang", + "-plugin-arg-find-bad-constructs", + "-Xclang", + "raw-ptr-exclude-path=base/synchronization/lock_impl.h", + "-Xclang", + "-plugin-arg-find-bad-constructs", + "-Xclang", + "raw-ptr-exclude-path=base/check.h", ] if (is_linux || is_chromeos || is_android || is_fuchsia) { @@ -47,12 +84,6 @@ config("find_bad_constructs") { "-plugin-arg-find-bad-constructs", "-Xclang", "check-raw-ptr-fields", - - # TODO(mikt): Remove this once crbug.com/1449812 is resolved. - "-Xclang", - "-plugin-arg-find-bad-constructs", - "-Xclang", - "raw-ptr-exclude-path=um/winnt.h", ] } diff --git a/build/config/clang/clang.gni b/build/config/clang/clang.gni index d4351cd..c1af274 100644 --- a/build/config/clang/clang.gni +++ b/build/config/clang/clang.gni @@ -25,7 +25,8 @@ declare_args() { # TODO(crbug.com/1446146): Merge with enable_check_raw_ptr_fields once both # checks are activated on the same set of platforms. enable_check_raw_ref_fields = - build_with_chromium && !is_official_build && is_linux && !is_castos + build_with_chromium && !is_official_build && + ((is_linux && !is_castos) || (is_android && !is_cast_android) || is_win) clang_base_path = default_clang_base_path @@ -37,3 +38,7 @@ declare_args() { # creating a Chromium MLGO corpus in the ThinLTO case. lld_emit_indexes_and_imports = false } + +# We don't really need to collect a corpus for the host tools, just for the target. +lld_emit_indexes_and_imports = + lld_emit_indexes_and_imports && is_a_target_toolchain diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 270e59d..364d1f6 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn @@ -14,11 +14,12 @@ import("//build/config/coverage/coverage.gni") import("//build/config/dcheck_always_on.gni") import("//build/config/gclient_args.gni") import("//build/config/host_byteorder.gni") +import("//build/config/pch.gni") import("//build/config/rust.gni") -import("//build/config/sanitizers/sanitizers.gni") import("//build/config/ui.gni") import("//build/config/unwind.gni") import("//build/toolchain/cc_wrapper.gni") +import("//build/toolchain/cros/cros_config.gni") import("//build/toolchain/goma.gni") import("//build/toolchain/rbe.gni") import("//build/toolchain/toolchain.gni") @@ -89,6 +90,10 @@ declare_args() { # PATCH(build-gn): Allow changing position of the update script. clang_update_script = "//tools/clang/scripts/update.py" + # Optimize for coverage guided fuzzing (balance between speed and number of + # branches) + optimize_for_fuzzing = false + # Path to an AFDO profile to use while building with clang, if any. Empty # implies none. clang_sample_profile_path = "" @@ -131,12 +136,19 @@ declare_args() { (is_chromeos || is_android || is_win || is_linux || is_mac || (is_ios && use_lld)) && is_official_build + # Whether to enable thin lto incremental builds. + # See: https://clang.llvm.org/docs/ThinLTO.html#incremental + # The cache can lead to non-determinism: https://crbug.com/1486045 + thin_lto_enable_cache = true + # Initialize all local variables with a pattern. This flag will fill # uninitialized floating-point types (and 32-bit pointers) with 0xFF and the # rest with 0xAA. This makes behavior of uninitialized memory bugs consistent, # recognizable in the debugger, and crashes on memory accesses through # uninitialized pointers. # + # Flag discussion: https://crbug.com/977230 + # # TODO(crbug.com/1131993): This regresses binary size by ~1MB on Android and # needs to be evaluated before enabling it there as well. # PATCH(build-gn): Support use_xcode_clang. @@ -150,10 +162,10 @@ declare_args() { # final binary. When enabled, the separated text sections with prefix # '.text.hot', '.text.unlikely', '.text.startup' and '.text.exit' will not be # merged to '.text' section. This allows us to identify the hot code section - # ('.text.hot') in the binary which may be mlocked or mapped to huge page to - # reduce TLB misses which gives performance improvement on cpu usage. - # The gold linker by default has text section splitting enabled. - use_text_section_splitting = false + # ('.text.hot') in the binary, which allows our data collection pipelines to + # more easily identify code that we assume to be hot/cold that doesn't turn + # out to be such in the field. + use_text_section_splitting = is_chromeos # Enable DWARF v5. use_dwarf5 = false @@ -185,6 +197,18 @@ declare_args() { # configurations. For more details see # https://clang.llvm.org/docs/ShadowCallStack.html enable_shadow_call_stack = false + + # Use DWARF simple template names, with the following exceptions: + # + # * Windows is not supported as it doesn't use DWARF. + # * Apple platforms (e.g. MacOS, iPhone, iPad) aren't supported because xcode + # lldb doesn't have the needed changes yet. + # TODO(crbug.com/1379070): Remove if the upstream default ever changes. + # + # This greatly reduces the size of debug builds, at the cost of + # debugging information which is required by some specialized + # debugging tools. + simple_template_names = is_clang && !is_nacl && !is_win && !is_apple } declare_args() { @@ -364,16 +388,7 @@ config("compiler") { cflags += [ "-fstack-protector" ] } } else if ((is_posix && !is_chromeos && !is_nacl) || is_fuchsia) { - # TODO(phajdan.jr): Use -fstack-protector-strong when our gcc supports it. - # See also https://crbug.com/533294 - if (current_os != "zos") { - cflags += [ "--param=ssp-buffer-size=4" ] - } - - # The x86 toolchain currently has problems with stack-protector. - if (is_android && current_cpu == "x86") { - cflags += [ "-fno-stack-protector" ] - } else if (current_os != "aix") { + if (current_os != "aix") { # Not available on aix. cflags += [ "-fstack-protector" ] } @@ -478,6 +493,11 @@ config("compiler") { asmflags += [ "-femit-dwarf-unwind=no-compact-unwind" ] cflags += [ "-femit-dwarf-unwind=no-compact-unwind" ] } + + # dsymutil is not available in the system, on bots, for rustc to call. Our + # linker_driver.py script runs dsymutil itself, which is set to be the + # linker for Rust targets as well. + rustflags += [ "-Csplit-debuginfo=unpacked" ] } # Linux/Android/Fuchsia common flags setup. @@ -603,6 +623,24 @@ config("compiler") { } } + # TODO(crbug.com/1488374): This causes binary size growth and potentially + # other problems. + # TODO(crbug.com/1491036): This isn't supported by Cronet's mainline llvm version. + if (default_toolchain != "//build/toolchain/cros:target" && + !llvm_android_mainline) { + cflags += [ + "-mllvm", + "-split-threshold-for-reg-with-hint=0", + ] + if (use_thin_lto && is_a_target_toolchain) { + if (is_win) { + ldflags += [ "-mllvm:-split-threshold-for-reg-with-hint=0" ] + } else { + ldflags += [ "-Wl,-mllvm,-split-threshold-for-reg-with-hint=0" ] + } + } + } + # TODO(crbug.com/1235145): Investigate why/if this should be needed. if (is_win) { cflags += [ "/clang:-ffp-contract=off" ] @@ -659,8 +697,7 @@ config("compiler") { } } else if (is_win) { cflags_c += [ "/std:c11" ] - if ((defined(use_cxx17) && use_cxx17) || - (!is_clang && defined(msvc_use_cxx17) && msvc_use_cxx17)) { + if (defined(use_cxx17) && use_cxx17) { cflags_cc += [ "/std:c++17" ] } else { cflags_cc += [ "/std:c++20" ] @@ -707,9 +744,26 @@ config("compiler") { "-fsplit-lto-unit", ] - # Limit the size of the ThinLTO cache to the lesser of 10% of - # available disk space, 40GB and 100000 files. - cache_policy = "cache_size=10%:cache_size_bytes=40g:cache_size_files=100000" + if (thin_lto_enable_cache) { + # Limit the size of the ThinLTO cache to the lesser of 10% of + # available disk space, 40GB and 100000 files. + cache_policy = + "cache_size=10%:cache_size_bytes=40g:cache_size_files=100000" + cache_dir = rebase_path("$root_out_dir/thinlto-cache", root_build_dir) + if (is_win) { + ldflags += [ + "/lldltocache:$cache_dir", + "/lldltocachepolicy:$cache_policy", + ] + } else { + if (is_apple) { + ldflags += [ "-Wl,-cache_path_lto,$cache_dir" ] + } else { + ldflags += [ "-Wl,--thinlto-cache-dir=$cache_dir" ] + } + ldflags += [ "-Wl,--thinlto-cache-policy=$cache_policy" ] + } + } # An import limit of 30 has better performance (per speedometer) and lower # binary size than the default setting of 100. @@ -721,9 +775,6 @@ config("compiler") { ldflags += [ "/opt:lldltojobs=all", "-mllvm:-import-instr-limit=$import_instr_limit", - "/lldltocache:" + - rebase_path("$root_out_dir/thinlto-cache", root_build_dir), - "/lldltocachepolicy:$cache_policy", "-mllvm:-disable-auto-upgrade-debug-info", ] } else { @@ -738,19 +789,6 @@ config("compiler") { # TODO(thakis): Check if '=0' (that is, number of cores, instead # of "all" which means number of hardware threads) is faster. ldflags += [ "-Wl,--thinlto-jobs=all" ] - if (is_apple) { - ldflags += [ - "-Wl,-cache_path_lto," + - rebase_path("$root_out_dir/thinlto-cache", root_build_dir), - "-Wcrl,object_path_lto", - ] - } else { - ldflags += - [ "-Wl,--thinlto-cache-dir=" + - rebase_path("$root_out_dir/thinlto-cache", root_build_dir) ] - } - - ldflags += [ "-Wl,--thinlto-cache-policy=$cache_policy" ] if (is_chromeos) { # ARM was originally set lower than x86 to keep the size @@ -766,13 +804,13 @@ config("compiler") { ldflags += [ "-Wl,-mllvm,-import-instr-limit=$import_instr_limit" ] - if (!is_chromeos) { - # TODO(https://crbug.com/972449): turn on for ChromeOS when that - # toolchain has this flag. - # We only use one version of LLVM within a build so there's no need to - # upgrade debug info, which can be expensive since it runs the verifier. - ldflags += [ "-Wl,-mllvm,-disable-auto-upgrade-debug-info" ] + if (is_apple) { + ldflags += [ "-Wcrl,object_path_lto" ] } + + # We only use one version of LLVM within a build so there's no need to + # upgrade debug info, which can be expensive since it runs the verifier. + ldflags += [ "-Wl,-mllvm,-disable-auto-upgrade-debug-info" ] } # TODO(https://crbug.com/1211155): investigate why this isn't effective on @@ -780,13 +818,18 @@ config("compiler") { if (!is_android || current_cpu == "arm64") { cflags += [ "-fwhole-program-vtables" ] - # whole-program-vtables implies -fsplit-lto-unit, and Rust needs to match - # behaviour. Rust needs to know the linker will be doing LTO in this case - # or it rejects the Zsplit-lto-unit flag. - rustflags += [ - "-Zsplit-lto-unit", - "-Clinker-plugin-lto=yes", - ] + if (toolchain_supports_rust_thin_lto) { + # whole-program-vtables implies -fsplit-lto-unit, and Rust needs to match + # behaviour. Rust needs to know the linker will be doing LTO in this case + # or it rejects the Zsplit-lto-unit flag. + rustflags += [ + "-Zsplit-lto-unit", + "-Clinker-plugin-lto=yes", + ] + } else { + # Don't include bitcode if it won't be used. + rustflags += [ "-Cembed-bitcode=no" ] + } if (!is_win) { ldflags += [ "-fwhole-program-vtables" ] @@ -806,6 +849,9 @@ config("compiler") { if (compiler_timing) { if (is_clang && !is_nacl) { cflags += [ "-ftime-trace" ] + if (use_lld && is_mac) { + ldflags += [ "-Wl,--time-trace" ] + } } else if (is_win) { cflags += [ # "Documented" here: @@ -869,13 +915,8 @@ config("compiler") { cflags += [ "-fcomplete-member-pointers" ] } - # Use DWARF simple template names, with the following exceptions: - # - # * Windows is not supported as it doesn't use DWARF. - # * Apple platforms (e.g. MacOS, iPhone, iPad) aren't supported because xcode - # lldb doesn't have the needed changes yet. - # TODO(crbug.com/1379070): Remove if the upstream default ever changes. - if (is_clang && !is_nacl && !is_win && !is_apple) { + # Use DWARF simple template names. + if (simple_template_names) { cflags_cc += [ "-gsimple-template-names" ] } @@ -998,9 +1039,14 @@ config("compiler") { if (rust_abi_target != "") { rustflags += [ "--target=$rust_abi_target" ] } - if (!use_thin_lto) { + if (!use_thin_lto || !toolchain_supports_rust_thin_lto) { # Don't include bitcode if it won't be used. rustflags += [ "-Cembed-bitcode=no" ] + + # Disable "automatic" ThinLTO between codegen units. The weak symbol + # resolution across units can have surprising effects on linking, see + # crbug.com/324126269 and github.com/rust-lang/rust/issues/120842. + rustflags += [ "-Clto=no" ] } if (is_official_build) { rustflags += [ "-Ccodegen-units=1" ] @@ -1025,7 +1071,15 @@ config("compiler") { # TODO(https://crbug.com/702997): Move this back to the `runtime_library` # config when NaCl is removed. if (use_safe_libcxx) { - defines += [ "_LIBCPP_ENABLE_ASSERTIONS=1" ] + # TODO(https://crbug.com/1465186): Switch saigo to hardened mode once + # it's rolled in. + if (is_nacl_saigo) { + defines += [ "_LIBCPP_ENABLE_ASSERTIONS=1" ] + } else { + defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE" ] + } + } else { + defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE" ] } } @@ -1041,10 +1095,15 @@ config("thinlto_optimize_default") { ldflags = [ "-Wl,--lto-O" + lto_opt_level ] } - # We always point Rust to a linker that performs LTO, so we don't want Rust - # to preemptively do so during compilation too or they conflict. But we do - # want Rust to generate LTO metadata in order for the linker to do its job. - rustflags = [ "-Clinker-plugin-lto=yes" ] + if (toolchain_supports_rust_thin_lto) { + # We always point Rust to a linker that performs LTO, so we don't want Rust + # to preemptively do so during compilation too or they conflict. But we do + # want Rust to generate LTO metadata in order for the linker to do its job. + rustflags = [ "-Clinker-plugin-lto=yes" ] + } else { + # Don't include bitcode if it won't be used. + rustflags = [ "-Cembed-bitcode=no" ] + } } } @@ -1070,10 +1129,15 @@ config("thinlto_optimize_max") { ldflags = [ "-Wl,--lto-O" + lto_opt_level ] } - # We always point Rust to a linker that performs LTO, so we don't want Rust - # to preemptively do so during compilation too or they conflict. But we do - # want Rust to generate LTO metadata in order for the linker to do its job. - rustflags = [ "-Clinker-plugin-lto=yes" ] + if (toolchain_supports_rust_thin_lto) { + # We always point Rust to a linker that performs LTO, so we don't want Rust + # to preemptively do so during compilation too or they conflict. But we do + # want Rust to generate LTO metadata in order for the linker to do its job. + rustflags = [ "-Clinker-plugin-lto=yes" ] + } else { + # Don't include bitcode if it won't be used. + rustflags = [ "-Cembed-bitcode=no" ] + } } } @@ -1092,12 +1156,6 @@ config("compiler_cpu_abi") { configs += [ "//build/config/chromeos:compiler_cpu_abi" ] } - # TODO(https://crbug.com/1383873): Remove this once figured out. - if (is_apple && current_cpu == "arm64") { - cflags += [ "-fno-global-isel" ] - ldflags += [ "-fno-global-isel" ] - } - if ((is_posix && !is_apple) || is_fuchsia) { # CPU architecture. We may or may not be doing a cross compile now, so for # simplicity we always explicitly set the architecture. @@ -1106,6 +1164,17 @@ config("compiler_cpu_abi") { "-m64", "-msse3", ] + + # Minimum SIMD support for devices running lacros. + # See https://crbug.com/1475858 + if (is_chromeos_lacros) { + cflags += [ + "-mssse3", + "-msse4", + "-msse4.1", + "-msse4.2", + ] + } ldflags += [ "-m64" ] } else if (current_cpu == "x86") { cflags += [ "-m32" ] @@ -1645,6 +1714,32 @@ config("runtime_library") { } } +# treat_warnings_as_errors ---------------------------------------------------- +# +# Adding this config causes the compiler to treat warnings as fatal errors. +# This is used as a subconfig of both chromium_code and no_chromium_code, and +# is broken out separately so nocompile tests can force-enable this setting +# independently of the default warning flags. +config("treat_warnings_as_errors") { + if (is_win) { + cflags = [ "/WX" ] + } else { + cflags = [ "-Werror" ] + + # The compiler driver can sometimes (rarely) emit warnings before calling + # the actual linker. Make sure these warnings are treated as errors as + # well. + ldflags = [ "-Werror" ] + } + + # Turn rustc warnings into the "deny" lint level, which produce compiler + # errors. The equivalent of -Werror for clang/gcc. + # + # Note we apply the actual lint flags in config("compiler"). All warnings + # are suppressed in third-party crates. + rustflags = [ "-Dwarnings" ] +} + # default_warnings ------------------------------------------------------------ # # Collects all warning flags that are used by default. This is used as a @@ -1655,11 +1750,9 @@ config("default_warnings") { cflags_c = [] cflags_cc = [] ldflags = [] + configs = [] if (is_win) { - if (treat_warnings_as_errors) { - cflags += [ "/WX" ] - } if (fatal_linker_warnings) { arflags = [ "/WX" ] ldflags = [ "/WX" ] @@ -1683,9 +1776,9 @@ config("default_warnings") { } } else { # PATCH(build-gn): This is not available on old clang. - if (!use_xcode_clang && is_apple && !is_nacl) { - # When compiling Objective-C, warns if a method is used whose - # availability is newer than the deployment target. + if (!use_xcode_clang && (is_apple || is_android) && !is_nacl) { + # Warns if a method is used whose availability is newer than the + # deployment target. cflags += [ "-Wunguarded-availability" ] } @@ -1770,13 +1863,13 @@ config("default_warnings") { cflags += [ "-Wno-nonportable-include-path" ] } - if (is_fuchsia && llvm_force_head_revision) { + if (is_fuchsia) { cflags_cc += [ - # TODO(https://crbug.com/1474032): fix and reenable - "-Wno-deprecated-literal-operator", - # TODO(https://crbug.com/1474434): fix and reenable "-Wno-missing-field-initializers", + + # TODO(https://crbug.com/324953188): fix and reenable + "-Wno-extra-qualification", ] } @@ -1786,18 +1879,30 @@ config("default_warnings") { # Ignore warnings about MSVC optimization pragmas. # TODO(thakis): Only for no_chromium_code? http://crbug.com/912662 "-Wno-ignored-pragma-optimize", - ] - if (!is_nacl) { - cflags += [ - # TODO(crbug.com/1343975) Evaluate and possibly enable. - "-Wno-deprecated-builtins", + # TODO(crbug.com/1343975) Evaluate and possibly enable. + "-Wno-deprecated-builtins", + + # TODO(crbug.com/1352183) Evaluate and possibly enable. + "-Wno-bitfield-constant-conversion", - # TODO(crbug.com/1352183) Evaluate and possibly enable. - "-Wno-bitfield-constant-conversion", + # TODO(crbug.com/1412713) Evaluate and possibly enable. + "-Wno-deprecated-this-capture", + + # TODO(https://crbug.com/1491833): Fix and re-enable. + "-Wno-invalid-offsetof", + + # TODO(crbug.com/1494809): Evaluate and possibly enable. + "-Wno-vla-extension", + + # TODO(https://crbug.com/1490607): Fix and re-enable. + "-Wno-thread-safety-reference-return", + ] - # TODO(crbug.com/1412713) Evaluate and possibly enable. - "-Wno-deprecated-this-capture", + if (!is_nacl) { + cflags_cc += [ + # TODO(https://crbug.com/1513724): Fix and re-enable. + "-Wno-c++11-narrowing-const-reference", ] } } @@ -1805,10 +1910,11 @@ config("default_warnings") { # Some builders, such as Cronet, use a different version of Clang than # Chromium. This can cause minor errors when compiling Chromium changes. We # want to avoid these errors. - if (use_lenient_compiler_flags) { + if (llvm_android_mainline) { cflags += [ "-Wno-error=unknown-warning-option", "-Wno-error=unused-command-line-argument", + "-Wno-error=unknown-pragmas", ] } } @@ -1862,6 +1968,35 @@ config("prevent_unsafe_narrowing") { } } +# unsafe_buffer_warning ------------------------------------------------------- + +# Paths of third-party headers that violate Wunsafe-buffer-usage, but which we +# have been unable to fix yet. We use this list to be able to make progress and +# enable the warning on code that we do control/own. +# +# WARNING: This will disable all warnings in the files. ONLY USE THIS for +# third-party code which we do not control/own. Fix the warnings instead in +# our own code. +if (is_clang) { + unsafe_buffer_warning_header_allowlist = + [ "third_party/googletest/src/googletest/include/gtest" ] +} + +# Enables warnings on pointer arithmetic/indexing or calls to functions +# annotated with `UNSAFE_BUFFER_USAGE`. +config("unsafe_buffer_warning") { + if (is_clang) { + cflags = [ "-Wunsafe-buffer-usage" ] + foreach(h, unsafe_buffer_warning_header_allowlist) { + if (is_win) { + cflags += [ "/clang:--system-header-prefix=$h" ] + } else { + cflags += [ "--system-header-prefix=$h" ] + } + } + } +} + # chromium_code --------------------------------------------------------------- # # Toggles between higher and lower warnings for code that is (or isn't) @@ -1877,28 +2012,11 @@ config("chromium_code") { } } else { cflags = [ "-Wall" ] - if (treat_warnings_as_errors) { - cflags += [ "-Werror" ] - - # The compiler driver can sometimes (rarely) emit warnings before calling - # the actual linker. Make sure these warnings are treated as errors as - # well. - ldflags = [ "-Werror" ] - } if (is_clang) { # Enable extra warnings for chromium_code when we control the compiler. cflags += [ "-Wextra" ] } - if (treat_warnings_as_errors) { - # Turn rustc warnings into the "deny" lint level, which produce compiler - # errors. The equivalent of -Werror for clang/gcc. - # - # Note we apply the actual lint flags in config("compiler"). All warnings - # are suppressed in third-party crates. - rustflags = [ "-Dwarnings" ] - } - # In Chromium code, we define __STDC_foo_MACROS in order to get the # C99 macros on Mac and Linux. defines = [ @@ -1915,9 +2033,10 @@ config("chromium_code") { # disabled, so only do that for Release build. fortify_level = "2" - # ChromeOS supports a high-quality _FORTIFY_SOURCE=3 implementation - # with a few custom glibc patches. Use that if it's available. - if (is_chromeos_ash) { + # ChromeOS's toolchain supports a high-quality _FORTIFY_SOURCE=3 + # implementation with a few custom glibc patches. Use that if it's + # available. + if (is_chromeos_device && !lacros_use_chromium_toolchain) { fortify_level = "3" } defines += [ "_FORTIFY_SOURCE=" + fortify_level ] @@ -1935,7 +2054,7 @@ config("chromium_code") { } # PATCH(build-gn): We don't want this warning. - if (false) { + if (build_with_chromium) { cflags += [ # Warn on missing break statements at the end of switch cases. # For intentional fallthrough, use [[fallthrough]]. @@ -1963,6 +2082,9 @@ config("chromium_code") { ":default_warnings", ":noshadowing", ] + if (treat_warnings_as_errors) { + configs += [ ":treat_warnings_as_errors" ] + } } config("no_chromium_code") { @@ -1979,12 +2101,6 @@ config("no_chromium_code") { "/wd4267", # TODO(jschuh): size_t to int. ] } else { - # GCC may emit unsuppressible warnings so don't add -Werror for no chromium - # code. crbug.com/589724 - if (treat_warnings_as_errors && is_clang) { - cflags += [ "-Werror" ] - ldflags = [ "-Werror" ] - } if (is_clang && !is_nacl) { # TODO(thakis): Remove !is_nacl once # https://codereview.webrtc.org/1552863002/ made its way into chromium. @@ -2003,7 +2119,7 @@ config("no_chromium_code") { "-Wno-c++11-narrowing", ] # PATCH(build-gn): Support use_xcode_clang. - if (!is_nacl && !use_xcode_clang) { + if (!use_xcode_clang && !is_nacl) { cflags += [ # Disabled for similar reasons as -Wunused-variable. "-Wno-unused-but-set-variable", @@ -2019,6 +2135,12 @@ config("no_chromium_code") { rustflags = [ "--cap-lints=allow" ] configs = [ ":default_warnings" ] + + # GCC may emit unsuppressible warnings so only apply this config when + # building with clang. crbug.com/589724 + if (treat_warnings_as_errors && is_clang) { + configs += [ ":treat_warnings_as_errors" ] + } } # noshadowing ----------------------------------------------------------------- @@ -2210,6 +2332,11 @@ if (is_win) { common_optimize_on_ldflags += [ "/OPT:REF" ] # Remove unreferenced data. # TODO(thakis): Add LTO/PGO clang flags eventually, https://crbug.com/598772 } + + if (is_clang) { + # See below. + common_optimize_on_cflags += [ "/clang:-fno-math-errno" ] + } } else { common_optimize_on_cflags = [] common_optimize_on_ldflags = [] @@ -2258,6 +2385,14 @@ if (is_win) { "-Wl,--gc-sections", ] } + + # We cannot rely on errno being set after math functions, + # especially since glibc does not set it. Thus, use -fno-math-errno + # so that the compiler knows it can inline math functions. + # Note that this is different from -ffast-math (even though -ffast-math + # implies -fno-math-errno), which also allows a number of unsafe + # optimizations. + common_optimize_on_cflags += [ "-fno-math-errno" ] } config("default_stack_frames") { @@ -2304,32 +2439,22 @@ config("optimize") { # to optimize for performance like `/O2` for clang. rustflags = [] } - } else if (optimize_for_size) { + } else if (optimize_for_size || is_chromeos) { # Favor size over speed. - if (is_clang) { - cflags = [ "-Oz" ] + common_optimize_on_cflags + # -Os in clang is more of a size-conscious -O2 than "size at any cost" (AKA -Oz). - if (use_ml_inliner && is_a_target_toolchain) { - cflags += [ - "-mllvm", - "-enable-ml-inliner=release", - ] - } - } else { + if (is_fuchsia) { + cflags = [ "-Oz" ] + common_optimize_on_cflags + } else { cflags = [ "-Os" ] + common_optimize_on_cflags } - # Like with `-Oz` on Clang, `-Copt-level=z` will also turn off loop - # vectorization. - rustflags = [ "-Copt-level=z" ] - } else if (is_chromeos) { - # TODO(gbiv): This is partially favoring size over speed. CrOS exclusively - # uses clang, and -Os in clang is more of a size-conscious -O2 than "size at - # any cost" (AKA -Oz). It'd be nice to: - # - Make `optimize_for_size` apply to all platforms where we're optimizing - # for size by default (so, also Windows) - # - Investigate -Oz here, maybe just for ARM? - cflags = [ "-Os" ] + common_optimize_on_cflags + if (is_clang && use_ml_inliner && is_a_target_toolchain && !is_chromeos) { + cflags += [ + "-mllvm", + "-enable-ml-inliner=release", + ] + } # Similar to clang, we optimize with `-Copt-level=s` to keep loop # vectorization while otherwise optimizing for size. diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni index 23fb1d3..c1664b6 100644 --- a/build/config/compiler/compiler.gni +++ b/build/config/compiler/compiler.gni @@ -3,8 +3,8 @@ # found in the LICENSE file. import("//build/config/c++/c++.gni") +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") -import("//build/config/chromecast_build.gni") import("//build/config/chromeos/args.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/compiler/pgo/pgo.gni") @@ -40,8 +40,7 @@ declare_args() { # If true, optimize for size. # Default to favoring speed over size for platforms not listed below. - optimize_for_size = - !is_high_end_android && (is_android || is_ios || is_castos) + optimize_for_size = !is_high_end_android && (is_android || is_castos) } declare_args() { @@ -135,7 +134,8 @@ declare_args() { # Set to true to enable using the ML inliner in LLVM. This currently only # enables the ML inliner when targeting Android. # Currently the ML inliner is only supported on linux hosts - use_ml_inliner = host_os == "linux" && is_android + use_ml_inliner = host_os == "linux" && is_android && + !llvm_android_mainline # https://crbug.com/1468680 # Set to true to use the android unwinder V2 implementation. use_android_unwinder_v2 = true @@ -321,15 +321,18 @@ if (symbol_level == -1) { use_debug_fission = use_debug_fission && symbol_level == 2 # Non-component debug builds with symbol_level = 2 are an undesirable (very slow -# build times) and unsupported (some test binaries will fail with > 4 GB PDBs) -# combination. This is only checked when current_toolchain == default_toolchain -# because the is_component_build flag is set to false in various components of -# the build (like nacl) and we don't want to assert on those. +# build times, almost two-minute link times) combination. This is only checked +# when current_toolchain == default_toolchain because the is_component_build +# flag is set to false in various components of the build (like nacl) and we +# don't want to assert on those. # iOS does not support component builds so add an exception for this platform. +# Windows supports huge PDBs so this combination is allowed for those who don't +# mind long build times. if (forbid_non_component_debug_builds) { assert( symbol_level != 2 || current_toolchain != default_toolchain || - is_component_build || !is_debug || is_ios || use_debug_fission, + is_component_build || !is_debug || is_ios || use_debug_fission || + host_os == "win", "Can't do non-component debug builds at symbol_level=2 without use_debug_fission=true") } diff --git a/build/config/compiler/pgo/BUILD.gn b/build/config/compiler/pgo/BUILD.gn index a78d37d..d047c7e 100644 --- a/build/config/compiler/pgo/BUILD.gn +++ b/build/config/compiler/pgo/BUILD.gn @@ -58,7 +58,9 @@ config("pgo_optimization_flags") { _pgo_target = "linux" } else if (is_chromeos_lacros) { if (target_cpu == "arm") { - _pgo_target = "lacros-arm" + # We don't have the arm device to train arm pgo data. So Lacros arm + # would use arm64 profile. + _pgo_target = "lacros-arm64" } else if (target_cpu == "arm64") { _pgo_target = "lacros-arm64" } else { @@ -71,10 +73,6 @@ config("pgo_optimization_flags") { } else { _pgo_target = "android-arm32" } - - # Continue to use mac-arm profile until Android native PGO autoroll works. - # TODO(crbug.com/1308749): Remove the following. - _pgo_target = "mac-arm" } else if (is_fuchsia) { if (target_cpu == "arm64") { _pgo_target = "mac-arm" diff --git a/build/config/compiler/pgo/pgo.gni b/build/config/compiler/pgo/pgo.gni index a53d195..047cf18 100644 --- a/build/config/compiler/pgo/pgo.gni +++ b/build/config/compiler/pgo/pgo.gni @@ -2,9 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") -import("//build/config/chromecast_build.gni") import("//build/config/chromeos/ui_mode.gni") +import("//build/config/cronet/config.gni") import("//build/config/dcheck_always_on.gni") import("//build/config/features.gni") import("//build/config/ios/config.gni") @@ -20,7 +21,7 @@ declare_args() { # to think some code is hotter than it actually is, potentially causing very # bad compile times. chrome_pgo_phase = 0 - if (!dcheck_always_on && is_official_build && + if (!is_cronet_build && !dcheck_always_on && is_official_build && # TODO(crbug.com/1336055): Update this now-outdated condition with regard # to chromecast and determine whether chromeos_is_browser_only is # obsolete. diff --git a/build/config/coverage/BUILD.gn b/build/config/coverage/BUILD.gn index 6c3fca9..1a7cabf 100644 --- a/build/config/coverage/BUILD.gn +++ b/build/config/coverage/BUILD.gn @@ -29,6 +29,8 @@ config("default_coverage") { cflags = [ "-fprofile-instr-generate", "-fcoverage-mapping", + "-mllvm", + "-runtime-counter-relocation=true", # Following experimental flags removes unused header functions from the # coverage mapping data embedded in the test binaries, and the reduction @@ -43,7 +45,10 @@ config("default_coverage") { # tools that will be used to process the coverage output. This is because # the coverage file format is not stable. if (use_chromium_rust_toolchain) { - rustflags += [ "-Cinstrument-coverage" ] + rustflags += [ + "-Cinstrument-coverage", + "-Cllvm-args=-runtime-counter-relocation", + ] } if (is_linux || is_chromeos) { diff --git a/build/config/coverage/coverage.gni b/build/config/coverage/coverage.gni index cd4466c..803a036 100644 --- a/build/config/coverage/coverage.gni +++ b/build/config/coverage/coverage.gni @@ -4,7 +4,7 @@ import("//build/toolchain/toolchain.gni") if (is_fuchsia) { - import("//third_party/fuchsia-sdk/sdk/build/component.gni") + import("//third_party/fuchsia-gn-sdk/src/component.gni") } # There are two ways to enable code coverage instrumentation: diff --git a/build/config/cronet/config.gni b/build/config/cronet/config.gni index 0687f49..8d47435 100644 --- a/build/config/cronet/config.gni +++ b/build/config/cronet/config.gni @@ -8,10 +8,14 @@ declare_args() { # gn args to build correctly). is_cronet_build = false - # Control whether lenient compiler flags should be used. To ensure that minor - # failures in the AOSP Cronet builders do not block Chromium CLs, we will make - # these builders as lenient as possible by not treating some warnings as - # errors. Please refer to go/cronet-builders-with-mainline-clang-design for - # more information. - use_lenient_compiler_flags = false + # Controls whether cronet is currently being built for AOSP or Chromium. + # This will always be false when building Cronet for Chromium. + # the flag exists to accommodate for the divergence between the repos. + is_cronet_for_aosp_build = false +} + +if (is_cronet_for_aosp_build) { + assert( + is_cronet_build, + "`is_cronet_for_aosp_build` flag can be only enabled when `is_cronet_build` flag is enabled.") } diff --git a/build/config/features.gni b/build/config/features.gni index 122a5ea..01daff9 100644 --- a/build/config/features.gni +++ b/build/config/features.gni @@ -14,8 +14,8 @@ # There is more advice on where to put build flags in the "Build flag" section # of //build/config/BUILDCONFIG.gn. +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") -import("//build/config/chromecast_build.gni") declare_args() { # Enables proprietary codecs and demuxers; e.g. H264, AAC, MP3, and MP4. @@ -28,7 +28,8 @@ declare_args() { # # TODO(crbug.com/1314528): Remove chromecast-related conditions and force # builds to explicitly specify this. - proprietary_codecs = is_chrome_branded || is_castos || is_cast_android + proprietary_codecs = is_chrome_branded || is_castos || is_cast_android || + is_chrome_for_testing_branded # libudev usage. This currently only affects the content layer. # PATCH(build-gn): This is Chromium only. diff --git a/build/config/fuchsia/BUILD.gn b/build/config/fuchsia/BUILD.gn index 90f23de..43133d5 100644 --- a/build/config/fuchsia/BUILD.gn +++ b/build/config/fuchsia/BUILD.gn @@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") import("//build/config/clang/clang.gni") import("//build/config/fuchsia/generate_runner_scripts.gni") import("//build/config/fuchsia/gn_configs.gni") @@ -11,7 +11,7 @@ assert(is_fuchsia) assert(!is_posix, "Fuchsia is not POSIX.") config("compiler") { - configs = [ "//third_party/fuchsia-sdk/sdk/build/config:compiler" ] + configs = [ "//third_party/fuchsia-gn-sdk/src/config:compiler" ] # TODO(https://crbug.com/706592): The stack defaults to 256k on Fuchsia (see # https://fuchsia.googlesource.com/zircon/+/master/system/private/zircon/stack.h#9), diff --git a/build/config/fuchsia/OWNERS b/build/config/fuchsia/OWNERS index 12f80c5..ccf4cd9 100644 --- a/build/config/fuchsia/OWNERS +++ b/build/config/fuchsia/OWNERS @@ -1,4 +1,3 @@ file://build/fuchsia/OWNERS -chonggu@google.com zijiehe@google.com diff --git a/build/config/fuchsia/generate_runner_scripts.gni b/build/config/fuchsia/generate_runner_scripts.gni index 747fb67..6fba7f4 100644 --- a/build/config/fuchsia/generate_runner_scripts.gni +++ b/build/config/fuchsia/generate_runner_scripts.gni @@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") import("//build/config/fuchsia/config.gni") import("//build/config/fuchsia/fuchsia_package_metadata.gni") import("//build/config/gclient_args.gni") diff --git a/build/config/fuchsia/gn_configs.gni b/build/config/fuchsia/gn_configs.gni index ca9e2c6..23864de 100644 --- a/build/config/fuchsia/gn_configs.gni +++ b/build/config/fuchsia/gn_configs.gni @@ -9,7 +9,7 @@ declare_args() { # value to specify the API level the packages produced from this repository # should be targeting, e.g. in their top-level //.gn file. A value of -1 # means that no API level will be passed to the tools that consumes it. - fuchsia_target_api_level = 12 + fuchsia_target_api_level = 16 # Path to the fuchsia SDK. This is intended for use in other templates & # rules to reference the contents of the fuchsia SDK. diff --git a/build/config/fuchsia/test/README.md b/build/config/fuchsia/test/README.md index 5a81a5f..4825fff 100644 --- a/build/config/fuchsia/test/README.md +++ b/build/config/fuchsia/test/README.md @@ -48,10 +48,6 @@ Capabilities required by anything that uses `//base/test` when running in the (default) `chromium` test realm. It is the default base fragment for most `test()` Components. -The system-wide `config-data` directory capability is routed to tests running in -the realm so that individual tests may route subdirectories as needed. -TODO(crbug.com/1360077): Remove this after migrating to the new mechanism. - #### logger.shard.test-cml For tests that test logging functionality by providing `fuchsia.logger.Log`. @@ -85,10 +81,6 @@ API set. This allows tests to e.g. run with view-focus unaffected by any other tests running concurrently on the device, as well as providing test-only functionality such as input-injection support. -#### gfx_test_ui_stack.shard.test-cml -For tests that need an isolated display subsystem supporting the legacy -Scenic/GFX APIs. - ### WebEngine Fragments The following fragments are specific to WebEngine functionality as documented documentation at diff --git a/build/config/fuchsia/test/gfx_test_ui_stack.shard.test-cml b/build/config/fuchsia/test/gfx_test_ui_stack.shard.test-cml deleted file mode 100644 index 2e51f03..0000000 --- a/build/config/fuchsia/test/gfx_test_ui_stack.shard.test-cml +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Used in tests which are hard-coded for the Scenic/GFX API-set. -// Use test_ui_stack.shard.test-cml when testing for Flatland, or when the -// choice of API-set is not important. -{ - include: [ - "//build/config/fuchsia/test/sysmem.shard.test-cml", - ], - children: [ - { - name: "test_ui_stack", - url: "fuchsia-pkg://fuchsia.com/gfx-scene-manager-test-ui-stack#meta/test-ui-stack.cm", - }, - ], - offer: [ - { - protocol: [ - "fuchsia.logger.LogSink", - "fuchsia.scheduler.ProfileProvider", - "fuchsia.sysmem.Allocator", - "fuchsia.tracing.provider.Registry", - "fuchsia.vulkan.loader.Loader", - ], - from: "parent", - to: "#test_ui_stack", - }, - ], - use: [ - { - protocol: [ - "fuchsia.accessibility.semantics.SemanticsManager", - "fuchsia.element.GraphicalPresenter", - "fuchsia.ui.composition.Allocator", - "fuchsia.ui.composition.Flatland", - "fuchsia.ui.input3.Keyboard", - "fuchsia.ui.scenic.Scenic", - ], - from: "#test_ui_stack", - }, - ], - facets: { - "fuchsia.test": { - "deprecated-allowed-packages": [ "gfx-scene-manager-test-ui-stack" ], - }, - }, -} diff --git a/build/config/fuchsia/test/minimum.shard.test-cml b/build/config/fuchsia/test/minimum.shard.test-cml index 17b4927..6f0fed9 100644 --- a/build/config/fuchsia/test/minimum.shard.test-cml +++ b/build/config/fuchsia/test/minimum.shard.test-cml @@ -24,10 +24,13 @@ } ], use: [ + // Holds ICU time zone data files. + // See: + // https://fuchsia.dev/fuchsia-src/concepts/process/namespaces?typical_directory_structure { - directory: "config-data", + directory: "tzdata-icu", rights: [ "r*" ], - path: "/config/data", + path: "/config/tzdata/icu", }, { storage: "cache", diff --git a/build/config/fuchsia/test/present_view.shard.test-cml b/build/config/fuchsia/test/present_view.shard.test-cml index 4e15ad5..5bc96ec 100644 --- a/build/config/fuchsia/test/present_view.shard.test-cml +++ b/build/config/fuchsia/test/present_view.shard.test-cml @@ -27,7 +27,6 @@ protocol: [ "fuchsia.ui.composition.Allocator", "fuchsia.ui.composition.Flatland", - "fuchsia.ui.scenic.Scenic", ], }, { diff --git a/build/config/fuchsia/test/system_test_minimum.shard.test-cml b/build/config/fuchsia/test/system_test_minimum.shard.test-cml index 6efde20..46aeada 100644 --- a/build/config/fuchsia/test/system_test_minimum.shard.test-cml +++ b/build/config/fuchsia/test/system_test_minimum.shard.test-cml @@ -7,9 +7,9 @@ ], use: [ { - directory: "config-data", + directory: "tzdata-icu", rights: [ "r*" ], - path: "/config/data", + path: "/config/tzdata/icu", }, { storage: "cache", diff --git a/build/config/fuchsia/test/test_ui_stack.shard.test-cml b/build/config/fuchsia/test/test_ui_stack.shard.test-cml index 102867c..05c25f5 100644 --- a/build/config/fuchsia/test/test_ui_stack.shard.test-cml +++ b/build/config/fuchsia/test/test_ui_stack.shard.test-cml @@ -17,7 +17,6 @@ "fuchsia.ui.composition.Allocator", "fuchsia.ui.composition.Flatland", "fuchsia.ui.input3.Keyboard", - "fuchsia.ui.scenic.Scenic", ], from: "#test_ui_stack", }, diff --git a/build/config/gclient_args.gni b/build/config/gclient_args.gni index 410955b..4e64159 100644 --- a/build/config/gclient_args.gni +++ b/build/config/gclient_args.gni @@ -7,9 +7,8 @@ checkout_android_native_support = false checkout_clang_coverage_tools = false checkout_ios_webkit = false checkout_nacl = false -checkout_openxr = false -checkout_rts_model = false +checkout_openxr = true checkout_src_internal = false cros_boards = "" cros_boards_with_qemu_images = "" -generate_location_tags = false \ No newline at end of file +generate_location_tags = true \ No newline at end of file diff --git a/build/config/ios/BUILD.gn b/build/config/ios/BUILD.gn index 8881312..bddf5bd 100644 --- a/build/config/ios/BUILD.gn +++ b/build/config/ios/BUILD.gn @@ -6,6 +6,7 @@ import("//build/config/ios/ios_sdk.gni") import("//build/toolchain/apple/toolchain.gni") import("//build/toolchain/goma.gni") import("//build/toolchain/rbe.gni") +import("//build/toolchain/siso.gni") import("//build/toolchain/toolchain.gni") import("//build_overrides/build.gni") @@ -63,10 +64,6 @@ config("compiler") { ] cflags_objcc = [ - # Without this, the constructors and destructors of a C++ object inside - # an Objective C struct won't be called, which is very bad. - "-fobjc-call-cxx-cdtors", - # When using -std=c++20 or higher, clang automatically returns true for # `__has_feature(modules)` as it enables cxx modules. This is problematic # because Objective-C code uses this to detect whether `@import` can be @@ -91,6 +88,7 @@ config("compiler") { if (ios_is_app_extension) { ldflags += [ "-fapplication-extension" ] + cflags += [ "-fapplication-extension" ] } } @@ -104,7 +102,7 @@ config("runtime_library") { # Rebase the value in that case since gn does not convert paths in compiler # flags (since it is not aware they are paths). _sdk_root = ios_sdk_path - if (use_system_xcode && (use_goma || use_remoteexec)) { + if (use_system_xcode && (use_goma || use_remoteexec || use_siso)) { _sdk_root = rebase_path(ios_sdk_path, root_build_dir) } @@ -267,7 +265,7 @@ _xctrunner_path = # # To workaround this, add a target that pretends to create those files # (but does nothing). See https://crbug.com/1061487 for why this is needed. -if (use_system_xcode && (use_goma || use_remoteexec)) { +if (use_system_xcode && (use_goma || use_remoteexec || use_siso)) { action("copy_xctrunner_app") { testonly = true script = "//build/noop.py" @@ -299,7 +297,7 @@ action("xctest_runner_without_arm64e") { # When running under ASan, the ASan runtime library must be packaged alongside # the test runner binary. deps = [ "//build/config/sanitizers:deps" ] - if (use_system_xcode && (use_goma || use_remoteexec)) { + if (use_system_xcode && (use_goma || use_remoteexec || use_siso)) { deps += [ ":copy_xctrunner_app" ] } } diff --git a/build/config/ios/generate_umbrella_header.py b/build/config/ios/generate_umbrella_header.py index 943c49c..587ff17 100644 --- a/build/config/ios/generate_umbrella_header.py +++ b/build/config/ios/generate_umbrella_header.py @@ -12,7 +12,7 @@ HEADER_TEMPLATE = string.Template('''\ -// Copyright $year The Chromium Authors. All rights reserved. +// Copyright $year The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // diff --git a/build/config/ios/ios_sdk.gni b/build/config/ios/ios_sdk.gni index 65aee82..f8bc903 100644 --- a/build/config/ios/ios_sdk.gni +++ b/build/config/ios/ios_sdk.gni @@ -6,6 +6,7 @@ import("//build/config/ios/config.gni") import("//build/config/ios/ios_sdk_overrides.gni") import("//build/toolchain/goma.gni") import("//build/toolchain/rbe.gni") +import("//build/toolchain/siso.gni") import("//build/toolchain/toolchain.gni") import("//build_overrides/build.gni") @@ -52,9 +53,6 @@ declare_args() { # identity description and app bundle id prefix. ios_mobileprovision_files = [] - # Set to true if all test apps should use the same bundle id. - ios_use_shared_bundle_id_for_test_apps = true - # Set to true if building an app extension. ios_is_app_extension = false } @@ -97,7 +95,7 @@ if (ios_sdk_path == "") { ios_sdk_developer_dir, ] } - if (use_system_xcode && (use_goma || use_remoteexec)) { + if (use_system_xcode && (use_goma || use_remoteexec || use_siso)) { ios_sdk_info_args += [ "--create_symlink_at", "sdk/xcode_links", @@ -144,7 +142,15 @@ if (target_environment == "device" && ios_enable_code_signing) { } } -if (ios_use_shared_bundle_id_for_test_apps) { - shared_bundle_id_for_test_apps = - "$ios_app_bundle_id_prefix.chrome.unittests.dev" -} +# As entitlements are tied to a specific bundle identifier, all the +# test application on iOS share the same identifier. This simplify +# adding new test application (since there is no need to investigate +# which entitlements they need, nor to wait for the mobile provision +# with those entitlements to be generated by Apple and then deployed +# to the infrastructure, ...). The drawback is that since only one +# test application can be installed at a time on a device/simulator +# (as the bundle identifier uniquely identify an application for iOS). +# +# This variable corresponds to the test bundle identifier. +shared_bundle_id_for_test_apps = + "$ios_app_bundle_id_prefix.chrome.unittests.dev" diff --git a/build/config/ios/ios_test_runner_wrapper.gni b/build/config/ios/ios_test_runner_wrapper.gni index 378323c..8184010 100644 --- a/build/config/ios/ios_test_runner_wrapper.gni +++ b/build/config/ios/ios_test_runner_wrapper.gni @@ -13,6 +13,10 @@ import("//build/util/generate_wrapper.gni") # # Arguments: # +# clones +# (optional) number of ios simulator clones to execute tests on +# in parallel +# # data # (optional, default [ "//ios/build/bots/scripts/" ]) list of files or # directories required to run target @@ -30,8 +34,9 @@ import("//build/util/generate_wrapper.gni") # (optional, default 3) number of retry attempts # # shards -# (optional, default 1) number of shards to execute tests in parallel. not -# the same as swarming shards. +# (optional) number of ios simulator clones to execute tests in parallel. not +# the same as swarming shards. Only used if clones is not provided. Will be +# deprecated. # # wrapper_output_name # (optional, default "run_${target_name}") name of the wrapper script @@ -84,14 +89,13 @@ template("ios_test_runner_wrapper") { "${retries}", ] - # Default shards to 1 - if (!defined(shards)) { - shards = 1 + # Clones is not required by test runner so only pass if defined. + if (defined(clones)) { + executable_args += [ + "--clones", + "${clones}", + ] } - executable_args += [ - "--shards", - "${shards}", - ] if (xcode_version_int >= 1400) { executable_args += [ diff --git a/build/config/ios/ios_test_runner_xcuitest.gni b/build/config/ios/ios_test_runner_xcuitest.gni index 6aeb08b..0ca8826 100644 --- a/build/config/ios/ios_test_runner_xcuitest.gni +++ b/build/config/ios/ios_test_runner_xcuitest.gni @@ -37,12 +37,12 @@ template("ios_test_runner_xcuitest") { ios_test_runner_wrapper(target_name) { forward_variables_from(invoker, [ + "clones", "data", "data_deps", "deps", "executable_args", "retries", - "shards", "xcode_test_application_name", ]) _root_build_dir = rebase_path("${root_build_dir}", root_build_dir) diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni index 9cb3002..5d0dbc7 100644 --- a/build/config/ios/rules.gni +++ b/build/config/ios/rules.gni @@ -8,6 +8,7 @@ import("//build/config/compiler/compiler.gni") import("//build/config/ios/ios_sdk.gni") import("//build/toolchain/goma.gni") import("//build/toolchain/rbe.gni") +import("//build/toolchain/siso.gni") import("//build/toolchain/toolchain.gni") import("//build_overrides/build.gni") @@ -340,7 +341,7 @@ template("create_signed_bundle") { # rebase_path here unless using Goma RBE and system Xcode (as in that # case the system framework are found via a symlink in root_build_dir). foreach(_framework, invoker.extra_system_frameworks) { - if (use_system_xcode && (use_goma || use_remoteexec)) { + if (use_system_xcode && (use_goma || use_remoteexec || use_siso)) { _framework_path = rebase_path(_framework, root_build_dir) } else { _framework_path = _framework @@ -501,6 +502,10 @@ template("ios_info_plist") { # if omitted. Will be used to set BUNDLE_IDENTIFIER when generating # the application Info.plist # +# orderfile_path: +# (optional) string, path to an orderfile passed to the linker in order +# to improve application launch performance. +# # For more information, see "gn help executable". template("ios_app_bundle") { _output_name = target_name @@ -606,6 +611,22 @@ template("ios_app_bundle") { visibility += [ ":${_variant.target_name}" ] } + if (defined(invoker.orderfile_path)) { + orderfile_path = invoker.orderfile_path + if (!defined(ldflags)) { + ldflags = [] + } + ldflags += [ + "-Wl,-order_file", + "-Wl," + rebase_path(orderfile_path, root_build_dir), + ] + + if (!defined(inputs)) { + inputs = [] + } + inputs += [ orderfile_path ] + } + if (target_environment == "simulator") { if (!defined(deps)) { deps = [] @@ -1722,7 +1743,7 @@ template("ios_xcuitest_test_runner_bundle") { "-o=" + rebase_path(_output_name, root_build_dir), ] + rebase_path(sources, root_build_dir) - if (use_system_xcode && (use_goma || use_remoteexec)) { + if (use_system_xcode && (use_goma || use_remoteexec || use_siso)) { deps = [ "//build/config/ios:copy_xctrunner_app" ] } } @@ -1755,7 +1776,7 @@ template("ios_xcuitest_test_runner_bundle") { outputs = [ "{{bundle_contents_dir}}/PkgInfo" ] - if (use_system_xcode && (use_goma || use_remoteexec)) { + if (use_system_xcode && (use_goma || use_remoteexec || use_siso)) { public_deps = [ "//build/config/ios:copy_xctrunner_app" ] } } diff --git a/build/config/linux/atspi2/BUILD.gn b/build/config/linux/atspi2/BUILD.gn index 51b6d33..30bc77f 100644 --- a/build/config/linux/atspi2/BUILD.gn +++ b/build/config/linux/atspi2/BUILD.gn @@ -17,13 +17,30 @@ if (use_atk) { "--version-as-components", ], "value") - atspi_major_version = atspi_version[0] - atspi_minor_version = atspi_version[1] - atspi_micro_version = atspi_version[2] - defines = [ - "ATSPI_MAJOR_VERSION=$atspi_major_version", - "ATSPI_MINOR_VERSION=$atspi_minor_version", - "ATSPI_MICRO_VERSION=$atspi_micro_version", - ] + major = atspi_version[0] + minor = atspi_version[1] + micro = atspi_version[2] + + # These aren't necessarily used if atspi is not old enough to require them. + # Also, gn considers variables unused if the only use of them is + # short-circuited away, so for example if major == 2 and minor == 48, micro + # would be unused. + not_needed([ + "major", + "minor", + "micro", + ]) + + # ATSPI 2.49.90 now defines these for us and it's an error for us to + # redefine them on the compiler command line. + # See ATSPI 927344a34cd5bf81fc64da4968241735ecb4f03b + if (major < 2 || (major == 2 && minor < 49) || + (major == 2 && minor == 49 && micro < 90)) { + defines = [ + "ATSPI_MAJOR_VERSION=$major", + "ATSPI_MINOR_VERSION=$minor", + "ATSPI_MICRO_VERSION=$micro", + ] + } } } diff --git a/build/config/linux/libdrm/BUILD.gn b/build/config/linux/libdrm/BUILD.gn index 31ab0d8..a37bd24 100644 --- a/build/config/linux/libdrm/BUILD.gn +++ b/build/config/linux/libdrm/BUILD.gn @@ -1,7 +1,7 @@ # Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") import("//build/config/chromeos/args.gni") import("//build/config/linux/pkg_config.gni") diff --git a/build/config/linux/libffi/BUILD.gn b/build/config/linux/libffi/BUILD.gn index 771170c..6e45f4c 100644 --- a/build/config/linux/libffi/BUILD.gn +++ b/build/config/linux/libffi/BUILD.gn @@ -19,6 +19,6 @@ if (use_system_libffi) { } } else { config("libffi") { - libs = [ ":libffi_pic.a" ] + libs = [ "ffi_pic" ] } } diff --git a/build/config/linux/pkg-config.py b/build/config/linux/pkg-config.py index 2e38c7f..4f67c16 100755 --- a/build/config/linux/pkg-config.py +++ b/build/config/linux/pkg-config.py @@ -79,7 +79,7 @@ def GetPkgConfigPrefixToStrip(options, args): # from pkg-config's |prefix| variable. prefix = subprocess.check_output([options.pkg_config, "--variable=prefix"] + args, env=os.environ).decode('utf-8') - if prefix[-4] == '/usr': + if prefix[:4] == '/usr': return prefix[4:] return prefix diff --git a/build/config/linux/pkg_config.gni b/build/config/linux/pkg_config.gni index 0d87390..591afd7 100644 --- a/build/config/linux/pkg_config.gni +++ b/build/config/linux/pkg_config.gni @@ -105,13 +105,13 @@ template("pkg_config") { cflags = pkgresult[1] foreach(include, pkgresult[0]) { + # We want the system include paths to use -isystem instead of -I to + # suppress warnings in those headers. if (use_sysroot) { - # We want the system include paths to use -isystem instead of -I to - # suppress warnings in those headers. include_relativized = rebase_path(include, root_build_dir) cflags += [ "-isystem$include_relativized" ] } else { - cflags += [ "-I$include" ] + cflags += [ "-isystem$include" ] } } diff --git a/build/config/logging.gni b/build/config/logging.gni index a08195b..54ce517 100644 --- a/build/config/logging.gni +++ b/build/config/logging.gni @@ -2,7 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/buildflag_header.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/dcheck_always_on.gni") @@ -11,22 +10,4 @@ declare_args() { enable_log_error_not_reached = is_chromeos_ash && !(is_debug || dcheck_always_on) enable_stack_trace_line_numbers = false - - # Use runtime vlog everywhere except for ash-chrome. - # When `use_runtime_vlog` is true, - # command line switch `--vmodule=xxx` or `--v=x` could be used to - # control vlog level at runtime. - # when `use_runtime_volog` is false, - # verbose log level is controlled by `ENABLE_VLOG_LEVEL` macro. VLOG(n) - # is kept and generate output if `n` is less than or equal to the vlog - # level defined by the macro. - # Command line switch `--vmodule=xxx`, or `--v=x` would have no effect. - # - # Runtime vlog is used everywhere except on ash-chrome. - # Ash-chrome has a few vmodule patterns that need to be used indefinitely - # to investigate problems from logs in feedback reports. These vmodule - # patterns are using too much cpu cycles (see http://crbug/489441). Turning - # off runtime vlog and using build time vlog would avoid paying that cpu tax - # and have a nice side effect of a smaller production binary. - use_runtime_vlog = !is_chromeos_ash } diff --git a/build/config/loongarch64.gni b/build/config/loongarch64.gni index 32aedbc..9a95ec9 100644 --- a/build/config/loongarch64.gni +++ b/build/config/loongarch64.gni @@ -1,4 +1,4 @@ -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. diff --git a/build/config/mac/BUILD.gn b/build/config/mac/BUILD.gn index 7af3124..73f50ea 100644 --- a/build/config/mac/BUILD.gn +++ b/build/config/mac/BUILD.gn @@ -8,6 +8,7 @@ import("//build/config/mac/mac_sdk.gni") import("//build/config/sysroot.gni") import("//build/toolchain/goma.gni") import("//build/toolchain/rbe.gni") +import("//build/toolchain/siso.gni") # This is included by reference in the //build/config/compiler config that # is applied to all targets. It is here to separate out the logic. @@ -25,14 +26,7 @@ config("compiler") { } else { assert(false, "unknown current_cpu $current_cpu") } - if (host_os == "mac") { - common_mac_flags += [ - "-arch", - clang_arch, - ] - } else { - common_mac_flags += [ "--target=$clang_arch-apple-macos" ] - } + common_mac_flags += [ "--target=$clang_arch-apple-macos" ] # This is here so that all files get recompiled after an Xcode update. # (defines are passed via the command line, and build system rebuild things @@ -42,10 +36,6 @@ config("compiler") { asmflags = common_mac_flags cflags = common_mac_flags - # Without this, the constructors and destructors of a C++ object inside - # an Objective C struct won't be called, which is very bad. - cflags_objcc = [ "-fobjc-call-cxx-cdtors" ] - ldflags = common_mac_flags if (save_unstripped_output) { @@ -110,8 +100,8 @@ config("mac_dynamic_flags") { # # The symbolic link for $mac_sdk_path is set up by # //build/config/apple/sdk_info.py in //build/config/mac/mac_sdk.gni. -if (use_system_xcode && (use_goma || use_remoteexec) && target_os == "mac" && - current_toolchain == default_toolchain) { +if (use_system_xcode && (use_goma || use_remoteexec || use_siso) && + target_os == "mac" && current_toolchain == default_toolchain) { action("sdk_inputs") { script = "//build/noop.py" outputs = [ diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni index 546a27e..32b5137 100644 --- a/build/config/mac/mac_sdk.gni +++ b/build/config/mac/mac_sdk.gni @@ -7,6 +7,7 @@ import("//build/config/gclient_args.gni") import("//build/config/mac/mac_sdk_overrides.gni") import("//build/toolchain/goma.gni") import("//build/toolchain/rbe.gni") +import("//build/toolchain/siso.gni") import("//build/toolchain/toolchain.gni") assert( @@ -47,12 +48,12 @@ declare_args() { # The SDK version used when making official builds. This is a single exact # version, not a minimum. If this version isn't available official builds # will fail. - mac_sdk_official_version = "13.3" + mac_sdk_official_version = "14.0" # The SDK build version used when making official builds. This is a single # exact version found at "System/Library/CoreServices/SystemVersion.plist" # inside the SDK. - mac_sdk_official_build_version = "21E226" + mac_sdk_official_build_version = "23A334" # Production builds should use hermetic Xcode. If you want to do production # builds with system Xcode to test new SDKs, set this. @@ -94,7 +95,7 @@ if (!use_system_xcode) { # Goma RBE requires paths relative to source directory. When using system # Xcode, this is done by creating symbolic links in root_build_dir. -if (use_system_xcode && (use_goma || use_remoteexec)) { +if (use_system_xcode && (use_goma || use_remoteexec || use_siso)) { sdk_info_args += [ "--get_sdk_info", "--create_symlink_at", @@ -108,7 +109,8 @@ sdk_info_args += [ mac_sdk_name ] _mac_sdk_result = exec_script(script_name, sdk_info_args, "scope") xcode_version = _mac_sdk_result.xcode_version xcode_build = _mac_sdk_result.xcode_build -if (mac_sdk_path == "" && use_system_xcode && (use_goma || use_remoteexec)) { +if (mac_sdk_path == "" && use_system_xcode && + (use_goma || use_remoteexec || use_siso)) { mac_sdk_path = _mac_sdk_result.sdk_path } diff --git a/build/config/ozone.gni b/build/config/ozone.gni index 8bb512a..8a3bc28 100644 --- a/build/config/ozone.gni +++ b/build/config/ozone.gni @@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/toolchain/toolchain.gni") @@ -48,9 +48,6 @@ declare_args() { # Compile the 'headless' platform. ozone_platform_headless = false - # Compile the 'scenic' platform. - ozone_platform_scenic = false - # Compile the 'flatland' platform. ozone_platform_flatland = false @@ -93,7 +90,6 @@ declare_args() { ozone_platform_x11 = true } else if (is_fuchsia) { ozone_platform = "flatland" - ozone_platform_scenic = true ozone_platform_flatland = true } } @@ -113,11 +109,11 @@ _ozone_extra_directory = get_path_info(ozone_extra_path, "dir") ozone_external_platform_visibility = [ "$_ozone_extra_directory/*" ] if (is_a_target_toolchain) { - assert(use_ozone || !(ozone_platform_cast || ozone_platform_drm || - ozone_platform_flatland || - ozone_platform_headless || ozone_platform_x11 || - ozone_platform_wayland || ozone_platform_scenic), - "Must set use_ozone to select ozone platforms") + assert( + use_ozone || !(ozone_platform_cast || ozone_platform_drm || + ozone_platform_flatland || ozone_platform_headless || + ozone_platform_x11 || ozone_platform_wayland), + "Must set use_ozone to select ozone platforms") } # TODO(petermcneeley): Backwards compatiblity support for VM images. diff --git a/build/config/riscv.gni b/build/config/riscv.gni index 5f93266..595b461 100644 --- a/build/config/riscv.gni +++ b/build/config/riscv.gni @@ -1,4 +1,4 @@ -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -16,5 +16,16 @@ if (current_cpu == "riscv64" || v8_current_cpu == "riscv64" || # 512 # 1024 riscv_rvv_vlen = 128 + + # RISCV profile compilation flag. Possible values are: + # rv64gc + # rvau22 + riscv_profile = "rv64gc" + + # RISCV B extension compilation flag. + # See https://github.com/riscv/riscv-bitmanip/blob/main/bitmanip/bitmanip.adoc#colophon + riscv_use_zba = false + riscv_use_zbb = false + riscv_use_zbs = false } } diff --git a/build/config/rts.gni b/build/config/rts.gni deleted file mode 100644 index 677b3fa..0000000 --- a/build/config/rts.gni +++ /dev/null @@ -1,5 +0,0 @@ -declare_args() { - # For more info about RTS, please see - # //docs/testing/regression-test-selection.md - use_rts = false -} diff --git a/build/config/rust.gni b/build/config/rust.gni index d74ff44..9b0ee75 100644 --- a/build/config/rust.gni +++ b/build/config/rust.gni @@ -24,8 +24,24 @@ declare_args() { # Chromium-based projects that are built for for architectures Chrome does not # support may need to disable this as well, though they may need to replace # code with C/C++ to get a functional product. - # PATCH(build-gn): Do not have time to support rust yet. - enable_rust = false + enable_rust = build_with_chromium + + # The CXX tool is in //third_party/rust which is not shared with downstream + # projects yet. So they need to copy the required dependencies and GN files + # into their project to enable CXX there. + enable_cxx = build_with_chromium + + # The chromium prelude crate provides the `chromium::import!` macro which + # is needed to depend on first-party rust libraries. Third-party libraries + # are specified with cargo_crate and do not get imported through this macro. + # + # The macro requires //third_party/rust for syn, quote, and proc_macro2. + # Downstream projects that want to use //build for the rust GN templates but + # don't want to enable the chromium prelude can disable it here, and should + # specify a globally unique `crate_name` in their rust library GN rules + # instead. Note that using a `crate_name` is strongly discouraged inside + # Chromium, and is also discouraged for downstream projects when possible. + enable_chromium_prelude = build_with_chromium # As we incrementally enable Rust on mainstream builders, we want to enable # the toolchain (by switching 'enable_rust' to true) while still disabling @@ -33,8 +49,7 @@ declare_args() { # all Rust features enabled. enable_all_rust_features = false - # Chromium provides a Rust toolchain in //third_party/rust-toolchain when - # checkout_rust is True (which is being rolled out by default over time). + # Chromium provides a Rust toolchain in //third_party/rust-toolchain. # # To use a custom toolchain instead, specify an absolute path to the root of # a Rust sysroot, which will have a 'bin' directory and others. Commonly @@ -51,6 +66,17 @@ declare_args() { # you can specify whether it supports nacl here. rust_toolchain_supports_nacl = false + # Whether artifacts produced by the Rust compiler can participate in ThinLTO. + # + # One important consideration is whether the linker uses the same LLVM + # version as `rustc` (i.e. if it can understand the LLVM-IR from the + # compilation artifacts produced by `rustc`). In LaCrOS and ash builds this + # may not be true - see b/299483903. + # + # TODO(https://crbug.com/1482525): Re-enable ThinLTO for Rust on LaCrOS + # TODO(b/300937673): Re-enable ThinLTO for Rust on ash-chrome + toolchain_supports_rust_thin_lto = !is_chromeos + # Any extra std rlibs in your Rust toolchain, relative to the standard # Rust toolchain. Typically used with 'rust_sysroot_absolute' added_rust_stdlib_libs = [] @@ -80,10 +106,7 @@ declare_args() { # Individual Rust components. # Conversions between Rust types and C++ types. - # - # TODO(crbug.com/1463749): Enable on ChromeOS. - enable_rust_base_conversions = - enable_rust && (!(is_chromeos || is_ios) || enable_all_rust_features) + enable_rust_base_conversions = enable_rust # The base::JSONReader implementation. Requires base conversions. enable_rust_json = enable_rust && enable_all_rust_features @@ -91,16 +114,6 @@ declare_args() { # Support for chrome://crash-rust to check crash dump collection works. enable_rust_crash = enable_rust - # Support for QR code generation - see https://crbug.com/1431991. - # - # Per go/rusty-qr-code-generator the feature is not actually used on iOS, but - # `is_ios` below is checked for parity with `enable_rust_base_conversions` - # (which is a dependency of `enable_rust_qr`). - # - # TODO(crbug.com/1463749): Enable on ChromeOS. - enable_rust_qr = - enable_rust && (!(is_chromeos || is_ios) || enable_all_rust_features) - # Support for Rust mojo bindings. enable_rust_mojo = enable_rust && enable_all_rust_features @@ -108,7 +121,10 @@ declare_args() { enable_rust_gtest_interop = enable_rust # Enable Boringssl Rust bindings generation - enable_rust_boringssl = enable_rust && enable_all_rust_features + enable_rust_boringssl = enable_rust + + # Enable experimental Fontations Rust font stack. + use_typeface_fontations = enable_rust } # Use the Rust toolchain built in-tree. When false, we use the prebuilt Rust diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn index a3426ea..8cda968 100644 --- a/build/config/sanitizers/BUILD.gn +++ b/build/config/sanitizers/BUILD.gn @@ -2,9 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") -import("//build/config/chromecast_build.gni") import("//build/config/clang/clang.gni") +import("//build/config/rust.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build/toolchain/toolchain.gni") import("//build_overrides/build.gni") @@ -48,15 +49,15 @@ group("deps") { if (fail_on_san_warnings) { data += [ "//tools/memory/sanitizer/escalate_sanitizer_warnings.py" ] } - if (is_asan) { + if (is_asan || is_ubsan || is_ubsan_vptr || is_ubsan_security) { if (is_win || is_apple) { - data_deps = [ ":copy_asan_runtime" ] + data_deps = [ ":copy_sanitizer_runtime" ] } if (is_apple) { - public_deps = [ ":asan_runtime_bundle_data" ] + public_deps = [ ":sanitizer_runtime_bundle_data" ] } } - if (use_centipede) { + if (use_centipede || enable_fuzztest_fuzz) { # For executables which aren't actual fuzzers, we need stubs for # the sanitizer coverage symbols, because we'll still be generating # .o files which depend on them. @@ -67,27 +68,43 @@ group("deps") { assert(!(is_win && is_asan && current_cpu == "x86"), "ASan is only supported in 64-bit builds on Windows.") -if ((is_apple || is_win) && is_asan) { +if ((is_apple || is_win) && + (is_asan || is_ubsan || is_ubsan_vptr || is_ubsan_security)) { if (is_mac || (is_ios && target_environment == "catalyst")) { - _clang_rt_dso_path = "darwin/libclang_rt.asan_osx_dynamic.dylib" + if (is_asan) { + _clang_rt_dso_path = "darwin/libclang_rt.asan_osx_dynamic.dylib" + } else { + assert(is_ubsan || is_ubsan_vptr || is_ubsan_security) + _clang_rt_dso_path = "darwin/libclang_rt.ubsan_osx_dynamic.dylib" + } } else if (is_ios) { - _clang_rt_dso_path = "darwin/libclang_rt.asan_iossim_dynamic.dylib" + if (is_asan) { + _clang_rt_dso_path = "darwin/libclang_rt.asan_iossim_dynamic.dylib" + } else { + assert(is_ubsan || is_ubsan_vptr || is_ubsan_security) + _clang_rt_dso_path = "darwin/libclang_rt.ubsan_iossim_dynamic.dylib" + } } else if (is_win && current_cpu == "x64") { - _clang_rt_dso_path = "windows/clang_rt.asan_dynamic-x86_64.dll" + if (is_asan) { + _clang_rt_dso_path = "windows/clang_rt.asan_dynamic-x86_64.dll" + } else { + assert(is_ubsan || is_ubsan_vptr || is_ubsan_security) + _clang_rt_dso_path = "windows/clang_rt.ubsan_dynamic-x86_64.dll" + } } _clang_rt_dso_full_path = "$clang_base_path/lib/clang/$clang_version/lib/$_clang_rt_dso_path" if (!is_ios) { - copy("copy_asan_runtime") { + copy("copy_sanitizer_runtime") { sources = [ _clang_rt_dso_full_path ] outputs = [ "$root_out_dir/{{source_file_part}}" ] } } else { # On iOS, the runtime library need to be code signed (adhoc signature) # starting with Xcode 8, so use an action instead of a copy on iOS. - action("copy_asan_runtime") { + action("copy_sanitizer_runtime") { script = "//build/config/ios/codesign.py" sources = [ _clang_rt_dso_full_path ] outputs = [ "$root_out_dir/" + get_path_info(sources[0], "file") ] @@ -101,10 +118,10 @@ if ((is_apple || is_win) && is_asan) { } if (is_apple) { - bundle_data("asan_runtime_bundle_data") { - sources = get_target_outputs(":copy_asan_runtime") + bundle_data("sanitizer_runtime_bundle_data") { + sources = get_target_outputs(":copy_sanitizer_runtime") outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ] - public_deps = [ ":copy_asan_runtime" ] + public_deps = [ ":copy_sanitizer_runtime" ] } } } @@ -285,7 +302,7 @@ config("asan_flags") { # odr-violation errors in rust code, and link failures for cros/asan. # Clang recently turned it on by default for all ELF targets (it was # already on for Fuchsia). Pass the flag to turn it back off. - cflags += ["-fno-sanitize-address-globals-dead-stripping"] + cflags += [ "-fno-sanitize-address-globals-dead-stripping" ] } if (is_win) { if (!defined(asan_win_blocklist_path)) { @@ -324,14 +341,19 @@ config("cfi_flags") { "-fsanitize-ignorelist=$cfi_ignorelist_path", ] - # sanitize=cfi implies -fsplit-lto-unit, and Rust needs to match - # behaviour. Rust needs to know the linker will be doing LTO in this case - # or it rejects the Zsplit-lto-unit flag. - # TODO(crbug.com/1442331): Add -Zsanitize=cfi instead. - rustflags += [ - "-Zsplit-lto-unit", - "-Clinker-plugin-lto=yes", - ] + if (toolchain_supports_rust_thin_lto) { + # sanitize=cfi implies -fsplit-lto-unit, and Rust needs to match + # behaviour. Rust needs to know the linker will be doing LTO in this case + # or it rejects the Zsplit-lto-unit flag. + # TODO(crbug.com/1442331): Add -Zsanitize=cfi instead. + rustflags += [ + "-Zsplit-lto-unit", + "-Clinker-plugin-lto=yes", + ] + } else { + # Don't include bitcode if it won't be used. + rustflags += [ "-Cembed-bitcode=no" ] + } if (use_cfi_cast) { cflags += [ @@ -411,6 +433,10 @@ config("coverage_flags") { ] } } + if (sanitizer_coverage_allowlist != "") { + cflags += [ "-fsanitize-coverage-allowlist=" + + rebase_path(sanitizer_coverage_allowlist, root_build_dir) ] + } } } @@ -470,12 +496,17 @@ config("ubsan_flags") { ubsan_ignorelist_path = rebase_path("//tools/ubsan/ignorelist.txt", root_build_dir) } + + # TODO(crbug.com/1502579): Enable all of -fsanitize=undefined. Note that + # both this list and Clang's defaults omit -fsanitize=float-divide-by-zero. + # C and C++ leave it undefined to accommodate non-IEEE floating point, but + # we assume the compiler implements IEEE floating point, which does define + # division by zero. cflags += [ "-fsanitize=alignment", "-fsanitize=bool", "-fsanitize=bounds", "-fsanitize=builtin", - "-fsanitize=float-divide-by-zero", "-fsanitize=integer-divide-by-zero", "-fsanitize=null", "-fsanitize=nonnull-attribute", @@ -544,7 +575,7 @@ config("ubsan_vptr_flags") { } config("fuzzing_build_mode") { - if (use_fuzzing_engine && optimize_for_fuzzing) { + if (use_fuzzing_engine) { defines = [ "FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION" ] } } diff --git a/build/config/sanitizers/OWNERS b/build/config/sanitizers/OWNERS index 331e8bc..2f8c6f2 100644 --- a/build/config/sanitizers/OWNERS +++ b/build/config/sanitizers/OWNERS @@ -1 +1 @@ -metzman@chromium.org +file://testing/libfuzzer/OWNERS diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni index 1123559..1b035ca 100644 --- a/build/config/sanitizers/sanitizers.gni +++ b/build/config/sanitizers/sanitizers.gni @@ -2,8 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") -import("//build/config/chromecast_build.gni") import("//build/config/chromeos/args.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/profiling/profiling.gni") @@ -85,10 +85,6 @@ declare_args() { # Not for client use. disable_libfuzzer = false - # Optimize for coverage guided fuzzing (balance between speed and number of - # branches). Can be also used to remove non-determinism and other issues. - optimize_for_fuzzing = false - # Value for -fsanitize-coverage flag. Setting this causes # use_sanitizer_coverage to be enabled. # This flag is not used for libFuzzer (use_libfuzzer=true). Instead, we use: @@ -99,6 +95,10 @@ declare_args() { # trace-pc-guard,indirect-calls sanitizer_coverage_flags = "" + # A sanitizer coverage allowlist, specifying exactly which + # files or symbol names should be instrumented, rather than all of them. + sanitizer_coverage_allowlist = "" + # When enabled, only relevant sanitizer defines are set, but compilation # happens with no extra flags. This is useful when in component build # enabling sanitizers only in some of the components. @@ -109,6 +109,13 @@ declare_args() { # When true, sanitizer warnings will cause test case failures. fail_on_san_warnings = false + + # The fuzztest library builds only on some platforms, so for now, + # all targets depending on fuzztest need to be configured according + # to this. + # TODO(crbug.com/1494445): remove this when all build permutations + # work + fuzztest_supported = !(is_win && is_component_build) } declare_args() { @@ -121,9 +128,40 @@ declare_args() { is_ubsan_vptr = is_ubsan_security } +declare_args() { + # Builds fuzztest test executables such that they support the + # --fuzz= argument, which requires some sanitizer coverage. + # We want to enable this only when we're *NOT* using a fuzzing + # engine such as libfuzzer or centipede. It's generally a + # useful option, but it requires sanitizer coverage, and that + # could conceivably disrupt normal unit testing workflows, so we'll + # enable it by default only in sanitizer builds. + # Also be sure not to enable this on non-Chromium builds where + # the required //third_party/fuzztest dependency may be absent. + # TODO(crbug.com/1495713): enable on component builds + enable_fuzztest_fuzz = + !(use_libfuzzer || use_afl || use_centipede || + use_external_fuzzing_engine) && + (is_asan || is_hwasan || is_lsan || is_tsan || is_msan || is_ubsan || + is_ubsan_vptr || is_ubsan_security) && !is_component_build && is_linux && + build_with_chromium +} + assert(!is_hwasan || (target_os == "android" && target_cpu == "arm64"), "HWASan only supported on Android ARM64 builds.") +assert( + !(enable_fuzztest_fuzz && use_libfuzzer), + "Can't specify enable_fuzztest_fuzz and use_libfuzzer. When libfuzzer is enabled, fuzztest executables automatically support --fuzz but provide output that's libfuzzer compatible.") + +assert( + !(enable_fuzztest_fuzz && use_centipede), + "Can't specify enable_fuzztest_fuzz and use_centipede. The same binaries are built in a different mode to add centipede support.") + +assert( + !(enable_fuzztest_fuzz && is_component_build), + "Can't specify enable_fuzztest_fuzz in component builds; fuzztest doesn't yet support it. Consider using use_libfuzzer=true instead which provides superficially similar functionality.") + # Disable sanitizers for non-target toolchains, and for the toolchain using # the prebuilt Rust stdlib which has no sanitizer support with it. if (!is_a_target_toolchain || toolchain_for_rust_host_build_tools) { @@ -147,6 +185,7 @@ if (!is_a_target_toolchain || toolchain_for_rust_host_build_tools) { use_libfuzzer = false use_locally_built_instrumented_libraries = false use_sanitizer_coverage = false + enable_fuzztest_fuzz = false } else if (current_cpu != "arm64") { is_hwasan = false } @@ -163,9 +202,7 @@ use_prebuilt_instrumented_libraries = is_msan use_fuzzing_engine = use_libfuzzer || use_afl || use_centipede || use_external_fuzzing_engine -# Whether the current fuzzing engine supports libprotobuf_mutator. Right now -# this is just libfuzzer, but others are likely to support this in future, -# so it's preferable to check this. +# Whether the current fuzzing engine supports libprotobuf_mutator. use_fuzzing_engine_with_lpm = use_libfuzzer || use_centipede # Whether the fuzzing engine supports fuzzers which supply their own @@ -181,8 +218,8 @@ declare_args() { generate_fuzzer_owners = use_fuzzing_engine use_sanitizer_coverage = - !use_clang_coverage && - (use_fuzzing_engine || sanitizer_coverage_flags != "") + !use_clang_coverage && (use_fuzzing_engine || enable_fuzztest_fuzz || + sanitizer_coverage_flags != "") # https://crbug.com/1002058: Code coverage works inside the sandbox via the # help of several helper IPCs. Unfortunately, the sandbox-only path does not @@ -195,20 +232,26 @@ declare_args() { use_clang_profiling && !use_fuzzing_engine && !is_fuchsia } -if (use_fuzzing_engine && sanitizer_coverage_flags == "") { - sanitizer_coverage_flags = "trace-pc-guard" - if (use_centipede) { - # Centipede's minimal flags are listed in //third_party/centipede/src/clang-flags.txt. - # But, for users like Chromium using an up-to-date clang, we can also - # enable extra optional types of coverage which may make Centipede more - # effective. This list is not currently documented and has been derived - # from discussion with centipede creators (though one is warned about at - # https://github.com/google/centipede/blob/main/centipede_callbacks.cc#L68) - sanitizer_coverage_flags = sanitizer_coverage_flags + - ",pc-table,trace-cmp,control-flow,trace-loads" +if (sanitizer_coverage_flags == "") { + if (enable_fuzztest_fuzz) { + # ./fuzztest_executable --fuzz= + # requires only this single type of coverage + sanitizer_coverage_flags = "inline-8bit-counters" + } else if (use_fuzzing_engine) { + sanitizer_coverage_flags = "trace-pc-guard" + if (use_centipede) { + # Centipede's minimal flags are listed in //third_party/fuzztest/src/centipede/clang-flags.txt. + # But, for users like Chromium using an up-to-date clang, we can also + # enable extra optional types of coverage which may make Centipede more + # effective. This list is not currently documented and has been derived + # from discussion with centipede creators (though one is warned about at + # https://github.com/google/centipede/blob/main/centipede_callbacks.cc#L68) + sanitizer_coverage_flags = sanitizer_coverage_flags + + ",pc-table,trace-cmp,control-flow,trace-loads" + } + } else if (use_sanitizer_coverage) { + sanitizer_coverage_flags = "trace-pc-guard,indirect-calls" } -} else if (use_sanitizer_coverage && sanitizer_coverage_flags == "") { - sanitizer_coverage_flags = "trace-pc-guard,indirect-calls" } # Whether we are linking against a sanitizer runtime library. Among other @@ -283,6 +326,10 @@ assert( "Chromium mac_clang_x64 toolchain on iOS distribution. Please set " + "the argument value to false.") +assert( + sanitizer_coverage_allowlist == "" || use_sanitizer_coverage, + "Can't specify a sanitizer coverage allowlist without using sanitizer coverage.") + # Use these lists of configs to disable instrumenting code that is part of a # fuzzer, but which isn't being targeted (such as libprotobuf-mutator, *.pb.cc # and libprotobuf when they are built as part of a proto fuzzer). Adding or diff --git a/build/config/siso/PRESUBMIT.py b/build/config/siso/PRESUBMIT.py index a7d12d3..4099f0b 100644 --- a/build/config/siso/PRESUBMIT.py +++ b/build/config/siso/PRESUBMIT.py @@ -15,15 +15,10 @@ def CheckTryjobFooters(input_api, output_api): message = ( "Missing 'Cq-Include-Trybots:' field required for Siso config changes" "\nPlease add the following fields to run Siso tryjobs.\n\n" - "Cq-Include-Trybots: luci.chromium.try:android-12-x64-siso-rel\n" - "Cq-Include-Trybots: luci.chromium.try:android-arm64-siso-rel\n" - "Cq-Include-Trybots: luci.chromium.try:android-nougat-x86-siso-rel\n" - "Cq-Include-Trybots: luci.chromium.try:fuchsia-x64-cast-receiver-siso-rel\n" - "Cq-Include-Trybots: luci.chromium.try:linux-chromeos-siso-rel\n" - "Cq-Include-Trybots: luci.chromium.try:linux-lacros-siso-rel\n" - "Cq-Include-Trybots: luci.chromium.try:linux-siso-rel\n" - "Cq-Include-Trybots: luci.chromium.try:linux-wayland-siso-rel\n" - "Cq-Include-Trybots: luci.chromium.try:linux-wayland-siso-rel\n" + "Cq-Include-Trybots: luci.chromium.try:fuchsia-binary-size-siso\n" + "Cq-Include-Trybots: luci.chromium.try:ios-simulator-siso\n" "Cq-Include-Trybots: luci.chromium.try:linux_chromium_asan_siso_rel_ng\n" - "Cq-Include-Trybots: luci.chromium.try:win-siso-rel\n") + "Cq-Include-Trybots: luci.chromium.try:linux_chromium_compile_siso_dbg_ng\n" + "Cq-Include-Trybots: luci.chromium.try:mac-siso-rel\n" + ) return [output_api.PresubmitPromptWarning(message)] diff --git a/build/config/siso/android.star b/build/config/siso/android.star index c2c108d..e4e337c 100644 --- a/build/config/siso/android.star +++ b/build/config/siso/android.star @@ -1,5 +1,5 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for Android builds.""" @@ -11,14 +11,15 @@ load("./config.star", "config") def __enabled(ctx): if "args.gn" in ctx.metadata: - gn_args = gn.parse_args(ctx.metadata["args.gn"]) + gn_args = gn.args(ctx) if gn_args.get("target_os") == '"android"': return True return False -def __step_config(ctx, step_config): - __input_deps(ctx, step_config["input_deps"]) +def __filegroups(ctx): + return {} +def __step_config(ctx, step_config): remote_run = True # Turn this to False when you do file access trace. step_config["rules"].extend([ # See also https://chromium.googlesource.com/chromium/src/build/+/HEAD/android/docs/java_toolchain.md @@ -41,19 +42,7 @@ def __step_config(ctx, step_config): "name": "android/turbine", "command_prefix": "python3 ../../build/android/gyp/turbine.py", "handler": "android_turbine", - # TODO(crrev.com/c/4596899): Add Java inputs in GN config. - "inputs": [ - "third_party/jdk/current/bin/java", - "third_party/android_sdk/public/platforms/android-34/android.jar", - "third_party/android_sdk/public/platforms/android-34/optional/android.test.base.jar", - "third_party/android_sdk/public/platforms/android-34/optional/org.apache.http.legacy.jar", - ], - "outputs_map": { - # Slow actions that exceed deadline on the default worker pool. - "./obj/chrome/android/chrome_test_java.turbine.jar": {"platform_ref": "large"}, - }, - # TODO(b/284252142): Run turbine actions locally by default because it slows down developer builds. - "remote": config.get(ctx, "remote_all"), + "remote": remote_run, "platform_ref": "large", "canonicalize_dir": True, "timeout": "2m", @@ -62,9 +51,6 @@ def __step_config(ctx, step_config): "name": "android/compile_resources", "command_prefix": "python3 ../../build/android/gyp/compile_resources.py", "handler": "android_compile_resources", - "inputs": [ - "third_party/protobuf/python/google:pyprotolib", - ], "exclude_input_patterns": [ "*.h", "*.o", @@ -82,12 +68,6 @@ def __step_config(ctx, step_config): "name": "android/compile_java", "command_prefix": "python3 ../../build/android/gyp/compile_java.py", "handler": "android_compile_java", - # TODO(crrev.com/c/4596899): Add Java inputs in GN config. - "inputs": [ - "third_party/jdk/current/bin/javac", - "third_party/android_sdk/public/platforms/android-34/optional/android.test.base.jar", - "third_party/android_sdk/public/platforms/android-34/optional/org.apache.http.legacy.jar", - ], # Don't include files under --generated-dir. # This is probably optimization for local incrmental builds. # However, this is harmful for remote build cache hits. @@ -102,13 +82,6 @@ def __step_config(ctx, step_config): "name": "android/dex", "command_prefix": "python3 ../../build/android/gyp/dex.py", "handler": "android_dex", - # TODO(crrev.com/c/4596899): Add Java inputs in GN config. - "inputs": [ - "third_party/jdk/current/bin/java", - "third_party/android_sdk/public/platforms/android-34/android.jar", - "third_party/android_sdk/public/platforms/android-34/optional/android.test.base.jar", - "third_party/android_sdk/public/platforms/android-34/optional/org.apache.http.legacy.jar", - ], # TODO(crbug.com/1452038): include only required jar, dex files in GN config. "indirect_inputs": { "includes": ["*.dex", "*.ijar.jar", "*.turbine.jar"], @@ -117,8 +90,7 @@ def __step_config(ctx, step_config): # Fo remote actions, let's ignore them, assuming remote cache hits compensate. "ignore_extra_input_pattern": ".*\\.dex", "ignore_extra_output_pattern": ".*\\.dex", - # TODO(b/284252142): Run dex actions locally by default because it slows down developer builds. - "remote": config.get(ctx, "remote_all"), + "remote": remote_run, "platform_ref": "large", "canonicalize_dir": True, "timeout": "2m", @@ -178,10 +150,6 @@ def __android_compile_resources_handler(ctx, cmd): # --webp-cache-dir=obj/android-webp-cache inputs = [] for i, arg in enumerate(cmd.args): - if arg in ["--aapt2-path", "--include-resources"]: - inputs.append(ctx.fs.canonpath(cmd.args[i + 1])) - if arg.startswith("--include-resources="): - inputs.append(ctx.fs.canonpath(arg.removeprefix("--include-resources="))) for k in ["--dependencies-res-zips=", "--dependencies-res-zip-overlays=", "--extra-res-packages="]: if arg.startswith(k): arg = arg.removeprefix(k) @@ -217,6 +185,7 @@ def __android_compile_java_handler(ctx, cmd): # --chromium-code=1 # --warnings-as-errors # --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\] + # --enable-errorprone # @gen/chrome/android/chrome_test_java.sources out = cmd.outputs[0] @@ -229,8 +198,9 @@ def __android_compile_java_handler(ctx, cmd): # read .sources file. if arg.startswith("@"): sources = str(ctx.fs.read(ctx.fs.canonpath(arg.removeprefix("@")))).splitlines() - inputs += sources - for k in ["--java-srcjars=", "--classpath=", "--bootclasspath=", "--processorpath=", "--kotlin-jar-path="]: + for source in sources: + inputs.append(ctx.fs.canonpath(source)) + for k in ["--classpath=", "--bootclasspath=", "--processorpath="]: if arg.startswith(k): arg = arg.removeprefix(k) fn, v = __filearg(ctx, arg) @@ -258,7 +228,7 @@ def __android_dex_handler(ctx, cmd): for i, arg in enumerate(cmd.args): if arg == "--desugar-dependencies": outputs.append(ctx.fs.canonpath(cmd.args[i + 1])) - for k in ["--class-inputs=", "--bootclasspath=", "--classpath=", "--class-inputs-filearg=", "--dex-inputs=", "--dex-inputs-filearg="]: + for k in ["--class-inputs=", "--bootclasspath=", "--classpath=", "--class-inputs-filearg=", "--dex-inputs-filearg="]: if arg.startswith(k): arg = arg.removeprefix(k) fn, v = __filearg(ctx, arg) @@ -278,15 +248,7 @@ def __android_dex_handler(ctx, cmd): def __android_turbine_handler(ctx, cmd): inputs = [] - outputs = [] - out_fileslist = False - if cmd.args[len(cmd.args) - 1].startswith("@"): - out_fileslist = True for i, arg in enumerate(cmd.args): - if arg.startswith("--jar-path="): - jar_path = ctx.fs.canonpath(arg.removeprefix("--jar-path=")) - if out_fileslist: - outputs.append(jar_path + ".java_files_list.txt") for k in ["--classpath=", "--processorpath="]: if arg.startswith(k): arg = arg.removeprefix(k) @@ -299,7 +261,6 @@ def __android_turbine_handler(ctx, cmd): ctx.actions.fix( inputs = cmd.inputs + inputs, - outputs = cmd.outputs + outputs, ) def __deps_configs(ctx, f, seen, inputs): @@ -362,49 +323,10 @@ __handlers = { "android_write_build_config": __android_write_build_config_handler, } -def __input_deps(ctx, input_deps): - # TODO(crrev.com/c/4596899): Add Java inputs in GN config. - input_deps["third_party/jdk/current:current"] = [ - "third_party/jdk/current/bin/java", - "third_party/jdk/current/bin/java.chromium", - "third_party/jdk/current/conf/logging.properties", - "third_party/jdk/current/conf/security/java.security", - "third_party/jdk/current/lib/ct.sym", - "third_party/jdk/current/lib/jrt-fs.jar", - "third_party/jdk/current/lib/jvm.cfg", - "third_party/jdk/current/lib/libawt.so", - "third_party/jdk/current/lib/libawt_headless.so", - "third_party/jdk/current/lib/libawt_xawt.so", - "third_party/jdk/current/lib/libjava.so", - "third_party/jdk/current/lib/libjimage.so", - "third_party/jdk/current/lib/libjli.so", - "third_party/jdk/current/lib/libjsvml.so", - "third_party/jdk/current/lib/libmanagement.so", - "third_party/jdk/current/lib/libmanagement_ext.so", - "third_party/jdk/current/lib/libnet.so", - "third_party/jdk/current/lib/libnio.so", - "third_party/jdk/current/lib/libverify.so", - "third_party/jdk/current/lib/libzip.so", - "third_party/jdk/current/lib/modules", - "third_party/jdk/current/lib/server/classes.jsa", - "third_party/jdk/current/lib/server/libjvm.so", - "third_party/jdk/current/lib/tzdb.dat", - ] - input_deps["third_party/jdk/current/bin/java"] = [ - "third_party/jdk/current:current", - ] - input_deps["third_party/jdk/current/bin/javac"] = [ - "third_party/jdk/current:current", - ] - input_deps["third_party/protobuf/python/google/protobuf/__init__.py"] = [ - "third_party/protobuf/python/google:google", - ] - android = module( "android", enabled = __enabled, step_config = __step_config, - filegroups = {}, + filegroups = __filegroups, handlers = __handlers, - input_deps = __input_deps, ) diff --git a/build/config/siso/blink_all.star b/build/config/siso/blink_all.star index 46b5034..5cdc1bb 100644 --- a/build/config/siso/blink_all.star +++ b/build/config/siso/blink_all.star @@ -1,13 +1,14 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for blink scripts.""" load("@builtin//struct.star", "module") +load("./platform.star", "platform") -__filegroups = { -} +def __filegroups(ctx): + return {} __handlers = { } @@ -19,12 +20,7 @@ def __step_config(ctx, step_config): step_config["rules"].extend([ { "name": "blink/generate_bindings", - "command_prefix": "python3 ../../third_party/blink/renderer/bindings/scripts/generate_bindings.py", - "inputs": [ - # build/print_python_deps.py couldn't detect this? - # TODO(crbug.com/1475569): fix build/print_python_deps.py - "third_party/mako/mako/mako/ext/pygmentplugin.py", - ], + "command_prefix": platform.python_bin + " ../../third_party/blink/renderer/bindings/scripts/generate_bindings.py", "remote": True, "platform_ref": "large", }, diff --git a/build/config/siso/clang_all.star b/build/config/siso/clang_all.star index 48cb9a1..acd6034 100644 --- a/build/config/siso/clang_all.star +++ b/build/config/siso/clang_all.star @@ -1,42 +1,49 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for clang.""" load("@builtin//struct.star", "module") -__filegroups = { - "third_party/libc++/src/include:headers": { - "type": "glob", - "includes": ["*"], - # can't use "*.h", because c++ headers have no extension. - }, - "third_party/libc++abi/src/include:headers": { - "type": "glob", - "includes": ["*.h"], - }, +def __filegroups(ctx): + return { + "third_party/libc++/src/include:headers": { + "type": "glob", + "includes": ["*"], + # can't use "*.h", because c++ headers have no extension. + }, + "third_party/libc++abi/src/include:headers": { + "type": "glob", + "includes": ["*.h"], + }, + # vendor provided headers for libc++. + "buildtools/third_party/libc++:headers": { + "type": "glob", + "includes": ["__*"], + }, - # toolchain root - # :headers for compiling - "third_party/llvm-build/Release+Asserts:headers": { - "type": "glob", - "includes": [ - "*.h", - "bin/clang", - "bin/clang++", - "bin/clang-cl.exe", - ], - }, -} + # toolchain root + # :headers for compiling + "third_party/llvm-build/Release+Asserts:headers": { + "type": "glob", + "includes": [ + "*.h", + "bin/clang", + "bin/clang++", + "bin/clang-cl.exe", + ], + }, + } __input_deps = { # need this because we use # third_party/libc++/src/include:headers, # but scandeps doesn't scan `__config` file, which uses # `#include <__config_site>` + # also need `__assertion_handler`. b/321171148 "third_party/libc++/src/include": [ - "buildtools/third_party/libc++/__config_site", + "buildtools/third_party/libc++:headers", ], } diff --git a/build/config/siso/clang_code_coverage_wrapper.star b/build/config/siso/clang_code_coverage_wrapper.star index 3994c65..9eb1c1c 100644 --- a/build/config/siso/clang_code_coverage_wrapper.star +++ b/build/config/siso/clang_code_coverage_wrapper.star @@ -1,5 +1,5 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso config version of clang_code_coverage_wrapper.py""" @@ -17,6 +17,8 @@ load("@builtin//struct.star", "module") _COVERAGE_FLAGS = [ "-fprofile-instr-generate", "-fcoverage-mapping", + "-mllvm", + "-runtime-counter-relocation=true", # Following experimental flags remove unused header functions from the # coverage mapping data embedded in the test binaries, and the reduction # of binary size enables building Chrome's large unit test targets on @@ -39,7 +41,7 @@ _COVERAGE_EXCLUSION_LIST_MAP = { "fuchsia": [ # TODO(crbug.com/1174725): These files caused clang to crash while # compiling them. - "../../base/allocator/partition_allocator/pcscan.cc", + "../../base/allocator/partition_allocator/src/partition_alloc/pcscan.cc", "../../third_party/skia/src/core/SkOpts.cpp", "../../third_party/skia/src/opts/SkOpts_hsw.cpp", "../../third_party/skia/third_party/skcms/skcms.cc", @@ -202,7 +204,9 @@ def __run(ctx, args): files_to_instrument = [] if instrument_file: files_to_instrument = str(ctx.fs.read(ctx.fs.canonpath(instrument_file))).splitlines() - files_to_instrument = [ctx.fs.canonpath(f) for f in files_to_instrument] + + # strip() is for removing '\r' on Windows. + files_to_instrument = [ctx.fs.canonpath(f).strip() for f in files_to_instrument] should_remove_flags = False if compile_source_file not in force_list: @@ -213,6 +217,7 @@ def __run(ctx, args): if should_remove_flags: return _remove_flags_from_command(compile_command) + print("Keeping code coverage flags for %s" % compile_source_file) return compile_command clang_code_coverage_wrapper = module( diff --git a/build/config/siso/clang_linux.star b/build/config/siso/clang_linux.star index 6985fcb..a479352 100644 --- a/build/config/siso/clang_linux.star +++ b/build/config/siso/clang_linux.star @@ -1,45 +1,91 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for clang/linux.""" load("@builtin//path.star", "path") load("@builtin//struct.star", "module") +load("./android.star", "android") load("./clang_all.star", "clang_all") load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper") +load("./config.star", "config") +load("./cros.star", "cros") -__filegroups = { - # for precomputed subtrees - "build/linux/debian_bullseye_amd64-sysroot/usr/include:include": { - "type": "glob", - "includes": ["*"], - # need bits/stab.def, c++/* - }, - "build/linux/debian_bullseye_amd64-sysroot/usr/lib:headers": { - "type": "glob", - "includes": ["*.h", "crtbegin.o"], - }, - "build/linux/debian_bullseye_i386-sysroot/usr/include:include": { - "type": "glob", - "includes": ["*"], - # need bits/stab.def, c++/* - }, - "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers": { - "type": "glob", - "includes": ["*.h", "crtbegin.o"], - }, - "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include": { - "type": "glob", - "includes": ["*"], - # can't use "*.h", because c++ headers have no extension. - }, - "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include": { - "type": "glob", - "includes": ["*"], - }, -} -__filegroups.update(clang_all.filegroups) +# TODO: b/323091468 - Propagate target android ABI and android SDK version +# from GN, and remove remove hardcoded filegroups. +android_archs = [ + "aarch64-linux-android", + "arm-linux-androideabi", + "i686-linux-android", + "riscv64-linux-android", + "x86_64-linux-android", +] + +android_versions = list(range(21, 35)) + +def __filegroups(ctx): + fg = { + # for precomputed subtrees + "build/linux/debian_bullseye_amd64-sysroot/usr/include:include": { + "type": "glob", + "includes": ["*"], + # need bits/stab.def, c++/* + }, + "build/linux/debian_bullseye_amd64-sysroot/usr/lib:headers": { + "type": "glob", + "includes": ["*.h", "crtbegin.o"], + }, + "build/linux/debian_bullseye_i386-sysroot/usr/include:include": { + "type": "glob", + "includes": ["*"], + # need bits/stab.def, c++/* + }, + "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers": { + "type": "glob", + "includes": ["*.h", "crtbegin.o"], + }, + "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include": { + "type": "glob", + "includes": ["*"], + # can't use "*.h", because c++ headers have no extension. + }, + "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include": { + "type": "glob", + "includes": ["*"], + }, + "third_party/llvm-build/Release+Asserts/lib/clang/18/lib:libs": { + "type": "glob", + "includes": ["*"], + }, + "third_party/llvm-build/Release+Asserts/lib/clang/18/share:share": { + "type": "glob", + "includes": ["*"], + }, + "build/linux/debian_bullseye_amd64-sysroot/lib/x86_64-linux-gnu:libso": { + "type": "glob", + "includes": ["*.so*"], + }, + "build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu:libs": { + "type": "glob", + "includes": ["*.o", "*.so*", "lib*.a"], + }, + "build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu:libgcc": { + "type": "glob", + "includes": ["*.o", "*.a", "*.so"], + }, + } + if android.enabled(ctx): + for arch in android_archs: + for ver in android_versions: + group = "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/%s/%d:link" % (arch, ver) + fg[group] = { + "type": "glob", + "includes": ["*"], + } + + fg.update(clang_all.filegroups(ctx)) + return fg def __clang_compile_coverage(ctx, cmd): clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args)) @@ -60,6 +106,23 @@ def __step_config(ctx, step_config): "build/linux/debian_bullseye_i386-sysroot/usr/include:include", "build/linux/debian_bullseye_i386-sysroot/usr/lib:headers", ], + "build/linux/debian_bullseye_amd64-sysroot:link": [ + "build/linux/debian_bullseye_amd64-sysroot/lib/x86_64-linux-gnu:libso", + "build/linux/debian_bullseye_amd64-sysroot/lib64/ld-linux-x86-64.so.2", + "build/linux/debian_bullseye_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu:libgcc", + "build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu:libs", + "third_party/llvm-build/Release+Asserts/bin/clang", + "third_party/llvm-build/Release+Asserts/bin/clang++", + "third_party/llvm-build/Release+Asserts/bin/ld.lld", + "third_party/llvm-build/Release+Asserts/bin/lld", + "third_party/llvm-build/Release+Asserts/bin/llvm-nm", + "third_party/llvm-build/Release+Asserts/bin/llvm-readelf", + "third_party/llvm-build/Release+Asserts/bin/llvm-readobj", + # The following inputs are used for sanitizer builds. + # It might be better to add them only for sanitizer builds if there is a performance issue. + "third_party/llvm-build/Release+Asserts/lib/clang/18/lib:libs", + "third_party/llvm-build/Release+Asserts/lib/clang/18/share:share", + ], "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot:headers": [ "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include:include", "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include:include", @@ -74,6 +137,7 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], + "exclude_input_patterns": ["*.stamp"], "remote": True, "canonicalize_dir": True, "timeout": "2m", @@ -85,6 +149,7 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], + "exclude_input_patterns": ["*.stamp"], "remote": True, "canonicalize_dir": True, "timeout": "2m", @@ -96,6 +161,7 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], + "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "remote": True, "canonicalize_dir": True, @@ -108,12 +174,59 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], + "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "remote": True, "canonicalize_dir": True, "timeout": "2m", }, ]) + + # TODO: b/316267242 - Enable remote links for Android and CrOS toolchain builds. + if not android.enabled(ctx) and not (cros.custom_toolchain(ctx) or cros.custom_sysroot(ctx)): + step_config["rules"].extend([ + { + "name": "clang/alink/llvm-ar", + "action": "(.*_)?alink", + "inputs": [ + # TODO: b/316267242 - Add inputs to GN config. + "third_party/llvm-build/Release+Asserts/bin/llvm-ar", + ], + "exclude_input_patterns": [ + "*.cc", + "*.h", + "*.js", + "*.pak", + "*.py", + "*.stamp", + ], + "remote": config.get(ctx, "remote-library-link"), + "platform_ref": "large", + "accumulate": True, + }, + { + "name": "clang/solink/gcc_solink_wrapper", + "action": "(.*_)?solink", + "command_prefix": "\"python3\" \"../../build/toolchain/gcc_solink_wrapper.py\"", + "inputs": [ + # TODO: b/316267242 - Add inputs to GN config. + "build/toolchain/gcc_solink_wrapper.py", + "build/toolchain/whole_archive.py", + "build/toolchain/wrapper_utils.py", + "build/linux/debian_bullseye_amd64-sysroot:link", + ], + "exclude_input_patterns": [ + "*.cc", + "*.h", + "*.js", + "*.pak", + "*.py", + "*.stamp", + ], + "remote": config.get(ctx, "remote-library-link"), + "platform_ref": "large", + }, + ]) return step_config clang = module( diff --git a/build/config/siso/clang_mac.star b/build/config/siso/clang_mac.star index a25f08c..1c21a1a 100644 --- a/build/config/siso/clang_mac.star +++ b/build/config/siso/clang_mac.star @@ -1,22 +1,56 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for clang/mac.""" +load("@builtin//lib/gn.star", "gn") load("@builtin//path.star", "path") load("@builtin//struct.star", "module") load("./clang_all.star", "clang_all") load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper") load("./rewrapper_cfg.star", "rewrapper_cfg") -__filegroups = { - "build/mac_files/xcode_binaries/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk:headers": { +def __filegroups(ctx): + sdk_includes = [ + "*.framework", + "*.h", + "*.json", + "*.modulemap", + "Current", + "Frameworks", + "Headers", + "Modules", + "crt*.o", + "usr/include/c++/v1/*", + "usr/include/c++/v1/*/*", + ] + fg = { + "build/mac_files/xcode_binaries/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk:headers": { + "type": "glob", + "includes": sdk_includes, + }, + } + + # precompute subtree for sysroot/frameworks for siso scandeps, + # which is not complex enough to handle C preprocessor tricks + # and need system include dirs when using deps log of -MMD. + # need to add new entries when new version is used. + # TODO: b/323091468 - get sysroot, ios_sdk_path from gn + fg[ctx.fs.canonpath("./sdk/xcode_links/MacOSX14.2.sdk") + ":headers"] = { "type": "glob", - "includes": ["*"], - }, -} -__filegroups.update(clang_all.filegroups) + "includes": sdk_includes, + } + fg[ctx.fs.canonpath("./sdk/xcode_links/iPhoneSimulator17.2.sdk") + ":headers"] = { + "type": "glob", + "includes": sdk_includes, + } + fg[ctx.fs.canonpath("./sdk/xcode_links/iPhoneSimulator.platform/Developer/Library/Frameworks") + ":headers"] = { + "type": "glob", + "includes": sdk_includes, + } + fg.update(clang_all.filegroups(ctx)) + return fg def __clang_compile_coverage(ctx, cmd): clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args)) @@ -30,15 +64,32 @@ def __step_config(ctx, step_config): cfg = "buildtools/reclient_cfgs/chromium-browser-clang/rewrapper_mac.cfg" if ctx.fs.exists(cfg): reproxy_config = rewrapper_cfg.parse(ctx, cfg) + largePlatform = {} + for k, v in reproxy_config["platform"].items(): + if k.startswith("label:action"): + continue + largePlatform[k] = v + largePlatform["label:action_large"] = "1" step_config["platforms"].update({ "clang": reproxy_config["platform"], + "clang_large": largePlatform, }) step_config["input_deps"].update(clang_all.input_deps) + + # TODO: https://issues.chromium.org/40120210 - remove this + # once we can use relative path in hmap. + need_input_root_absolute_path_for_objc = False + gn_args = gn.args(ctx) + if gn_args.get("target_os") == "\"ios\"": + # objc/objcxx uses hmap, which contains absolute path + # see also b/256536089 + need_input_root_absolute_path_for_objc = True step_config["rules"].extend([ { "name": "clang/cxx", "action": "(.*_)?cxx", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++", + "exclude_input_patterns": ["*.stamp"], "platform_ref": "clang", "remote": True, "remote_wrapper": reproxy_config["remote_wrapper"], @@ -47,6 +98,7 @@ def __step_config(ctx, step_config): "name": "clang/cc", "action": "(.*_)?cc", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang", + "exclude_input_patterns": ["*.stamp"], "platform_ref": "clang", "remote": True, "remote_wrapper": reproxy_config["remote_wrapper"], @@ -55,17 +107,21 @@ def __step_config(ctx, step_config): "name": "clang/objcxx", "action": "(.*_)?objcxx", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang++", + "exclude_input_patterns": ["*.stamp"], "platform_ref": "clang", "remote": True, "remote_wrapper": reproxy_config["remote_wrapper"], + "input_root_absolute_path": need_input_root_absolute_path_for_objc, }, { "name": "clang/objc", "action": "(.*_)?objc", "command_prefix": "../../third_party/llvm-build/Release+Asserts/bin/clang", + "exclude_input_patterns": ["*.stamp"], "platform_ref": "clang", "remote": True, "remote_wrapper": reproxy_config["remote_wrapper"], + "input_root_absolute_path": need_input_root_absolute_path_for_objc, }, { "name": "clang-coverage/cxx", @@ -74,6 +130,7 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], + "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "platform_ref": "clang", "remote": True, @@ -86,6 +143,7 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], + "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "platform_ref": "clang", "remote": True, @@ -98,10 +156,12 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], + "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "platform_ref": "clang", "remote": True, "remote_wrapper": reproxy_config["remote_wrapper"], + "input_root_absolute_path": need_input_root_absolute_path_for_objc, }, { "name": "clang-coverage/objc", @@ -110,10 +170,12 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], + "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "platform_ref": "clang", "remote": True, "remote_wrapper": reproxy_config["remote_wrapper"], + "input_root_absolute_path": need_input_root_absolute_path_for_objc, }, ]) return step_config diff --git a/build/config/siso/clang_windows.star b/build/config/siso/clang_windows.star index 7b04aea..9f8dc03 100644 --- a/build/config/siso/clang_windows.star +++ b/build/config/siso/clang_windows.star @@ -1,33 +1,48 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for clang-cl/windows.""" +load("@builtin//encoding.star", "json") load("@builtin//path.star", "path") load("@builtin//struct.star", "module") load("./clang_all.star", "clang_all") load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper") load("./rewrapper_cfg.star", "rewrapper_cfg") -__filegroups = { - # for precomputed subtree - "third_party/depot_tools/win_toolchain/vs_files/27370823e7:headers-ci": { - "type": "glob", - "includes": [ - "*.h", - "*.inl", - "*.H", - "*.Hxx", - "*.hxx", - "*.hpp", - "VC/Tools/MSVC/*/include/*", - "VC/Tools/MSVC/*/include/*/*", - ], - }, -} +def __win_toolchain_dir(ctx): + # build/win_toolchain.json may not exist when + # $env:DEPOT_TOOLS_WIN_TOOLCHAIN=0 or so. + if not ctx.fs.exists("build/win_toolchain.json"): + return None + data = json.decode(str(ctx.fs.read("build/win_toolchain.json"))) + if "path" in data: + return ctx.fs.canonpath(data["path"]) + return None -__filegroups.update(clang_all.filegroups) +def __filegroups(ctx): + win_toolchain_dir = __win_toolchain_dir(ctx) + fg = {} + if win_toolchain_dir: + fg.update({ + # for precomputed subtree + win_toolchain_dir + ":headers-ci": { + "type": "glob", + "includes": [ + "*.h", + "*.inl", + "*.H", + "*.Hxx", + "*.hxx", + "*.hpp", + "VC/Tools/MSVC/*/include/*", + "VC/Tools/MSVC/*/include/*/*", + ], + }, + }) + fg.update(clang_all.filegroups(ctx)) + return fg def __clang_compile_coverage(ctx, cmd): clang_command = clang_code_coverage_wrapper.run(ctx, list(cmd.args)) @@ -41,180 +56,202 @@ def __step_config(ctx, step_config): cfg = "buildtools/reclient_cfgs/chromium-browser-clang/rewrapper_windows.cfg" if ctx.fs.exists(cfg): reproxy_config = rewrapper_cfg.parse(ctx, cfg) + largePlatform = {} + for k, v in reproxy_config["platform"].items(): + if k.startswith("label:action"): + continue + largePlatform[k] = v + largePlatform["label:action_large"] = "1" step_config["platforms"].update({ "clang-cl": reproxy_config["platform"], + "clang-cl_large": largePlatform, }) step_config["input_deps"].update(clang_all.input_deps) - if reproxy_config["platform"]["OSFamily"] == "Windows": - step_config["input_deps"].update({ - "third_party/depot_tools/win_toolchain/vs_files/27370823e7:headers": [ - "third_party/depot_tools/win_toolchain/vs_files/27370823e7:headers-ci", - ], - }) - else: - step_config["input_deps"].update({ - "third_party/depot_tools/win_toolchain/vs_files/27370823e7:headers": [ - "third_party/depot_tools/win_toolchain/vs_files/27370823e7:headers-ci", - # third_party/libc++ includes "DeplayIMP.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/VC/Tools/MSVC/14.34.31933/include/DelayIMP.h", - # third_party/abseil-cpp includes "dbghelp.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/dbghelp.h", - # third_party/abseil-cpp includes "aclapi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/aclapi.h", - # base/debug includes "psapi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/psapi.h", - # base/process includes "tlhelp32.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/tlhelp32.h", - # base/process includes "userenv.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/userenv.h", - # base includes "shlobj.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/shlobj.h", - # base/win includes "lm.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/lm.h", - # base/win includes "mdmregistration.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/mdmregistration.h", - # base/win includes "shellscalingapi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/shellscalingapi.h", - # base/win includes "uiviewsettingsinterop.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/uiviewsettingsinterop.h", - # native_client/src/shared/platform/win includes "WinError.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/shared/WinError.h", - # third_party/webrtc/rtc_base/win includes "windows.graphics.directX.direct3d11.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/cppwinrt/winrt/windows.graphics.directX.direct3d11.h", - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/winrt/windows.graphics.directX.direct3d11.h", - # third_party/webrtc/rtc_base/win includes "windows.graphics.directX.direct3d11.interop.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/windows.graphics.directX.direct3d11.interop.h", - # third_party/crashpad/crashpad/handler/win includes "werapi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/werapi.h", - # chrome/install_static/ includes "wtsapi32.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/wtsapi32.h", - # third_party/dawn/include/dawn/native includes "DXGI1_4.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/shared/DXGI1_4.h", - # v8/src/diagnostics includes "versionhelpers.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/versionhelpers.h", - # ui/gfx/ includes "DXGIType.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/shared/DXGIType.h", - # third_party/unrar includes "PowrProf.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/PowrProf.h", - # device/base/ includes "dbt.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/dbt.h", - # third_party/skia/ includes "ObjBase.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/ObjBase.h", - # third_party/webrtc/rtc_base includes "ws2spi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/ws2spi.h", - # third_party/skia/ includes "T2EmbApi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/T2EmbApi.h", - # device/vr/windows/ includes "D3D11_1.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/D3D11_1.h", - # rlz/win/ includes "Sddl.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/shared/Sddl.h", - # chrome/common/safe_browsing/ includes "softpub.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/softpub.h", - # services/device/generic_sensor/ includes "Sensors.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Sensors.h", - # third_party/webrtc/modules/desktop_capture/win includes "windows.graphics.capture.interop.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/windows.graphics.capture.interop.h", - # third_party/skia/ includes "FontSub.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/FontSub.h", - # chrome/updater/ includes "regstr.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/regstr.h", - # services/device/compute_pressure includes "pdh.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/pdh.h", - # chrome/installer/ includes "mshtmhst.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/mshtmhst.h", - # net/ssl/ includes "NCrypt.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/NCrypt.h", - # device/fido/win/ includes "Combaseapi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Combaseapi.h", - # components/device_signals/core/system_signals/win includes "wscapi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/wscapi.h", - # net/proxy_resolution/win/ includes "dhcpcsdk.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/dhcpcsdk.h", - # third_party/dawn/third_party/glfw includes "xinput.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/xinput.h", - # v8/tools/v8windbg includes "pathcch.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/pathcch.h", - # remoting/host includes "rpcproxy.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/rpcproxy.h", - # sandbox/win includes "Aclapi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Aclapi.h", - # ui/accessibility/platform includes "uiautomation.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/uiautomation.h", - # chrome/credential_provider/gaiacp includes "ntsecapi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/ntsecapi.h", - # net/dns includes "Winsock2.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Winsock2.h", - # media/cdm/win includes "mferror.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/mferror.h", - # chrome/credentialProvider/gaiacp includes "Winternl.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Winternl.h", - # media/audio/win includes "audioclient.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/audioclient.h", - # media/audio/win includes "MMDeviceAPI.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/MMDeviceAPI.h", - # net/proxy_resolution/win includes "dhcpv6csdk.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/dhcpv6csdk.h", - # components/system_media_controls/win includes "systemmediatransportcontrolsinterop.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/systemmediatransportcontrolsinterop.h", - # ui/native_theme includes "Windows.Media.ClosedCaptioning.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/cppwinrt/winrt/Windows.Media.ClosedCaptioning.h", - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/winrt/Windows.Media.ClosedCaptioning.h", - # media/audio/win includes "Functiondiscoverykeys_devpkey.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Functiondiscoverykeys_devpkey.h", - # device/fido includes "Winuser.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Winuser.h", - # chrome/updater/win includes "msxml2.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/msxml2.h", - # remoting/host includes "ime.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/ime.h", - # remoting/host/win includes "D3DCommon.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/D3DCommon.h", - # ui/views/controls/menu includes "Vssym32.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Vssym32.h", - # third_party/wtl includes "richedit.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/richedit.h", - # chrome/updater/net includes "Urlmon.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Urlmon.h", - # device/gamepad includes "XInput.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/XInput.h", - # chrome/credential_provider/gaiacp includes "Shlobj.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Shlobj.h", - # content/renderer includes "mlang.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/mlang.h", - # components/storage_monitor includes "portabledevice.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/portabledevice.h", - # third_party/wtl includes "richole.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/richole.h", - # chrome/utility/importer includes "intshcut.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/intshcut.h", - # chrome/browser/net includes "Ws2spi.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/Ws2spi.h", - # chrome/browser/enterprise/platform_auth includes "proofofpossessioncookieinfo.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/proofofpossessioncookieinfo.h", - # chrome/utility/importer includes "urlhist.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/urlhist.h", - # chrome/updater/win/installer includes "msiquery.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/um/msiquery.h", - # third_party/win_virtual_display/controller includes "Devpropdef.h" - "third_party/depot_tools/win_toolchain/vs_files/27370823e7/Windows Kits/10/Include/10.0.22621.0/shared/Devpropdef.h", - ], - }) + + # when win_toolchain_dir is unknown (e.g. + # missing build/win_toolchain.json), we can't run + # clang-cl remotely as we can find sysroot files + # under exec_root, so just run locally. + remote = False + win_toolchain_dir = __win_toolchain_dir(ctx) + if win_toolchain_dir: + if reproxy_config["platform"]["OSFamily"] == "Windows": + step_config["input_deps"].update({ + win_toolchain_dir + ":headers": [ + win_toolchain_dir + ":headers-ci", + ], + }) + else: + step_config["input_deps"].update({ + win_toolchain_dir + ":headers": [ + win_toolchain_dir + ":headers-ci", + # third_party/libc++ includes "DeplayIMP.h" + path.join(win_toolchain_dir, "VC/Tools/MSVC/14.34.31933/include/DelayIMP.h"), + # third_party/abseil-cpp includes "dbghelp.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/dbghelp.h"), + # third_party/abseil-cpp includes "aclapi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/aclapi.h"), + # base/debug includes "psapi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/psapi.h"), + # base/process includes "tlhelp32.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/tlhelp32.h"), + # base/process includes "userenv.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/userenv.h"), + # base includes "shlobj.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/shlobj.h"), + # base/win includes "lm.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/lm.h"), + # base/win includes "mdmregistration.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/mdmregistration.h"), + # base/win includes "shellscalingapi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/shellscalingapi.h"), + # base/win includes "uiviewsettingsinterop.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/uiviewsettingsinterop.h"), + # native_client/src/shared/platform/win includes "WinError.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/shared/WinError.h"), + # third_party/webrtc/rtc_base/win includes "windows.graphics.directX.direct3d11.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/cppwinrt/winrt/windows.graphics.directX.direct3d11.h"), + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/winrt/windows.graphics.directX.direct3d11.h"), + # third_party/webrtc/rtc_base/win includes "windows.graphics.directX.direct3d11.interop.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/windows.graphics.directX.direct3d11.interop.h"), + # third_party/crashpad/crashpad/handler/win includes "werapi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/werapi.h"), + # chrome/install_static/ includes "wtsapi32.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/wtsapi32.h"), + # third_party/dawn/include/dawn/native includes "DXGI1_4.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/shared/DXGI1_4.h"), + # v8/src/diagnostics includes "versionhelpers.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/versionhelpers.h"), + # ui/gfx/ includes "DXGIType.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/shared/DXGIType.h"), + # third_party/unrar includes "PowrProf.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/PowrProf.h"), + # device/base/ includes "dbt.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/dbt.h"), + # third_party/skia/ includes "ObjBase.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/ObjBase.h"), + # third_party/webrtc/rtc_base includes "ws2spi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/ws2spi.h"), + # third_party/skia/ includes "T2EmbApi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/T2EmbApi.h"), + # device/vr/windows/ includes "D3D11_1.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/D3D11_1.h"), + # rlz/win/ includes "Sddl.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/shared/Sddl.h"), + # chrome/common/safe_browsing/ includes "softpub.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/softpub.h"), + # services/device/generic_sensor/ includes "Sensors.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Sensors.h"), + # third_party/webrtc/modules/desktop_capture/win includes "windows.graphics.capture.interop.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/windows.graphics.capture.interop.h"), + # third_party/skia/ includes "FontSub.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/FontSub.h"), + # chrome/updater/ includes "regstr.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/regstr.h"), + # services/device/compute_pressure includes "pdh.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/pdh.h"), + # chrome/installer/ includes "mshtmhst.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/mshtmhst.h"), + # net/ssl/ includes "NCrypt.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/NCrypt.h"), + # device/fido/win/ includes "Combaseapi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Combaseapi.h"), + # components/device_signals/core/system_signals/win includes "wscapi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/wscapi.h"), + # net/proxy_resolution/win/ includes "dhcpcsdk.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/dhcpcsdk.h"), + # third_party/dawn/third_party/glfw includes "xinput.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/xinput.h"), + # v8/tools/v8windbg includes "pathcch.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/pathcch.h"), + # remoting/host includes "rpcproxy.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/rpcproxy.h"), + # sandbox/win includes "Aclapi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Aclapi.h"), + # ui/accessibility/platform includes "uiautomation.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/uiautomation.h"), + # chrome/credential_provider/gaiacp includes "ntsecapi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/ntsecapi.h"), + # net/dns includes "Winsock2.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Winsock2.h"), + # media/cdm/win includes "mferror.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/mferror.h"), + # chrome/credentialProvider/gaiacp includes "Winternl.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Winternl.h"), + # media/audio/win includes "audioclient.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/audioclient.h"), + # media/audio/win includes "MMDeviceAPI.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/MMDeviceAPI.h"), + # net/proxy_resolution/win includes "dhcpv6csdk.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/dhcpv6csdk.h"), + # components/system_media_controls/win includes "systemmediatransportcontrolsinterop.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/systemmediatransportcontrolsinterop.h"), + # ui/native_theme includes "Windows.Media.ClosedCaptioning.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/cppwinrt/winrt/Windows.Media.ClosedCaptioning.h"), + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/winrt/Windows.Media.ClosedCaptioning.h"), + # media/audio/win includes "Functiondiscoverykeys_devpkey.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Functiondiscoverykeys_devpkey.h"), + # device/fido includes "Winuser.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Winuser.h"), + # chrome/updater/win includes "msxml2.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/msxml2.h"), + # remoting/host includes "ime.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/ime.h"), + # remoting/host/win includes "D3DCommon.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/D3DCommon.h"), + # ui/views/controls/menu includes "Vssym32.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Vssym32.h"), + # third_party/wtl includes "richedit.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/richedit.h"), + # chrome/updater/net includes "Urlmon.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Urlmon.h"), + # device/gamepad includes "XInput.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/XInput.h"), + # chrome/credential_provider/gaiacp includes "Shlobj.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Shlobj.h"), + # content/renderer includes "mlang.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/mlang.h"), + # components/storage_monitor includes "portabledevice.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/portabledevice.h"), + # third_party/wtl includes "richole.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/richole.h"), + # chrome/utility/importer includes "intshcut.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/intshcut.h"), + # chrome/browser/net includes "Ws2spi.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/Ws2spi.h"), + # chrome/browser/enterprise/platform_auth includes "proofofpossessioncookieinfo.h)" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/proofofpossessioncookieinfo.h"), + # chrome/utility/importer includes "urlhist.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/urlhist.h"), + # chrome/updater/win/installer includes "msiquery.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/msiquery.h"), + # third_party/win_virtual_display/controller includes "Devpropdef.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/shared/Devpropdef.h"), + # third_party/dawn/third_party/dxc/include/dxc/Support/WinIncludes.h "ObjIdl.h" + path.join(win_toolchain_dir, "Windows Kits/10/Include/10.0.22621.0/um/ObjIdl.h"), + ], + }) + remote = True step_config["rules"].extend([ { "name": "clang-cl/cxx", "action": "(.*_)?cxx", "command_prefix": "..\\..\\third_party\\llvm-build\\Release+Asserts\\bin\\clang-cl.exe", + "exclude_input_patterns": ["*.stamp"], "platform_ref": "clang-cl", - "remote": True, + "remote": remote, "remote_wrapper": reproxy_config["remote_wrapper"], + "timeout": "2m", }, { "name": "clang-cl/cc", "action": "(.*_)?cc", "command_prefix": "..\\..\\third_party\\llvm-build\\Release+Asserts\\bin\\clang-cl.exe", + "exclude_input_patterns": ["*.stamp"], "platform_ref": "clang-cl", - "remote": True, + "remote": remote, "remote_wrapper": reproxy_config["remote_wrapper"], + "timeout": "2m", }, { "name": "clang-coverage/cxx", @@ -223,10 +260,12 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang++", ], + "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "platform_ref": "clang-cl", - "remote": True, + "remote": remote, "remote_wrapper": reproxy_config["remote_wrapper"], + "timeout": "2m", }, { "name": "clang-coverage/cc", @@ -235,10 +274,12 @@ def __step_config(ctx, step_config): "inputs": [ "third_party/llvm-build/Release+Asserts/bin/clang", ], + "exclude_input_patterns": ["*.stamp"], "handler": "clang_compile_coverage", "platform_ref": "clang-cl", - "remote": True, + "remote": remote, "remote_wrapper": reproxy_config["remote_wrapper"], + "timeout": "2m", }, ]) return step_config diff --git a/build/config/siso/config.star b/build/config/siso/config.star index f1bd52c..422345c 100644 --- a/build/config/siso/config.star +++ b/build/config/siso/config.star @@ -1,5 +1,5 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Config module for checking siso -config flags.""" @@ -7,7 +7,14 @@ load("@builtin//struct.star", "module") __KNOWN_CONFIG_OPTIONS = [ - "remote_all", + # Indicates that the build runs on a builder. + "builder", + + # TODO: b/308405411 - Enable this config for all builders. + "remote-devtools-frontend-typescript", + + # TODO: b/316267242 - Enable remote links after confirming performance. + "remote-library-link", ] def __check(ctx): diff --git a/build/config/siso/cros.star b/build/config/siso/cros.star new file mode 100644 index 0000000..6b95e04 --- /dev/null +++ b/build/config/siso/cros.star @@ -0,0 +1,130 @@ +# -*- bazel-starlark -*- +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Siso configuration for ChromeOS builds.""" + +load("@builtin//lib/gn.star", "gn") +load("@builtin//path.star", "path") +load("@builtin//struct.star", "module") + +def __custom_toolchain(ctx): + if not "args.gn" in ctx.metadata: + print("no args.gn") + return None + gn_args = gn.args(ctx) + if gn_args.get("target_os") != '"chromeos"': + return None + if not "cros_target_cxx" in gn_args: + print("no cros_target_cxx") + return None + cros_target_cxx = gn_args.get("cros_target_cxx") + cros_target_cxx = cros_target_cxx.strip('"') + cros_target_cxx = ctx.fs.canonpath(cros_target_cxx) + toolchain = path.dir(path.dir(cros_target_cxx)) + if not toolchain: + fail("failed to detect cros custom toolchain. cros_target_cxx = %s" % gn_args.get("cros_target_cxx")) + return toolchain + +def __custom_sysroot(ctx): + if not "args.gn" in ctx.metadata: + print("no args.gn") + return None + gn_args = gn.args(ctx) + if gn_args.get("target_os") != '"chromeos"': + return None + if not "target_sysroot" in gn_args: + print("no target_sysroot") + return None + sysroot = gn_args.get("target_sysroot") + sysroot = sysroot.strip('"') + sysroot = ctx.fs.canonpath(sysroot) + if not sysroot: + fail("failed to detect cros custom sysroot. target_sysroot = %s" % gn_args.get("target_sysroot")) + return sysroot + +def __filegroups(ctx): + fg = {} + toolchain = __custom_toolchain(ctx) + print("toolchain = %s" % toolchain) + if toolchain: + fg[toolchain + ":headers"] = { + "type": "glob", + "includes": ["*"], + } + sysroot = __custom_sysroot(ctx) + print("sysroot = %s" % sysroot) + if sysroot: + fg[path.join(sysroot, "usr/include") + ":include"] = { + "type": "glob", + "includes": ["*"], + # needs bits/stab.def, c++/* + } + fg[path.join(sysroot, "usr/lib") + ":headers"] = { + "type": "glob", + "includes": ["*.h", "crtbegin.o"], + } + fg[path.join(sysroot, "usr/lib64") + ":headers"] = { + "type": "glob", + "includes": ["*.h"], + } + print(fg) + return fg + +def __cros_compiler(ctx, cmd): + tool_inputs = cmd.tool_inputs + for i, arg in enumerate(cmd.args): + if arg.startswith("-fprofile-sample-use="): + # profile data is in ninja input (direct or indirect), + # but siso doesn't include ninja inputs for deps=gcc + # (it would include lots of unnecessary inputs) + # so just add profdata by checking command line flag. + profdata = ctx.fs.canonpath(arg.removeprefix("-fprofile-sample-use=")) + tool_inputs.append(profdata) + ctx.actions.fix(tool_inputs = tool_inputs) + +__handlers = { + "cros_compiler": __cros_compiler, +} + +def __step_config(ctx, step_config): + if __custom_toolchain(ctx): + step_config["rules"].extend([ + { + "name": "clang-cros/cxx", + "action": "(.*_)?cxx", + "command_prefix": "../../build/cros_cache/chrome-sdk/", + "remote": True, + "handler": "cros_compiler", + "canonicalize_dir": True, + "timeout": "5m", + }, + { + "name": "clang-cros/cc", + "action": "(.*_)?cc", + "command_prefix": "../../build/cros_cache/chrome-sdk/", + "remote": True, + "handler": "cros_compiler", + "canonicalize_dir": True, + "timeout": "5m", + }, + ]) + sysroot = __custom_sysroot(ctx) + if sysroot: + step_config["input_deps"].update({ + sysroot + ":headers": [ + path.join(sysroot, "usr/include") + ":include", + path.join(sysroot, "usr/lib") + ":headers", + path.join(sysroot, "usr/lib64") + ":headers", + ], + }) + return step_config + +cros = module( + "cros", + custom_toolchain = __custom_toolchain, + custom_sysroot = __custom_sysroot, + filegroups = __filegroups, + handlers = __handlers, + step_config = __step_config, +) diff --git a/build/config/siso/devtools_frontend.star b/build/config/siso/devtools_frontend.star new file mode 100644 index 0000000..dc9f3e9 --- /dev/null +++ b/build/config/siso/devtools_frontend.star @@ -0,0 +1,130 @@ +load("@builtin//encoding.star", "json") +load("@builtin//path.star", "path") +load("@builtin//struct.star", "module") +load("./config.star", "config") +load("./tsc.star", "tsc") + +# TODO: crbug.com/1478909 - Specify typescript inputs in GN config. +def __filegroups(ctx): + return { + "third_party/devtools-frontend/src/node_modules/typescript:typescript": { + "type": "glob", + "includes": ["*"], + }, + "third_party/devtools-frontend/src/node_modules:node_modules": { + "type": "glob", + "includes": ["*.js", "*.json", "*.ts"], + }, + } + +def __step_config(ctx, step_config): + step_config["input_deps"].update({ + "third_party/devtools-frontend/src/third_party/typescript/ts_library.py": [ + "third_party/devtools-frontend/src/node_modules/typescript:typescript", + "third_party/devtools-frontend/src/node_modules:node_modules", + ], + }) + + # TODO: b/308405411 - Enable remote-devtools-frontend-typescript by default. + if config.get(ctx, "remote-devtools-frontend-typescript"): + step_config["rules"].extend([ + { + "name": "devtools-frontend/typescript/ts_library", + "command_prefix": "python3 ../../third_party/devtools-frontend/src/third_party/typescript/ts_library.py", + "exclude_input_patterns": [ + "*.stamp", + ], + "remote": True, + "handler": "devtools_frontend/typescript_ts_library", + "output_local": True, + }, + ]) + return step_config + +def _ts_library(ctx, cmd): + # Handler for https://crsrc.org/c/third_party/devtools-frontend/src/third_party/typescript/ts_library.py + # Note that this is a different script from https://crsrc.org/c/tools/typescript/ts_library.py + deps = [] + sources = [] + tsconfig_path = None + flag = None + for i, arg in enumerate(cmd.args): + if flag != "" and arg.startswith("-"): + flag = "" + if arg == "--tsconfig_output_location": + tsconfig_path = ctx.fs.canonpath(cmd.args[i + 1]) + continue + if arg in ("--deps", "--sources"): + flag = arg + continue + if flag == "--deps": + deps.append(arg) + continue + if flag == "--sources": + sources.append(ctx.fs.canonpath(arg)) + continue + if not tsconfig_path: + fail("missing --tsconfig_output_location") + tsconfig = {"files": [], "references": []} + tsconfig_dir = path.dir(tsconfig_path) + for s in sources: + tsconfig["files"].append(path.rel(tsconfig_dir, s)) + for d in deps: + tsconfig["references"].append({"path": d}) + refpath = path.join(tsconfig_dir, d) + refdir = path.dir(refpath) + + # TODO: crbug.com/1503020 - Fix devtools_entrypoint to propagate .d.ts output. + dpath = path.join(refdir, path.base(refdir) + ".d.ts") + if ctx.fs.exists(dpath): + sources.append(dpath) + + inputs = tsc.scandeps(ctx, tsconfig_path, tsconfig) + + # Sources and imported files might be located in different dirs. source vs gen. + # Try to collect the corresponding files in source or gen dir. + # TODO: crbug.com/1505319 - Fix devtools_module import issues. + files = {} + gen_dir = None + + # Infer source files from gen file. + for f in cmd.inputs + inputs: + if f.startswith("out/"): + # Remove out/{subdir}/gen. + splits = f.split("/", 3) + if len(splits) < 4: + continue + gen_dir = path.join(splits[0], splits[1], splits[2]) + f = splits[3] + if ctx.fs.exists(f) and not f in files: + files[f] = True + continue + if f.endswith(".js"): + f = f.removesuffix(".js") + ".d.ts" + if ctx.fs.exists(f) and not f in files: + files[f] = True + + # Infer gen files from source file. + if gen_dir: + for f in cmd.inputs + inputs: + if f.endswith(".ts"): + f = path.join(gen_dir, f) + f = f.removesuffix(".ts") + ".d.ts" + if ctx.fs.exists(f) and not f in files: + files[f] = True + if f.endswith(".js"): + f = path.join(gen_dir, f) + f = f.removesuffix(".js") + ".d.ts" + if ctx.fs.exists(f) and not f in files: + files[f] = True + + ctx.actions.fix(inputs = cmd.inputs + inputs + sources + files.keys()) + +devtools_frontend = module( + "devtools_frontend", + step_config = __step_config, + handlers = { + "devtools_frontend/typescript_ts_library": _ts_library, + }, + filegroups = __filegroups, +) diff --git a/build/config/siso/linux.star b/build/config/siso/linux.star index f3c99cd..9969dac 100644 --- a/build/config/siso/linux.star +++ b/build/config/siso/linux.star @@ -1,118 +1,63 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for linux.""" load("@builtin//struct.star", "module") +load("./android.star", "android") load("./clang_linux.star", "clang") load("./config.star", "config") -load("./mojo.star", "mojo") +load("./cros.star", "cros") +load("./devtools_frontend.star", "devtools_frontend") load("./nacl_linux.star", "nacl") load("./nasm_linux.star", "nasm") load("./proto_linux.star", "proto") load("./reproxy.star", "reproxy") -load("./android.star", "android") +load("./rust_linux.star", "rust") +load("./typescript_unix.star", "typescript") -__filegroups = {} -__filegroups.update(android.filegroups) -__filegroups.update(clang.filegroups) -__filegroups.update(mojo.filegroups) -__filegroups.update(nacl.filegroups) -__filegroups.update(nasm.filegroups) -__filegroups.update(proto.filegroups) +def __filegroups(ctx): + fg = {} + fg.update(android.filegroups(ctx)) + fg.update(clang.filegroups(ctx)) + fg.update(cros.filegroups(ctx)) + fg.update(devtools_frontend.filegroups(ctx)) + fg.update(nacl.filegroups(ctx)) + fg.update(nasm.filegroups(ctx)) + fg.update(proto.filegroups(ctx)) + fg.update(rust.filegroups(ctx)) + fg.update(typescript.filegroups(ctx)) + return fg __handlers = {} __handlers.update(android.handlers) __handlers.update(clang.handlers) -__handlers.update(mojo.handlers) +__handlers.update(cros.handlers) +__handlers.update(devtools_frontend.handlers) __handlers.update(nacl.handlers) __handlers.update(nasm.handlers) __handlers.update(proto.handlers) -__handlers.update(reproxy.handlers) - -def __disable_remote_b281663988(step_config): - step_config["rules"].insert(0, { - # TODO(b/281663988): missing headers. - "name": "b281663988/missing-headers", - "action_outs": [ - "./obj/ui/qt/qt5_shim/qt_shim.o", - "./obj/ui/qt/qt6_shim/qt_shim.o", - "./obj/ui/qt/qt5_shim/qt5_shim_moc.o", - "./obj/ui/qt/qt6_shim/qt6_shim_moc.o", - "./obj/ui/qt/qt_interface/qt_interface.o", - ], - "remote": False, - # This rule is used only with use_remoteexec. - # TODO(b/292838933): Move this rule into reproxy.star? - "handler": "strip_rewrapper", - }) - return step_config - -def __disable_remote_b289968566(ctx, step_config): - rule = { - # TODO(b/289968566): they often faile with exit=137 (OOM?). - # We should migrate default machine type to n2-standard-2. - "name": "b289968566/exit-137", - "action_outs": [ - "./android_clang_arm/obj/third_party/distributed_point_functions/distributed_point_functions/evaluate_prg_hwy.o", - "./clang_x64_v8_arm64/obj/v8/torque_generated_initializers/js-to-wasm-tq-csa.o", - "./clang_x64_v8_arm64/obj/v8/torque_generated_initializers/wasm-to-js-tq-csa.o", - "./clang_x86_v8_arm/obj/v8/torque_generated_initializers/js-to-wasm-tq-csa.o", - "./clang_x86_v8_arm/obj/v8/torque_generated_initializers/wasm-to-js-tq-csa.o", - "./obj/chrome/browser/ash/ash/autotest_private_api.o", - "./obj/chrome/browser/ash/ash/chrome_browser_main_parts_ash.o", - "./obj/chrome/browser/browser/browser_prefs.o", - "./obj/chrome/browser/browser/chrome_browser_interface_binders.o", - "./obj/chrome/browser/ui/ash/holding_space/browser_tests/holding_space_ui_browsertest.o", - "./obj/chrome/test/browser_tests/browser_non_client_frame_view_chromeos_browsertest.o", - "./obj/chrome/test/browser_tests/chrome_shelf_controller_browsertest.o", - "./obj/chrome/test/browser_tests/device_local_account_browsertest.o", - "./obj/chrome/test/browser_tests/file_manager_browsertest_base.o", - "./obj/chrome/test/browser_tests/remote_apps_manager_browsertest.o", - "./obj/v8/torque_generated_initializers/js-to-wasm-tq-csa.o", - "./obj/v8/torque_generated_initializers/wasm-to-js-tq-csa.o", - ], - "remote": False, - } - if reproxy.enabled(ctx): - rule["handler"] = "strip_rewrapper" - step_config["rules"].insert(0, rule) - return step_config +__handlers.update(rust.handlers) +__handlers.update(typescript.handlers) def __step_config(ctx, step_config): config.check(ctx) - step_config["platforms"] = { - "default": { - "OSFamily": "Linux", - "container-image": "docker://gcr.io/chops-public-images-prod/rbe/siso-chromium/linux@sha256:912808c295e578ccde53b0685bcd0d56c15d7a03e819dcce70694bfe3fdab35e", - "label:action_default": "1", - }, - "large": { - "OSFamily": "Linux", - "container-image": "docker://gcr.io/chops-public-images-prod/rbe/siso-chromium/linux@sha256:912808c295e578ccde53b0685bcd0d56c15d7a03e819dcce70694bfe3fdab35e", - # As of Jul 2023, the action_large pool uses n2-highmem-8 with 200GB of pd-ssd. - # The pool is intended for the following actions. - # - slow actions that can benefit from multi-cores and/or faster disk I/O. e.g. link, mojo, generate bindings etc. - # - actions that fail for OOM. - "label:action_large": "1", - }, - } - - step_config = __disable_remote_b289968566(ctx, step_config) if android.enabled(ctx): step_config = android.step_config(ctx, step_config) + # nacl step config should be added before clang step config for link step + # rules. step_config = nacl.step_config(ctx, step_config) + + step_config = clang.step_config(ctx, step_config) + step_config = cros.step_config(ctx, step_config) + step_config = devtools_frontend.step_config(ctx, step_config) step_config = nasm.step_config(ctx, step_config) step_config = proto.step_config(ctx, step_config) - step_config = mojo.step_config(ctx, step_config) - step_config = clang.step_config(ctx, step_config) - - if reproxy.enabled(ctx): - step_config = __disable_remote_b281663988(step_config) - step_config = reproxy.step_config(ctx, step_config) + step_config = rust.step_config(ctx, step_config) + step_config = typescript.step_config(ctx, step_config) return step_config diff --git a/build/config/siso/mac.star b/build/config/siso/mac.star index d03440e..e50b3ac 100644 --- a/build/config/siso/mac.star +++ b/build/config/siso/mac.star @@ -1,5 +1,5 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for macOS.""" @@ -7,21 +7,39 @@ load("@builtin//struct.star", "module") load("./clang_mac.star", "clang") load("./config.star", "config") -load("./reproxy.star", "reproxy") +load("./typescript_unix.star", "typescript") -__filegroups = {} -__filegroups.update(clang.filegroups) -__handlers = {} +def __filegroups(ctx): + fg = {} + fg.update(clang.filegroups(ctx)) + fg.update(typescript.filegroups(ctx)) + return fg + +# to reduce unnecessary local process and +# unnecessary digest calculation of output file. +def __copy_bundle_data(ctx, cmd): + input = cmd.inputs[0] + out = cmd.outputs[0] + ctx.actions.copy(input, out, recursive = ctx.fs.is_dir(input)) + ctx.actions.exit(exit_status = 0) + +__handlers = { + "copy_bundle_data": __copy_bundle_data, +} __handlers.update(clang.handlers) -__handlers.update(reproxy.handlers) +__handlers.update(typescript.handlers) def __step_config(ctx, step_config): config.check(ctx) - step_config["platforms"] = {} - + step_config["rules"].extend([ + { + "name": "mac/copy_bundle_data", + "action": "(.*)?copy_bundle_data", + "handler": "copy_bundle_data", + }, + ]) step_config = clang.step_config(ctx, step_config) - if reproxy.enabled(ctx): - step_config = reproxy.step_config(ctx, step_config) + step_config = typescript.step_config(ctx, step_config) return step_config chromium = module( diff --git a/build/config/siso/main.star b/build/config/siso/main.star index 3928f3c..0ca6f84 100644 --- a/build/config/siso/main.star +++ b/build/config/siso/main.star @@ -1,5 +1,5 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration main entry.""" @@ -10,9 +10,167 @@ load("@builtin//struct.star", "module") load("./blink_all.star", "blink_all") load("./linux.star", chromium_linux = "chromium") load("./mac.star", chromium_mac = "chromium") +load("./mojo.star", "mojo") +load("./platform.star", "platform") +load("./reproxy.star", "reproxy") load("./simple.star", "simple") load("./windows.star", chromium_windows = "chromium") +def __use_large_b289968566(ctx, step_config): + # TODO(b/289968566): they often faile with exit=137 (OOM?). + # They need to run on a machine has more memory than the default machine type n2-custom-2-3840 + exit137_list = [ + # Fallback happens with follwoing args.gn (try/linux-chromeos-rel-compilator). + # Fallback may happen in other build config too. + # also_build_lacros_chrome = true + # dcheck_always_on = true + # enable_backup_ref_ptr_feature_flag = true + # enable_dangling_raw_ptr_checks = true + # enable_dangling_raw_ptr_feature_flag = true + # ffmpeg_branding = "ChromeOS" + # is_component_build = false + # is_debug = false + # proprietary_codecs = true + # symbol_level = 0 + # target_os = "chromeos" + # use_cups = true + # use_remoteexec = true + "./lacros_clang_x64/obj/chrome/browser/browser/chrome_content_browser_client.o", + "./lacros_clang_x64/obj/content/browser/browser/browser_interface_binders.o", + "./obj/chrome/browser/ash/ash/autotest_private_api.o", + "./obj/chrome/browser/ash/ash/chrome_browser_main_parts_ash.o", + "./obj/chrome/browser/ash/ash/webui_login_view.o", + "./obj/chrome/browser/ash/system_web_apps/apps/browser_tests/media_app_integration_browsertest.o", + "./obj/chrome/browser/ash/system_web_apps/browser_tests/system_web_app_manager_browsertest.o", + "./obj/chrome/browser/ash/unit_tests/wizard_controller_unittest.o", + "./obj/chrome/browser/browser/browser_prefs.o", + "./obj/chrome/browser/browser/chrome_browser_interface_binders.o", + "./obj/chrome/browser/browser/chrome_content_browser_client.o", + "./obj/chrome/browser/ui/ash/holding_space/browser_tests/holding_space_ui_browsertest.o", + "./obj/chrome/test/browser_tests/browser_non_client_frame_view_chromeos_browsertest.o", + "./obj/chrome/test/browser_tests/chrome_shelf_controller_browsertest.o", + "./obj/chrome/test/browser_tests/device_local_account_browsertest.o", + "./obj/chrome/test/browser_tests/file_manager_browsertest_base.o", + "./obj/chrome/test/browser_tests/full_restore_app_launch_handler_browsertest.o", + "./obj/chrome/test/browser_tests/remote_apps_manager_browsertest.o", + "./obj/chrome/test/browser_tests/safe_browsing_blocking_page_test.o", + "./obj/chrome/test/browser_tests/spoken_feedback_browsertest.o", + "./obj/chrome/test/interactive_ui_tests/local_card_migration_uitest.o", + "./obj/chrome/test/interactive_ui_tests/system_web_app_interactive_uitest.o", + "./obj/chrome/test/interactive_ui_tests/tab_drag_controller_interactive_uitest.o", + "./obj/chrome/test/test_support_ui/web_app_integration_test_driver.o", + "./obj/chrome/test/unit_tests/chrome_browsing_data_remover_delegate_unittest.o", + "./obj/chrome/test/unit_tests/chrome_shelf_controller_unittest.o", + "./obj/content/browser/browser/browser_interface_binders.o", + + # Fallback with unknown build configs. + "./android_clang_arm/obj/content/browser/browser/browser_interface_binders.o", + "./android_clang_arm/obj/third_party/distributed_point_functions/distributed_point_functions/evaluate_prg_hwy.o", + "./ash_clang_x64/obj/chrome/browser/ash/ash/autotest_private_api.o", + "./ash_clang_x64/obj/chrome/browser/ash/ash/chrome_browser_main_parts_ash.o", + "./ash_clang_x64/obj/chrome/browser/ash/ash/user_session_manager.o", + "./ash_clang_x64/obj/chrome/browser/browser/browser_prefs.o", + "./ash_clang_x64/obj/chrome/browser/browser/chrome_browser_interface_binders.o", + "./ash_clang_x64/obj/chrome/browser/browser/chrome_content_browser_client.o", + "./ash_clang_x64/obj/chrome/test/test_support_ui/offer_notification_bubble_views_test_base.o", + "./ash_clang_x64/obj/chrome/test/test_support_ui/web_app_integration_test_driver.o", + "./ash_clang_x64/obj/content/browser/browser/browser_interface_binders.o", + "./obj/ash_clang_x64/chrome/test/test_support_ui/offer_notification_bubble_views_test_base.o", + "./obj/chrome/browser/ash/ash/user_session_manager.o", + "./obj/chrome/browser/ash/system_web_apps/apps/browser_tests/personalization_app_time_of_day_browsertest.o", + "./obj/chrome/browser/ash/system_web_apps/apps/browser_tests/personalization_app_wallpaper_daily_refresh_browsertest.o", + "./obj/chrome/browser/ash/system_web_apps/apps/browser_tests/projector_app_integration_browsertest.o", + "./obj/chrome/browser/ash/test_support/oobe_screens_utils.o", + "./obj/chrome/browser/autofill/interactive_ui_tests/autofill_interactive_uitest.o", + "./obj/chrome/browser/web_applications/web_applications_browser_tests/isolated_web_app_policy_manager_ash_browsertest.o", + "./obj/chrome/test/browser_tests/app_list_client_impl_browsertest.o", + "./obj/chrome/test/browser_tests/ash_hud_login_browsertest.o", + "./obj/chrome/test/browser_tests/assistant_optin_flow_screen_browsertest.o", + "./obj/chrome/test/browser_tests/autotest_private_apitest.o", + "./obj/chrome/test/browser_tests/browser_non_client_frame_view_browsertest.o", + "./obj/chrome/test/browser_tests/capture_mode_browsertest.o", + "./obj/chrome/test/browser_tests/configuration_based_oobe_browsertest.o", + "./obj/chrome/test/browser_tests/consolidated_consent_screen_browsertest.o", + "./obj/chrome/test/browser_tests/consumer_update_screen_browsertest.o", + "./obj/chrome/test/browser_tests/demo_setup_browsertest.o", + "./obj/chrome/test/browser_tests/devtools_browsertest.o", + "./obj/chrome/test/browser_tests/display_size_screen_browsertest.o", + "./obj/chrome/test/browser_tests/drive_pinning_screen_browsertest.o", + "./obj/chrome/test/browser_tests/enrollment_embedded_policy_server_browsertest.o", + "./obj/chrome/test/browser_tests/enterprise_remote_apps_apitest.o", + "./obj/chrome/test/browser_tests/error_screen_browsertest.o", + "./obj/chrome/test/browser_tests/existing_user_controller_browsertest.o", + "./obj/chrome/test/browser_tests/file_manager_policy_browsertest.o", + "./obj/chrome/test/browser_tests/file_tasks_browsertest.o", + "./obj/chrome/test/browser_tests/hid_detection_screen_browsertest.o", + "./obj/chrome/test/browser_tests/kiosk_browsertest.o", + "./obj/chrome/test/browser_tests/lacros_data_migration_screen_browsertest.o", + "./obj/chrome/test/browser_tests/login_browsertest.o", + "./obj/chrome/test/browser_tests/login_manager_test.o", + "./obj/chrome/test/browser_tests/login_ui_browsertest.o", + "./obj/chrome/test/browser_tests/login_ui_shelf_visibility_browsertest.o", + "./obj/chrome/test/browser_tests/management_transition_screen_browsertest.o", + "./obj/chrome/test/browser_tests/marketing_opt_in_screen_browsertest.o", + "./obj/chrome/test/browser_tests/metadata_processor_ash_browsertest.o", + "./obj/chrome/test/browser_tests/minimum_version_policy_handler_browsertest.o", + "./obj/chrome/test/browser_tests/notification_display_client_browsertest.o", + "./obj/chrome/test/browser_tests/oauth2_browsertest.o", + "./obj/chrome/test/browser_tests/offline_login_test_mixin.o", + "./obj/chrome/test/browser_tests/oobe_base_test.o", + "./obj/chrome/test/browser_tests/oobe_browsertest.o", + "./obj/chrome/test/browser_tests/oobe_interactive_ui_test.o", + "./obj/chrome/test/browser_tests/oobe_metrics_browsertest.o", + "./obj/chrome/test/browser_tests/policy_certs_browsertest.o", + "./obj/chrome/test/browser_tests/pwa_install_view_browsertest.o", + "./obj/chrome/test/browser_tests/quick_start_screen_browsertest.o", + "./obj/chrome/test/browser_tests/save_card_bubble_views_browsertest.o", + "./obj/chrome/test/browser_tests/scalable_iph_browsertest.o", + "./obj/chrome/test/browser_tests/session_login_browsertest.o", + "./obj/chrome/test/browser_tests/sync_consent_browsertest.o", + "./obj/chrome/test/browser_tests/theme_selection_screen_browsertest.o", + "./obj/chrome/test/browser_tests/touchpad_scroll_screen_browsertest.o", + "./obj/chrome/test/browser_tests/update_screen_browsertest.o", + "./obj/chrome/test/browser_tests/usertype_by_devicetype_metrics_provider_browsertest.o", + "./obj/chrome/test/browser_tests/web_view_browsertest.o", + "./obj/chrome/test/browser_tests/webview_login_browsertest.o", + "./obj/chrome/test/browser_tests/welcome_screen_browsertest.o", + "./obj/chrome/test/browser_tests/wizard_controller_browsertest.o", + "./obj/chrome/test/interactive_ui_tests/iban_bubble_view_uitest.o", + "./obj/chrome/test/interactive_ui_tests/login_manager_test.o", + "./obj/chrome/test/test_support_ui/offer_notification_bubble_views_test_base.o", + "./obj/chrome/test/unit_tests/site_settings_handler_unittest.o", + "./obj/fuchsia_web/runners/cast_runner_exe/main.o", + "./obj/fuchsia_web/runners/cast_runner_integration_tests__exec/cast_runner_integration_test.o", + "./obj/fuchsia_web/webengine/web_engine_core/frame_impl.o", + ] + if runtime.os == "windows": + exit137_list = [obj.removesuffix(".o") + ".obj" for obj in exit137_list if obj.startswith("./obj/")] + + new_rules = [] + for rule in step_config["rules"]: + if not rule["name"].endswith("/cxx"): + new_rules.append(rule) + continue + if "action_outs" in rule: + fail("unexpeced \"action_outs\" in cxx rule %s" % rule["name"]) + r = {} + r.update(rule) + r["name"] += "/b289968566/exit-137" + r["action_outs"] = exit137_list + + # use `_large` variant of platform if it doesn't use default platform, + # i.e. mac/win case. + if "platform_ref" in r: + r["platform_ref"] = r["platform_ref"] + "_large" + else: + r["platform_ref"] = "large" + if r.get("handler") == "rewrite_rewrapper": + r["handler"] = "rewrite_rewrapper_large" + new_rules.append(r) + new_rules.append(rule) + step_config["rules"] = new_rules + return step_config + def init(ctx): print("runtime: os:%s arch:%s run:%d" % ( runtime.os, @@ -25,35 +183,66 @@ def init(ctx): "windows": chromium_windows, }[runtime.os] step_config = { - "platforms": {}, + "platforms": { + "default": { + "OSFamily": "Linux", + "container-image": "docker://gcr.io/chops-public-images-prod/rbe/siso-chromium/linux@sha256:912808c295e578ccde53b0685bcd0d56c15d7a03e819dcce70694bfe3fdab35e", + "label:action_default": "1", + }, + # Large workers are usually used for Python actions like generate bindings, mojo generators etc + # They can run on Linux workers. + "large": { + "OSFamily": "Linux", + "container-image": "docker://gcr.io/chops-public-images-prod/rbe/siso-chromium/linux@sha256:912808c295e578ccde53b0685bcd0d56c15d7a03e819dcce70694bfe3fdab35e", + # As of Jul 2023, the action_large pool uses n2-highmem-8 with 200GB of pd-ssd. + # The pool is intended for the following actions. + # - slow actions that can benefit from multi-cores and/or faster disk I/O. e.g. link, mojo, generate bindings etc. + # - actions that fail for OOM. + "label:action_large": "1", + }, + }, "input_deps": {}, "rules": [], } + step_config = blink_all.step_config(ctx, step_config) step_config = host.step_config(ctx, step_config) + step_config = mojo.step_config(ctx, step_config) step_config = simple.step_config(ctx, step_config) - step_config = blink_all.step_config(ctx, step_config) + if reproxy.enabled(ctx): + step_config = reproxy.step_config(ctx, step_config) # Python actions may use an absolute path at the first argument. # e.g. C:/src/depot_tools/bootstrap-2@3_8_10_chromium_26_bin/python3/bin/python3.exe - # It needs to set `pyhton3` or `python3.exe` be replaced with `python3.exe` for remote execution. + # It needs to set `pyhton3` or `python3.exe` to remote_command. for rule in step_config["rules"]: if rule["name"].startswith("clang-coverage"): # clang_code_coverage_wrapper.run() strips the python wrapper. # So it shouldn't set `remote_command: python3`. continue + + # On Linux worker, it needs to be `python3` instead of `python3.exe`. arg0 = rule.get("command_prefix", "").split(" ")[0].strip("\"") - if arg0 in ["python3", "python3.exe"]: - rule["remote_command"] = arg0 + if arg0 != platform.python_bin: + continue + p = rule.get("reproxy_config", {}).get("platform") or step_config["platforms"].get(rule.get("platform_ref", "default")) + if not p: + continue + if p.get("OSFamily") == "Linux": + arg0 = arg0.removesuffix(".exe") + rule["remote_command"] = arg0 + + step_config = __use_large_b289968566(ctx, step_config) filegroups = {} - filegroups.update(blink_all.filegroups) - filegroups.update(host.filegroups) - filegroups.update(simple.filegroups) + filegroups.update(blink_all.filegroups(ctx)) + filegroups.update(host.filegroups(ctx)) + filegroups.update(simple.filegroups(ctx)) handlers = {} handlers.update(blink_all.handlers) handlers.update(host.handlers) handlers.update(simple.handlers) + handlers.update(reproxy.handlers) return module( "config", diff --git a/build/config/siso/mojo.star b/build/config/siso/mojo.star index de8150f..45c60e7 100644 --- a/build/config/siso/mojo.star +++ b/build/config/siso/mojo.star @@ -1,14 +1,12 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for mojo.""" +load("@builtin//runtime.star", "runtime") load("@builtin//struct.star", "module") - -__filegroups = {} - -__handlers = {} +load("./platform.star", "platform") def __step_config(ctx, step_config): # mojom_bindings_generator.py will run faster on n2-highmem-8 than @@ -20,10 +18,7 @@ def __step_config(ctx, step_config): step_config["rules"].extend([ { "name": "mojo/mojom_bindings_generator", - "command_prefix": "python3 ../../mojo/public/tools/bindings/mojom_bindings_generator.py", - "inputs": [ - "mojo/public/tools/bindings/mojom_bindings_generator.py", - ], + "command_prefix": platform.python_bin + " ../../mojo/public/tools/bindings/mojom_bindings_generator.py", "indirect_inputs": { "includes": [ "*.js", @@ -37,90 +32,16 @@ def __step_config(ctx, step_config): "exclude_input_patterns": [ "*.stamp", ], - # TODO(crbug.com/1437820): unspecified outputs of mojom_bindings_generator.py - "outputs_map": { - "./gen/components/aggregation_service/aggregation_service.mojom.js": { - "outputs": [ - "./gen/mojom-webui/components/aggregation_service/aggregation_service.mojom-webui.js", - ], - }, - "./gen/components/attribution_reporting/eligibility_error.mojom.js": { - "outputs": [ - "./gen/mojom-webui/components/attribution_reporting/eligibility_error.mojom-webui.js", - "./gen/mojom-webui/components/attribution_reporting/registration_eligibility.mojom-webui.js", - "./gen/mojom-webui/components/attribution_reporting/source_registration_error.mojom-webui.js", - "./gen/mojom-webui/components/attribution_reporting/trigger_registration_error.mojom-webui.js", - ], - }, - "./gen/components/attribution_reporting/registration.mojom.js": { - "outputs": [ - "./gen/mojom-webui/components/attribution_reporting/registration.mojom-webui.js", - ], - }, - "./gen/media/capture/mojom/image_capture.mojom.js": { - "outputs": [ - "./gen/mojom-webui/media/capture/mojom/image_capture.mojom-webui.js", - ], - }, - "./gen/services/device/public/mojom/usb_device.mojom.js": { - "outputs": [ - "./gen/mojom-webui/services/device/public/mojom/usb_device.mojom-webui.js", - "./gen/mojom-webui/services/device/public/mojom/usb_enumeration_options.mojom-webui.js", - "./gen/mojom-webui/services/device/public/mojom/usb_manager.mojom-webui.js", - "./gen/mojom-webui/services/device/public/mojom/usb_manager_client.mojom-webui.js", - ], - }, - "./gen/services/media_session/public/mojom/audio_focus.mojom.js": { - "outputs": [ - "./gen/mojom-webui/services/media_session/public/mojom/audio_focus.mojom-webui.js", - "./gen/mojom-webui/services/media_session/public/mojom/constants.mojom-webui.js", - "./gen/mojom-webui/services/media_session/public/mojom/media_controller.mojom-webui.js", - "./gen/mojom-webui/services/media_session/public/mojom/media_session.mojom-webui.js", - ], - }, - "./gen/services/network/public/mojom/attribution.mojom.js": { - "outputs": [ - "./gen/mojom-webui/services/network/public/mojom/attribution.mojom-webui.js", - ], - }, - "./gen/services/network/public/mojom/schemeful_site.mojom.js": { - "outputs": [ - "./gen/mojom-webui/services/network/public/mojom/schemeful_site.mojom-webui.js", - ], - }, - "./gen/third_party/blink/public/mojom/quota/quota_manager_host.mojom.js": { - "outputs": [ - "./gen/mojom-webui/third_party/blink/public/mojom/quota/quota_manager_host.mojom-webui.js", - "./gen/mojom-webui/third_party/blink/public/mojom/quota/quota_types.mojom-webui.js", - ], - }, - "./gen/third_party/blink/public/mojom/storage_key/ancestor_chain_bit.mojom.js": { - "outputs": [ - "./gen/mojom-webui/third_party/blink/public/mojom/storage_key/ancestor_chain_bit.mojom-webui.js", - "./gen/mojom-webui/third_party/blink/public/mojom/storage_key/storage_key.mojom-webui.js", - ], - }, - "./gen/ui/base/mojom/ui_base_types.mojom.js": { - "outputs": [ - "./gen/mojom-webui/ui/base/mojom/ui_base_types.mojom-webui.js", - "./gen/mojom-webui/ui/base/mojom/window_open_disposition.mojom-webui.js", - ], - }, - "./gen/ui/gfx/image/mojom/image.mojom.js": { - "outputs": [ - "./gen/mojom-webui/ui/gfx/image/mojom/image.mojom-webui.js", - ], - }, - }, "restat": True, "remote": True, + "canonicalize_dir": True, "timeout": "2m", "output_local": True, "platform_ref": platform_ref, }, { "name": "mojo/mojom_parser", - "command_prefix": "python3 ../../mojo/public/tools/mojom/mojom_parser.py", + "command_prefix": platform.python_bin + " ../../mojo/public/tools/mojom/mojom_parser.py", "indirect_inputs": { "includes": [ "*.build_metadata", @@ -154,17 +75,33 @@ def __step_config(ctx, step_config): ], }, }, - "remote": True, + # TODO: b/285078792 - Win cross compile on Linux worker doesn't work with input_root_absolute_path=true. + "remote": runtime.os != "windows", + "canonicalize_dir": True, "input_root_absolute_path": True, "output_local": True, "platform_ref": platform_ref, }, + { + "name": "mojo/validate_typemap_config", + "command_prefix": platform.python_bin + " ../../mojo/public/tools/bindings/validate_typemap_config.py", + "remote": True, + "canonicalize_dir": True, + "output_local": True, + "platform_ref": platform_ref, + }, + { + "name": "mojo/generate_type_mappings", + "command_prefix": platform.python_bin + " ../../mojo/public/tools/bindings/generate_type_mappings.py", + "remote": True, + "canonicalize_dir": True, + "output_local": True, + "platform_ref": platform_ref, + }, ]) return step_config mojo = module( "mojo", step_config = __step_config, - filegroups = __filegroups, - handlers = __handlers, ) diff --git a/build/config/siso/nacl_linux.star b/build/config/siso/nacl_linux.star index 12a56eb..f6ee6e5 100644 --- a/build/config/siso/nacl_linux.star +++ b/build/config/siso/nacl_linux.star @@ -1,57 +1,59 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for nacl/linux.""" load("@builtin//struct.star", "module") -__filegroups = { - "native_client/toolchain/linux_x86/pnacl_newlib/bin/pydir:pydir": { - "type": "glob", - "includes": ["*.py"], - }, - "native_client/toolchain/linux_x86/pnacl_newlib/lib:libllvm": { - "type": "glob", - "includes": ["libLLVM*.so"], - }, - "native_client/toolchain/linux_x86/saigo_newlib/bin:clang": { - "type": "glob", - "includes": ["clang-*"], - }, - "native_client/toolchain/linux_x86/saigo_newlib/lib:libso": { - "type": "glob", - "includes": ["*.so*"], - }, - "native_client/toolchain/linux_x86/nacl_x86_glibc/lib/gcc/x86_64-nacl:crtbegin": { - "type": "glob", - "includes": ["crtbegin.o"], - }, - "native_client/toolchain/linux_x86/nacl_x86_glibc/libexec/gcc/x86_64-nacl:ccbackend": { - "type": "glob", - "includes": ["cc1", "cc1plus", "collect2"], - }, - # for precomputed subtrees - "native_client/toolchain/linux_x86/nacl_x86_glibc:header-files": { - "type": "glob", - "includes": ["*.h", "*/include/c++/*/*", "*/include/c++/*/*/*"], - }, - "native_client/toolchain/linux_x86/pnacl_newlib:header-files": { - "type": "glob", - "includes": ["*.h", "*/include/c++/*/*", "*/include/c++/*/*/*"], - }, - "native_client/toolchain/linux_x86/saigo_newlib:header-files": { - "type": "glob", - "includes": ["*.h", "*/include/c++/*/*", "*/include/c++/*/*/*"], - }, -} +def __filegroups(ctx): + return { + "native_client/toolchain/linux_x86/pnacl_newlib/bin/pydir:pydir": { + "type": "glob", + "includes": ["*.py"], + }, + "native_client/toolchain/linux_x86/pnacl_newlib/lib:libllvm": { + "type": "glob", + "includes": ["libLLVM*.so"], + }, + "native_client/toolchain/linux_x86/saigo_newlib/bin:clang": { + "type": "glob", + "includes": ["clang-*"], + }, + "native_client/toolchain/linux_x86/saigo_newlib/lib:libso": { + "type": "glob", + "includes": ["*.so*"], + }, + "native_client/toolchain/linux_x86/nacl_x86_glibc/lib/gcc/x86_64-nacl:crtbegin": { + "type": "glob", + "includes": ["crtbegin.o"], + }, + "native_client/toolchain/linux_x86/nacl_x86_glibc/libexec/gcc/x86_64-nacl:ccbackend": { + "type": "glob", + "includes": ["cc1", "cc1plus", "collect2"], + }, + # for precomputed subtrees + "native_client/toolchain/linux_x86/nacl_x86_glibc:header-files": { + "type": "glob", + "includes": ["*.h", "*/include/c++/*/*", "*/include/c++/*/*/*"], + }, + "native_client/toolchain/linux_x86/pnacl_newlib:header-files": { + "type": "glob", + "includes": ["*.h", "*/include/c++/*/*", "*/include/c++/*/*/*"], + }, + "native_client/toolchain/linux_x86/saigo_newlib:header-files": { + "type": "glob", + "includes": ["*.h", "*/include/c++/*/*", "*/include/c++/*/*/*"], + }, + } __handlers = {} def __step_config(ctx, step_config): step_config["rules"].extend([ + # pnacl { - "name": "nacl_linux/pnacl-clang++", + "name": "nacl/pnacl-clang++", "action": "newlib_pnacl.*_cxx", "command_prefix": "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/pnacl-clang++", "inputs": [ @@ -62,7 +64,7 @@ def __step_config(ctx, step_config): "timeout": "2m", }, { - "name": "nacl_linux/pnacl-clang", + "name": "nacl/pnacl-clang", "action": "newlib_pnacl.*_cc", "command_prefix": "../../native_client/toolchain/linux_x86/pnacl_newlib/bin/pnacl-clang", "inputs": [ @@ -73,7 +75,7 @@ def __step_config(ctx, step_config): "timeout": "2m", }, { - "name": "nacl_linux/glibc/x86_64-nacl-gcc", + "name": "nacl/glibc/x86_64-nacl-gcc", "action": "glibc_x64_cc", "inputs": [ "native_client/toolchain/linux_x86/nacl_x86_glibc/bin/x86_64-nacl-gcc", @@ -85,19 +87,35 @@ def __step_config(ctx, step_config): "input_root_absolute_path": True, }, { - "name": "nacl_linux/glibc/x86_64-nacl-g++", + "name": "nacl/pnacl-ar", + "action": "newlib_pnacl_alink", + "remote": False, + }, + # glibc + { + "name": "nacl/glibc/x86_64-nacl-g++", "action": "glibc_x64_cxx", "inputs": [ "native_client/toolchain/linux_x86/nacl_x86_glibc/bin/x86_64-nacl-g++", ], # ELF-32 doesn't work on gVisor, - # so will local-fallback if gVisor is used. - # TODO(b/278485912): remote=True for trusted instance. "remote": False, - "input_root_absolute_path": True, }, { - "name": "nacl_linux/pnacl_newlib/x86_64-nacl-clang++", + "name": "nacl/glibc/x86_64-nacl-ar", + "action": "glibc_x64_alink", + # ELF-32 doesn't work on gVisor, + "remote": False, + }, + { + "name": "nacl/glibc/x86_64_solink/gcc_solink_wrapper", + "action": "glibc_x64_solink", + # ELF-32 doesn't work on gVisor, + "remote": False, + }, + # pnacl_newlib + { + "name": "nacl/pnacl_newlib/x86_64-nacl-clang++", "action": "clang_newlib_x64_cxx", "inputs": [ "native_client/toolchain/linux_x86/pnacl_newlib/bin/x86_64-nacl-clang++", @@ -108,7 +126,7 @@ def __step_config(ctx, step_config): "timeout": "2m", }, { - "name": "nacl_linux/pnacl_newlib/x86_64-nacl-clang", + "name": "nacl/pnacl_newlib/x86_64-nacl-clang", "action": "clang_newlib_x64_cc", "inputs": [ "native_client/toolchain/linux_x86/pnacl_newlib/bin/x86_64-nacl-clang", @@ -119,7 +137,13 @@ def __step_config(ctx, step_config): "timeout": "2m", }, { - "name": "nacl_linux/saigo_newlib/x86_64-nacl-clang++", + "name": "nacl/pnacl_newlib/x86_64-nacl-ar", + "action": "clang_newlib_x64_alink", + "remote": False, + }, + # saigo_newlib + { + "name": "nacl/saigo_newlib/x86_64-nacl-clang++", "action": "irt_x64_cxx", "command_prefix": "../../native_client/toolchain/linux_x86/saigo_newlib/bin/x86_64-nacl-clang++", "inputs": [ @@ -130,7 +154,7 @@ def __step_config(ctx, step_config): "timeout": "2m", }, { - "name": "nacl_linux/saigo_newlib/x86_64-nacl-clang", + "name": "nacl/saigo_newlib/x86_64-nacl-clang", "action": "irt_x64_cc", "command_prefix": "../../native_client/toolchain/linux_x86/saigo_newlib/bin/x86_64-nacl-clang", "inputs": [ @@ -140,6 +164,11 @@ def __step_config(ctx, step_config): "input_root_absolute_path": True, "timeout": "2m", }, + { + "name": "nacl/saigo_newlib/x86_64-nacl-ar", + "action": "(.*_)?irt_x64_alink", + "remote": False, + }, ]) step_config["input_deps"].update({ diff --git a/build/config/siso/nasm_linux.star b/build/config/siso/nasm_linux.star index 55f2778..6295385 100644 --- a/build/config/siso/nasm_linux.star +++ b/build/config/siso/nasm_linux.star @@ -1,5 +1,5 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for nasm/linux.""" @@ -9,8 +9,8 @@ load("@builtin//struct.star", "module") load("./config.star", "config") load("./nasm_scandeps.star", "nasm_scandeps") -__filegroups = { -} +def __filegroups(ctx): + return {} def __nasm(ctx, cmd): inputs = nasm_scandeps.scandeps(ctx, cmd) diff --git a/build/config/siso/platform.star b/build/config/siso/platform.star new file mode 100644 index 0000000..49e8012 --- /dev/null +++ b/build/config/siso/platform.star @@ -0,0 +1,20 @@ +# -*- bazel-starlark -*- +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Utilities that fill gap between platforms.""" + +load("@builtin//runtime.star", "runtime") +load("@builtin//struct.star", "module") + +# Python binary name. python3 or python3.exe. +__python_bin = { + # is_windows => python bin + True: "python3.exe", + False: "python3", +}[runtime.os == "windows"] + +platform = module( + "platform", + python_bin = __python_bin, +) diff --git a/build/config/siso/proto_linux.star b/build/config/siso/proto_linux.star index 67bc809..a4a0a29 100644 --- a/build/config/siso/proto_linux.star +++ b/build/config/siso/proto_linux.star @@ -9,12 +9,13 @@ load("@builtin//struct.star", "module") load("./config.star", "config") load("./protoc_wrapper.star", "protoc_wrapper") -__filegroups = { - "third_party/protobuf/python/google:pyprotolib": { - "type": "glob", - "includes": ["*.py"], - }, -} +def __filegroups(ctx): + return { + "third_party/protobuf/python/google:pyprotolib": { + "type": "glob", + "includes": ["*.py"], + }, + } def __protoc_wrapper(ctx, cmd): inputs = protoc_wrapper.scandeps(ctx, cmd.args) @@ -33,7 +34,7 @@ def __step_config(ctx, step_config): }) step_config["rules"].extend([ { - "name": "proto_linux/protoc_wrapper", + "name": "proto/protoc_wrapper", "command_prefix": "python3 ../../tools/protoc_wrapper/protoc_wrapper.py", "indirect_inputs": { "includes": ["*.proto"], diff --git a/build/config/siso/reproxy.star b/build/config/siso/reproxy.star index 8a351f7..cc1081e 100644 --- a/build/config/siso/reproxy.star +++ b/build/config/siso/reproxy.star @@ -1,16 +1,20 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for rewriting remote calls into reproxy config.""" load("@builtin//encoding.star", "json") load("@builtin//lib/gn.star", "gn") +load("@builtin//path.star", "path") load("@builtin//struct.star", "module") -load("./rewrapper_cfg.star", "rewrapper_cfg") load("./clang_code_coverage_wrapper.star", "clang_code_coverage_wrapper") +load("./config.star", "config") +load("./platform.star", "platform") +load("./rewrapper_cfg.star", "rewrapper_cfg") -__filegroups = {} +def __filegroups(ctx): + return {} def __parse_rewrapper_cmdline(ctx, cmd): if not "rewrapper" in cmd.args[0]: @@ -37,27 +41,54 @@ def __parse_rewrapper_cmdline(ctx, cmd): break if wrapped_command_pos < 1: fail("couldn't find first non-arg passed to rewrapper for %s" % str(cmd.args)) - return cmd.args[wrapped_command_pos:], cfg_file, True + if not cfg_file: + return cmd.args[wrapped_command_pos:], None, True + return cmd.args[wrapped_command_pos:], rewrapper_cfg.parse(ctx, cfg_file), True -def __rewrite_rewrapper(ctx, cmd): - args, cfg_file, wrapped = __parse_rewrapper_cmdline(ctx, cmd) - if not wrapped: - return +def __parse_cros_rewrapper_cmdline(ctx, cmd): + # fix cros sdk clang command line and extract rewrapper cfg. + # Example command: + # ../../build/cros_cache/chrome-sdk/symlinks/amd64-generic+15629.0.0+target_toolchain/bin/x86_64-cros-linux-gnu-clang++ + # -MMD -MF obj/third_party/abseil-cpp/absl/base/base/spinlock.o.d + # ... + # --rewrapper-path /usr/local/google/home/ukai/src/chromium/src/build/args/chromeos/rewrapper_amd64-generic + # --rewrapper-cfg ../../buildtools/reclient_cfgs/chromium-browser-clang/rewrapper_linux.cfg + # -pipe -march=x86-64 -msse3 ... + cfg_file = None + skip = "" + args = [] + toolchainpath = None + for i, arg in enumerate(cmd.args): + if i == 0: + toolchainpath = path.dir(path.dir(ctx.fs.canonpath(arg))) + args.append(arg) + continue + if skip: + if skip == "--rewrapper-cfg": + cfg_file = ctx.fs.canonpath(arg) + skip = "" + continue + if arg in ("--rewrapper-path", "--rewrapper-cfg"): + skip = arg + continue + args.append(arg) if not cfg_file: fail("couldn't find rewrapper cfg file in %s" % str(cmd.args)) - ctx.actions.fix( - args = args, - reproxy_config = json.encode(rewrapper_cfg.parse(ctx, cfg_file)), - ) - -def __strip_rewrapper(ctx, cmd): - args, _, wrapped = __parse_rewrapper_cmdline(ctx, cmd) - if not wrapped: - return - ctx.actions.fix(args = args) + rwcfg = rewrapper_cfg.parse(ctx, cfg_file) + inputs = rwcfg.get("inputs", []) + inputs.extend([ + path.join(toolchainpath, "bin"), + path.join(toolchainpath, "lib"), + path.join(toolchainpath, "usr/bin"), + # TODO: b/320189180 - Simple Chrome builds should use libraries under usr/lib64. + # But, Ninja/Reclient also don't use them unexpectedly. + ]) + rwcfg["inputs"] = inputs + rwcfg["preserve_symlinks"] = True + return args, rwcfg # TODO(b/278225415): change gn so this wrapper (and by extension this handler) becomes unnecessary. -def __rewrite_clang_code_coverage_wrapper(ctx, cmd): +def __parse_clang_code_coverage_wrapper_cmdline(ctx, cmd): # Example command: # python3 # ../../build/toolchain/clang_code_coverage_wrapper.py @@ -94,57 +125,72 @@ def __rewrite_clang_code_coverage_wrapper(ctx, cmd): fail("couldn't find rewrapper cfg file in %s" % str(cmd.args)) coverage_wrapper_command = cmd.args[:rewrapper_pos] + cmd.args[wrapped_command_pos:] clang_command = clang_code_coverage_wrapper.run(ctx, list(coverage_wrapper_command)) + if len(clang_command) > 1 and "/chrome-sdk/" in clang_command[0]: + # TODO: implement cros sdk support under code coverage wrapper + fail("need to fix handler for cros sdk under code coverage wrapper") + return clang_command, rewrapper_cfg.parse(ctx, cfg_file) +def __rewrite_rewrapper(ctx, cmd, use_large = False): + # If clang-coverage, needs different handling. + if len(cmd.args) > 2 and "clang_code_coverage_wrapper.py" in cmd.args[1]: + args, rwcfg = __parse_clang_code_coverage_wrapper_cmdline(ctx, cmd) + elif len(cmd.args) > 1 and "/chrome-sdk/" in cmd.args[0]: + args, rwcfg = __parse_cros_rewrapper_cmdline(ctx, cmd) + else: + # handling for generic rewrapper. + args, rwcfg, wrapped = __parse_rewrapper_cmdline(ctx, cmd) + if not wrapped: + print("command doesn't have rewrapper. %s" % str(cmd.args)) + return + if not rwcfg: + fail("couldn't find rewrapper cfg file in %s" % str(cmd.args)) + if cmd.outputs[0] == ctx.fs.canonpath("./obj/third_party/abseil-cpp/absl/functional/any_invocable_test/any_invocable_test.o"): + # need longer timeout for any_invocable_test.o crbug.com/1484474 + rwcfg.update({ + "exec_timeout": "4m", + }) + if use_large: + if "platform" in rwcfg: + action_key = None + for key in rwcfg["platform"]: + if key.startswith("label:action_"): + action_key = key + break + if action_key: + rwcfg["platform"].pop(action_key) + else: + rwcfg["platform"] = {} + rwcfg["platform"].update({ + "label:action_large": "1", + }) ctx.actions.fix( - args = clang_command, - reproxy_config = json.encode(rewrapper_cfg.parse(ctx, cfg_file)), + args = args, + reproxy_config = json.encode(rwcfg), ) -def __rewrite_action_remote_py(ctx, cmd): - # Example command: - # python3 - # ../../build/util/action_remote.py - # ../../buildtools/reclient/rewrapper - # --custom_processor=mojom_parser - # --cfg=../../buildtools/reclient_cfgs/python/rewrapper_linux.cfg - # --exec_root=/path/to/your/chromium/src/ - # --input_list_paths=gen/gpu/ipc/common/surface_handle__parser__remote_inputs.rsp - # --output_list_paths=gen/gpu/ipc/common/surface_handle__parser__remote_outputs.rsp - # python3 - # ../../mojo/public/tools/mojom/mojom_parser.py - # [rest of mojo args] - # We don't need to care about: - # --exec_root: Siso already knows this. - # --custom_processor: Used by action_remote.py to apply mojo handling. - # --[input,output]_list_paths: We should always use mojo.star for Siso. - wrapped_command_pos = -1 - cfg_file = None - for i, arg in enumerate(cmd.args): - if i < 3: - continue - if arg.startswith("--cfg="): - cfg_file = ctx.fs.canonpath(arg.removeprefix("--cfg=")) - continue - if not arg.startswith("-"): - wrapped_command_pos = i - break - if wrapped_command_pos < 1: - fail("couldn't find action command in %s" % str(cmd.args)) - ctx.actions.fix( - args = cmd.args[wrapped_command_pos:], - reproxy_config = json.encode(rewrapper_cfg.parse(ctx, cfg_file)), - ) +def __rewrite_rewrapper_large(ctx, cmd): + return __rewrite_rewrapper(ctx, cmd, use_large = True) + +def __strip_rewrapper(ctx, cmd): + # If clang-coverage, needs different handling. + if len(cmd.args) > 2 and "clang_code_coverage_wrapper.py" in cmd.args[1]: + args, _ = __parse_clang_code_coverage_wrapper_cmdline(ctx, cmd) + else: + args, _, wrapped = __parse_rewrapper_cmdline(ctx, cmd) + if not wrapped: + print("command doesn't have rewrapper. %s" % str(cmd.args)) + return + ctx.actions.fix(args = args) __handlers = { "rewrite_rewrapper": __rewrite_rewrapper, + "rewrite_rewrapper_large": __rewrite_rewrapper_large, "strip_rewrapper": __strip_rewrapper, - "rewrite_clang_code_coverage_wrapper": __rewrite_clang_code_coverage_wrapper, - "rewrite_action_remote_py": __rewrite_action_remote_py, } def __use_remoteexec(ctx): if "args.gn" in ctx.metadata: - gn_args = gn.parse_args(ctx.metadata["args.gn"]) + gn_args = gn.args(ctx) if gn_args.get("use_remoteexec") == "true": return True return False @@ -152,35 +198,31 @@ def __use_remoteexec(ctx): def __step_config(ctx, step_config): # New rules to convert commands calling rewrapper to use reproxy instead. new_rules = [ - # mojo/mojom_bindings_generator will not always have rewrapper args. - # First add this rule for commands with rewrapper args. The native remote rule for non-rewrapper invocations is converted automatically below. + # Disabling remote should always come first. { - "name": "mojo/mojom_bindings_generator_rewrapper", - "action": "mojom_(.*_)?__generator", - "command_prefix": "python3 ../../build/util/action_remote.py ../../buildtools/reclient/rewrapper --cfg=", - "handler": "rewrite_action_remote_py", - }, - # Handle generic action_remote calls. - { - "name": "action_remote", - "command_prefix": "python3 ../../build/util/action_remote.py ../../buildtools/reclient/rewrapper", - "handler": "rewrite_action_remote_py", + # TODO(b/281663988): missing headers. + "name": "b281663988/missing-headers", + "action_outs": [ + "./obj/ui/qt/qt5_shim/qt_shim.o", + "./obj/ui/qt/qt6_shim/qt_shim.o", + "./obj/ui/qt/qt5_shim/qt5_shim_moc.o", + "./obj/ui/qt/qt6_shim/qt6_shim_moc.o", + "./obj/ui/qt/qt_interface/qt_interface.o", + ], + "remote": False, + "handler": "strip_rewrapper", }, ] - for rule in step_config["rules"]: - # mojo/mojom_parser will always have rewrapper config when use_remoteexec=true. - # Mutate the original step rule to rewrite rewrapper and convert its rewrapper config to reproxy config. - # Stop handling the rule so that it's not modified below. - # TODO(b/292838933): Implement mojom_parser processor in Starlark? - if rule["name"] == "mojo/mojom_parser": - rule.update({ - "command_prefix": "python3 ../../build/util/action_remote.py ../../buildtools/reclient/rewrapper --custom_processor=mojom_parser", - "handler": "rewrite_action_remote_py", - }) - new_rules.insert(0, rule) - continue + # Disable racing on builders since bots don't have many CPU cores. + # TODO: b/297807325 - Siso wants to handle local execution. + # However, Reclient's alerts require racing and local fallback to be + # done on Reproxy side. + exec_strategy = "racing" + if config.get(ctx, "builder"): + exec_strategy = "remote_local_fallback" + for rule in step_config["rules"]: # Replace nacl-clang/clang++ rules without command_prefix, because they will incorrectly match rewrapper. # Replace the original step rule with one that only rewrites rewrapper and convert its rewrapper config to reproxy config. if rule["name"].find("nacl-clang") >= 0 and not rule.get("command_prefix"): @@ -192,36 +234,28 @@ def __step_config(ctx, step_config): new_rules.append(new_rule) continue - # clang will always have rewrapper config when use_remoteexec=true. + # clang cxx/cc/objcxx/objc will always have rewrapper config when use_remoteexec=true. # Remove the native siso handling and replace with custom rewrapper-specific handling. # All other rule values are not reused, instead use rewrapper config via handler. - if rule["name"].startswith("clang/") or rule["name"].startswith("clang-cl/"): + # (In particular, command_prefix should be avoided because it will be rewrapper.) + if (rule["name"].startswith("clang/cxx") or rule["name"].startswith("clang/cc") or + rule["name"].startswith("clang-cl/cxx") or rule["name"].startswith("clang-cl/cc") or + rule["name"].startswith("clang/objc")): if not rule.get("action"): fail("clang rule %s found without action" % rule["name"]) + new_rule = { "name": rule["name"], "action": rule["action"], + "exclude_input_patterns": rule.get("exclude_input_patterns"), "handler": "rewrite_rewrapper", + "input_root_absolute_path": rule.get("input_root_absolute_path"), } new_rules.append(new_rule) continue - # clang-coverage will always have rewrapper config when use_remoteexec=true. - # Remove the native siso handling and replace with custom rewrapper-specific handling. - # All other rule values are not reused, instead use rewrapper config via handler. - # TODO(b/278225415): change gn so this wrapper (and by extension these rules) become unnecessary. - if rule["name"].startswith("clang-coverage"): - if rule["command_prefix"].find("../../build/toolchain/clang_code_coverage_wrapper.py") < 0: - fail("clang-coverage rule %s found without clang_code_coverage_wrapper.py in command_prefix" % rule["name"]) - new_rule = { - "name": rule["name"], - "command_prefix": rule["command_prefix"], - "handler": "rewrite_clang_code_coverage_wrapper", - } - - # Insert clang-coverage/ rules at the top. - # They are more specific than reproxy clang/ rules, therefore should not be placed after. - new_rules.insert(0, new_rule) + # clang-coverage/ is handled by the rewrite_rewrapper handler of clang/{cxx, cc} action rules above, so ignore these rules. + if rule["name"].startswith("clang-coverage/"): continue # Add non-remote rules as-is. @@ -232,22 +266,23 @@ def __step_config(ctx, step_config): # Finally handle remaining remote rules. It's assumed it is enough to only convert native remote config to reproxy config. platform_ref = rule.get("platform_ref") if platform_ref: - platform = step_config["platforms"].get(platform_ref) - if not platform: + p = step_config["platforms"].get(platform_ref) + if not p: fail("Rule %s uses undefined platform '%s'" % (rule["name"], platform_ref)) else: - platform = step_config.get("platforms", {}).get("default") - if not platform: + p = step_config.get("platforms", {}).get("default") + if not p: fail("Rule %s did not set platform_ref but no default platform exists" % rule["name"]) rule["reproxy_config"] = { - "platform": platform, + "platform": p, "labels": { "type": "tool", + "siso_rule": rule["name"], }, - "inputs": rule.get("inputs", []), "canonicalize_working_dir": rule.get("canonicalize_dir", False), - "exec_strategy": "remote", + "exec_strategy": exec_strategy, "exec_timeout": rule.get("timeout", "10m"), + "reclient_timeout": rule.get("timeout", "10m"), "download_outputs": True, } new_rules.append(rule) diff --git a/build/config/siso/rewrapper_cfg.star b/build/config/siso/rewrapper_cfg.star index 741c669..1819e25 100644 --- a/build/config/siso/rewrapper_cfg.star +++ b/build/config/siso/rewrapper_cfg.star @@ -5,6 +5,7 @@ """Siso configuration for parsing rewrapper cfg file.""" load("@builtin//struct.star", "module") +load("./config.star", "config") def __parse(ctx, cfg_file): if not cfg_file: @@ -22,11 +23,19 @@ def __parse(ctx, cfg_file): reproxy_config["download_outputs"] = line.removeprefix("download_outputs=").lower() == "true" if line.startswith("exec_strategy="): - reproxy_config["exec_strategy"] = line.removeprefix("exec_strategy=") + exec_strategy = line.removeprefix("exec_strategy=") + + # Disable racing on builders since bots don't have many CPU cores. + if exec_strategy == "racing" and config.get(ctx, "builder"): + exec_strategy = "remote_local_fallback" + reproxy_config["exec_strategy"] = exec_strategy if line.startswith("exec_timeout="): reproxy_config["exec_timeout"] = line.removeprefix("exec_timeout=") + if line.startswith("reclient_timeout="): + reproxy_config["reclient_timeout"] = line.removeprefix("reclient_timeout=") + if line.startswith("inputs="): reproxy_config["inputs"] = line.removeprefix("inputs=").split(",") diff --git a/build/config/siso/rust_linux.star b/build/config/siso/rust_linux.star new file mode 100644 index 0000000..bdfc9ae --- /dev/null +++ b/build/config/siso/rust_linux.star @@ -0,0 +1,171 @@ +# -*- bazel-starlark -*- +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Siso configuration for rust/linux.""" + +load("@builtin//struct.star", "module") + +def __filegroups(ctx): + return { + "third_party/rust-toolchain:toolchain": { + "type": "glob", + "includes": [ + "bin/rustc", + "lib/*.so", + "lib/rustlib/src/rust/library/std/src/lib.rs", + "lib/rustlib/x86_64-unknown-linux-gnu/lib/*", + ], + }, + "build/linux/debian_bullseye_amd64-sysroot:rustlink": { + "type": "glob", + "includes": [ + "*.so", + "*.so.*", + "*.o", + "*.a", + ], + }, + "third_party/llvm-build/Release+Asserts:rustlink": { + "type": "glob", + "includes": [ + "bin/clang", + "bin/clang++", + "bin/*lld", + "libclang*.a", + ], + }, + "third_party/fuchsia-sdk/sdk/arch/x64/lib:rustlink": { + "type": "glob", + "includes": [ + "*", + ], + }, + "third_party/fuchsia-sdk/sdk/arch/x64/sysroot:rustlink": { + "type": "glob", + "includes": [ + "lib/*", + ], + }, + } + +def __rust_bin_handler(ctx, cmd): + inputs = [] + use_android_toolchain = None + target = None + for i, arg in enumerate(cmd.args): + if arg.startswith("--sysroot=../../third_party/fuchsia-sdk/sdk/arch/x64/sysroot"): + inputs.extend([ + "third_party/fuchsia-sdk/sdk/arch/x64/lib:rustlink", + "third_party/fuchsia-sdk/sdk/arch/x64/sysroot:rustlink", + ]) + elif arg.startswith("--sysroot=../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot"): + use_android_toolchain = True + if arg.startswith("--target="): + target = arg.removeprefix("--target=") + if use_android_toolchain and target: + # e.g. target=aarch64-linux-android26 + android_ver = "" + i = target.find("android") + if i >= 0: + android_ver = target[i:].removeprefix("android").removeprefix("eabi") + if android_ver: + android_arch = target.removesuffix(android_ver) + filegroup = "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/%s/%s:link" % (android_arch, android_ver) + inputs.append(filegroup) + + ctx.actions.fix(inputs = cmd.inputs + inputs) + +__handlers = { + "rust_bin_handler": __rust_bin_handler, +} + +def __step_config(ctx, step_config): + remote_run = True # Turn this to False when you do file access trace. + platform_ref = "large" # Rust actions run faster on large workers. + clang_inputs = [ + "build/linux/debian_bullseye_amd64-sysroot:rustlink", + "third_party/llvm-build/Release+Asserts:rustlink", + ] + rust_inputs = [ + "build/action_helpers.py", + "build/gn_helpers.py", + "build/rust/rustc_wrapper.py", + # TODO(b/285225184): use precomputed subtree + "third_party/rust-toolchain:toolchain", + ] + rust_indirect_inputs = { + "includes": [ + "*.h", + "*.o", + "*.rlib", + "*.rs", + "*.so", + ], + } + step_config["rules"].extend([ + { + "name": "rust_bin", + "action": "(.*_)?rust_bin", + "inputs": rust_inputs + clang_inputs, + "indirect_inputs": rust_indirect_inputs, + "handler": "rust_bin_handler", + "deps": "none", # disable gcc scandeps + "remote": remote_run, + # "canonicalize_dir": True, # TODO(b/300352286) + "timeout": "2m", + "platform_ref": platform_ref, + }, + { + "name": "rust_cdylib", + "action": "(.*_)?rust_cdylib", + "inputs": rust_inputs + clang_inputs, + "indirect_inputs": rust_indirect_inputs, + "deps": "none", # disable gcc scandeps + "remote": remote_run, + "canonicalize_dir": True, + "timeout": "2m", + "platform_ref": platform_ref, + }, + { + "name": "rust_macro", + "action": "(.*_)?rust_macro", + "inputs": rust_inputs + clang_inputs, + "indirect_inputs": rust_indirect_inputs, + "deps": "none", # disable gcc scandeps + "remote": remote_run, + "canonicalize_dir": True, + "timeout": "2m", + "platform_ref": platform_ref, + }, + { + "name": "rust_rlib", + "action": "(.*_)?rust_rlib", + "inputs": rust_inputs, + "indirect_inputs": rust_indirect_inputs, + "deps": "none", # disable gcc scandeps + "remote": remote_run, + # "canonicalize_dir": True, # TODO(b/300352286) + "timeout": "2m", + "platform_ref": platform_ref, + }, + { + "name": "rust_staticlib", + "action": "(.*_)?rust_staticlib", + "inputs": rust_inputs, + "indirect_inputs": rust_indirect_inputs, + "deps": "none", # disable gcc scandeps + "remote": remote_run, + "canonicalize_dir": True, + "timeout": "2m", + "platform_ref": platform_ref, + }, + ]) + return step_config + +rust = module( + "rust", + filegroups = __filegroups, + handlers = __handlers, + step_config = __step_config, +) diff --git a/build/config/siso/simple.star b/build/config/siso/simple.star index 71b18d0..5cf4177 100644 --- a/build/config/siso/simple.star +++ b/build/config/siso/simple.star @@ -1,11 +1,14 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for simple steps.""" load("@builtin//struct.star", "module") +def __filegroups(ctx): + return {} + def __copy(ctx, cmd): input = cmd.inputs[0] out = cmd.outputs[0] @@ -13,8 +16,19 @@ def __copy(ctx, cmd): ctx.actions.exit(exit_status = 0) def __stamp(ctx, cmd): + if len(cmd.outputs) > 1: + # run touch command as is? + # iOS build stamp after swiftc.py would try to touch + # dir and non-exist-in-hashfs file? + # TODO(b/300385880): fix this workaround. + return + + # don't truncate if file exists. out = cmd.outputs[0] - ctx.actions.write(out) + if ctx.fs.exists(out): + ctx.actions.write(out, ctx.fs.read(out)) + else: + ctx.actions.write(out) ctx.actions.exit(exit_status = 0) __handlers = { @@ -41,6 +55,6 @@ def __step_config(ctx, step_config): simple = module( "simple", step_config = __step_config, - filegroups = {}, + filegroups = __filegroups, handlers = __handlers, ) diff --git a/build/config/siso/tsc.star b/build/config/siso/tsc.star new file mode 100644 index 0000000..e61ff48 --- /dev/null +++ b/build/config/siso/tsc.star @@ -0,0 +1,57 @@ +# -*- bazel-starlark -*- +load("@builtin//encoding.star", "json") +load("@builtin//path.star", "path") +load("@builtin//struct.star", "module") + +def _load(ctx, tsconfig_path, loaded): + if tsconfig_path in loaded: + return loaded[tsconfig_path] + tsconfig = json.decode(str(ctx.fs.read(tsconfig_path))) + loaded[tsconfig_path] = tsconfig + return tsconfig + +def _paths(ctx, tsconfig_path, tsconfig, loaded): + paths = [tsconfig_path] + tsconfig_dir = path.dir(tsconfig_path) + if "files" in tsconfig: + for file in tsconfig["files"]: + paths.append(path.join(tsconfig_dir, file)) + if file.endswith(".js"): + # Add if d.ts version of the file exists. + file_dts = path.join(tsconfig_dir, file[:-2] + "d.ts") + if ctx.fs.exists(file_dts): + paths.append(file_dts) + return paths + +def _scan_inputs(ctx, tsconfig_path, tsconfig, loaded, scanned): + if tsconfig_path in scanned: + return scanned[tsconfig_path] + inputs = {} + for fname in _paths(ctx, tsconfig_path, tsconfig, loaded): + if fname not in inputs: + inputs[fname] = True + tsconfig_dir = path.dir(tsconfig_path) + tsconfig_deps = [ref["path"] for ref in tsconfig.get("references", [])] + if "extends" in tsconfig: + tsconfig_deps.append(tsconfig["extends"]) + for tsconfig_dep in tsconfig_deps: + ref_path = path.join(tsconfig_dir, tsconfig_dep) + if ref_path not in inputs: + inputs[ref_path] = True + ref_tsconfig = _load(ctx, ref_path, loaded) + for fname in _scan_inputs(ctx, ref_path, ref_tsconfig, loaded, scanned): + if fname not in inputs: + inputs[fname] = True + scanned[tsconfig_path] = inputs.keys() + return scanned[tsconfig_path] + +def _scandeps(ctx, tsconfig_path, tsconfig): + loaded = {tsconfig_path: tsconfig} + scanned = {} + inputs = _scan_inputs(ctx, tsconfig_path, tsconfig, loaded, scanned) + return inputs + +tsc = module( + "tsc", + scandeps = _scandeps, +) diff --git a/build/config/siso/typescript_all.star b/build/config/siso/typescript_all.star new file mode 100644 index 0000000..dcbee83 --- /dev/null +++ b/build/config/siso/typescript_all.star @@ -0,0 +1,137 @@ +# -*- bazel-starlark -*- +load("@builtin//encoding.star", "json") +load("@builtin//path.star", "path") +load("@builtin//struct.star", "module") +load("./tsc.star", "tsc") + +# TODO: crbug.com/1298825 - fix missing *.d.ts in tsconfig. +__input_deps = { + "tools/typescript/definitions/settings_private.d.ts": [ + "tools/typescript/definitions/chrome_event.d.ts", + ], + "tools/typescript/definitions/tabs.d.ts": [ + "tools/typescript/definitions/chrome_event.d.ts", + ], + "chrome/browser/resources/inline_login/inline_login_app.ts": [ + "chrome/browser/resources/chromeos/arc_account_picker/arc_account_picker_app.d.ts", + "chrome/browser/resources/chromeos/arc_account_picker/arc_account_picker_browser_proxy.d.ts", + "chrome/browser/resources/chromeos/arc_account_picker/arc_util.d.ts", + "chrome/browser/resources/gaia_auth_host/authenticator.d.ts", + "chrome/browser/resources/gaia_auth_host/saml_password_attributes.d.ts", + ], + "chrome/test/data/webui/inline_login/arc_account_picker_page_test.ts": [ + "chrome/test/data/webui/chromeos/arc_account_picker/test_util.d.ts", + ], + "third_party/polymer/v3_0/components-chromium/polymer/polymer.d.ts": [ + "third_party/polymer/v3_0/components-chromium/iron-dropdown/iron-dropdown.d.ts", + "third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior.d.ts", + "third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/iron-scroll-manager.d.ts", + "third_party/polymer/v3_0/components-chromium/neon-animation/neon-animatable-behavior.d.ts", + "third_party/polymer/v3_0/components-chromium/neon-animation/neon-animation-runner-behavior.d.ts", + "third_party/polymer/v3_0/components-chromium/paper-behaviors/paper-ripple-behavior.d.ts", + "third_party/polymer/v3_0/components-chromium/polymer/lib/utils/hide-template-controls.d.ts", + "third_party/polymer/v3_0/components-chromium/polymer/lib/utils/scope-subtree.d.ts", + ], + "./gen/chrome/test/data/webui/inline_login/preprocessed/arc_account_picker_page_test.ts": [ + "chrome/browser/resources/chromeos/arc_account_picker/arc_account_picker_browser_proxy.d.ts", + "chrome/test/data/webui/chromeos/arc_account_picker/test_util.d.ts", + ], + "third_party/material_web_components/tsconfig_base.json": [ + "third_party/material_web_components/components-chromium/node_modules:node_modules", + ], +} + +# TODO: crbug.com/1478909 - Specify typescript inputs in GN config. +def __filegroups(ctx): + return { + "third_party/node/node_modules:node_modules": { + "type": "glob", + "includes": ["*.js", "*.cjs", "*.mjs", "*.json", "*.js.flow", "*.ts", "rollup", "terser", "tsc"], + }, + "third_party/material_web_components/components-chromium/node_modules:node_modules": { + "type": "glob", + "includes": ["*.js", "*.json", "*.ts"], + }, + } + +def _ts_library(ctx, cmd): + in_files = [] + deps = [] + definitions = [] + flag = "" + tsconfig_base = None + for i, arg in enumerate(cmd.args): + if flag != "" and arg.startswith("-"): + flag = "" + if flag == "--in_files": + in_files.append(arg) + continue + if flag == "--definitions": + definitions.append(arg) + continue + if flag == "--deps": + deps.append(arg) + continue + if flag == "--path_mappings": + continue + if arg == "--root_dir": + root_dir = cmd.args[i + 1] + if arg == "--gen_dir": + gen_dir = cmd.args[i + 1] + if arg == "--out_dir": + out_dir = cmd.args[i + 1] + if arg == "--tsconfig_base": + tsconfig_base = cmd.args[i + 1] + if arg in ("--in_files", "--definitions", "--deps", "--path_mappings"): + flag = arg + root_dir = path.rel(gen_dir, root_dir) + out_dir = path.rel(gen_dir, out_dir) + gen_dir = ctx.fs.canonpath(gen_dir) + tsconfig = {} + if tsconfig_base: + tsconfig["extends"] = tsconfig_base + tsconfig["files"] = [path.join(root_dir, f) for f in in_files] + tsconfig["files"].extend(definitions) + tsconfig["references"] = [{"path": dep} for dep in deps] + tsconfig_path = path.join(gen_dir, "tsconfig.json") + deps = tsc.scandeps(ctx, tsconfig_path, tsconfig) + ctx.actions.fix(inputs = cmd.inputs + deps) + +def _ts_definitions(ctx, cmd): + js_files = [] + flag = "" + for i, arg in enumerate(cmd.args): + if flag != "" and arg.startswith("-"): + flag = "" + if flag == "--js_files": + js_files.append(arg) + continue + if flag == "--path_mappings": + continue + if arg == "--gen_dir": + gen_dir = cmd.args[i + 1] + if arg == "--out_dir": + out_dir = cmd.args[i + 1] + if arg == "--root_dir": + root_dir = cmd.args[i + 1] + if arg in ("--js_files", "--path_mappings"): + flag = arg + tsconfig = json.decode(str(ctx.fs.read("tools/typescript/tsconfig_definitions_base.json"))) + root_dir = path.rel(gen_dir, root_dir) + out_dir = path.rel(gen_dir, out_dir) + gen_dir = ctx.fs.canonpath(gen_dir) + tsconfig["files"] = [path.join(root_dir, f) for f in js_files] + tsconfig_path = path.join(gen_dir, "tsconfig.definitions.json") + deps = tsc.scandeps(ctx, tsconfig_path, tsconfig) + print("_ts_definitions: tsconfig=%s, deps=%s" % (tsconfig, deps)) + ctx.actions.fix(inputs = cmd.inputs + deps) + +typescript_all = module( + "typescript_all", + handlers = { + "typescript_ts_library": _ts_library, + "typescript_ts_definitions": _ts_definitions, + }, + filegroups = __filegroups, + input_deps = __input_deps, +) diff --git a/build/config/siso/typescript_unix.star b/build/config/siso/typescript_unix.star new file mode 100644 index 0000000..799c713 --- /dev/null +++ b/build/config/siso/typescript_unix.star @@ -0,0 +1,72 @@ +# -*- bazel-starlark -*- +load("@builtin//struct.star", "module") +load("./config.star", "config") +load("./typescript_all.star", "typescript_all") + +__handlers = {} +__handlers.update(typescript_all.handlers) + +def __step_config(ctx, step_config): + remote_run = True + step_config["input_deps"].update(typescript_all.input_deps) + + # TODO: crbug.com/1478909 - Specify typescript inputs in GN config. + step_config["input_deps"].update({ + "tools/typescript/ts_definitions.py": [ + "third_party/node/linux/node-linux-x64/bin/node", + "third_party/node/node_modules:node_modules", + ], + "tools/typescript/ts_library.py": [ + "third_party/node/linux/node-linux-x64/bin/node", + "third_party/node/node.py", + "third_party/node/node_modules:node_modules", + ], + }) + step_config["rules"].extend([ + { + "name": "typescript/ts_library", + "command_prefix": "python3 ../../tools/typescript/ts_library.py", + "inputs": [ + "tools/typescript/ts_library.py", + ], + "indirect_inputs": { + "includes": [ + "*.js", + "*.ts", + "*.json", + ], + }, + "exclude_input_patterns": [ + "*.stamp", + ], + "remote": remote_run, + "handler": "typescript_ts_library", + "output_local": True, + }, + { + "name": "typescript/ts_definitions", + "command_prefix": "python3 ../../tools/typescript/ts_definitions.py", + "inputs": [ + "tools/typescript/ts_definitions.py", + ], + "indirect_inputs": { + "includes": [ + "*.ts", # *.d.ts, *.css.ts, *.html.ts, etc + "*.json", + ], + }, + "exclude_input_patterns": [ + "*.stamp", + ], + "remote": remote_run, + "handler": "typescript_ts_definitions", + }, + ]) + return step_config + +typescript = module( + "typescript", + step_config = __step_config, + handlers = __handlers, + filegroups = typescript_all.filegroups, +) diff --git a/build/config/siso/windows.star b/build/config/siso/windows.star index a6b1296..17fd72d 100644 --- a/build/config/siso/windows.star +++ b/build/config/siso/windows.star @@ -1,5 +1,5 @@ # -*- bazel-starlark -*- -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for Windows.""" @@ -9,19 +9,17 @@ load("./clang_windows.star", "clang") load("./config.star", "config") load("./reproxy.star", "reproxy") -__filegroups = {} -__filegroups.update(clang.filegroups) +def __filegroups(ctx): + fg = {} + fg.update(clang.filegroups(ctx)) + return fg + __handlers = {} __handlers.update(clang.handlers) -__handlers.update(reproxy.handlers) def __step_config(ctx, step_config): config.check(ctx) - step_config["platforms"] = {} - step_config = clang.step_config(ctx, step_config) - if reproxy.enabled(ctx): - step_config = reproxy.step_config(ctx, step_config) return step_config chromium = module( diff --git a/build/config/sysroot.gni b/build/config/sysroot.gni index c669e26..c2b9fe6 100644 --- a/build/config/sysroot.gni +++ b/build/config/sysroot.gni @@ -21,9 +21,6 @@ declare_args() { # is empty, default sysroot is calculated. # PATCH(build-gn): Don't use sysroot by default. use_sysroot = false - - # PATCH(build-gn): Allow controlling debian platform. - debian_platform = "bullseye" } if (sysroot == "") { @@ -39,17 +36,17 @@ if (sysroot == "") { # By default build against a sysroot image downloaded from Cloud Storage # during gclient runhooks. if (current_cpu == "x64") { - sysroot = "$target_sysroot_dir/debian_${debian_platform}_amd64-sysroot" + sysroot = "$target_sysroot_dir/debian_bullseye_amd64-sysroot" } else if (current_cpu == "x86") { - sysroot = "$target_sysroot_dir/debian_${debian_platform}_i386-sysroot" + sysroot = "$target_sysroot_dir/debian_bullseye_i386-sysroot" } else if (current_cpu == "mipsel") { - sysroot = "$target_sysroot_dir/debian_${debian_platform}_mips-sysroot" + sysroot = "$target_sysroot_dir/debian_bullseye_mipsel-sysroot" } else if (current_cpu == "mips64el") { - sysroot = "$target_sysroot_dir/debian_${debian_platform}_mips64el-sysroot" + sysroot = "$target_sysroot_dir/debian_bullseye_mips64el-sysroot" } else if (current_cpu == "arm") { - sysroot = "$target_sysroot_dir/debian_${debian_platform}_arm-sysroot" + sysroot = "$target_sysroot_dir/debian_bullseye_armhf-sysroot" } else if (current_cpu == "arm64") { - sysroot = "$target_sysroot_dir/debian_${debian_platform}_arm64-sysroot" + sysroot = "$target_sysroot_dir/debian_bullseye_arm64-sysroot" } else { assert(false, "No linux sysroot for cpu: $target_cpu") } diff --git a/build/config/ui.gni b/build/config/ui.gni index b560f37..1ad21d7 100644 --- a/build/config/ui.gni +++ b/build/config/ui.gni @@ -17,7 +17,7 @@ # There is more advice on where to put build flags in the "Build flag" section # of //build/config/BUILDCONFIG.gn. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") import("//build/config/chromeos/args.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/ozone.gni") diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn index fc1e312..b4ebf81 100644 --- a/build/config/win/BUILD.gn +++ b/build/config/win/BUILD.gn @@ -177,7 +177,13 @@ config("compiler") { # block maps. # This flag requires lld-link.exe or link.exe from VS 2022 or later to create # the PDBs, and tools from circa 22H2 or later to consume the PDBs. - ldflags += [ "/pdbpagesize:8192" ] + # Debug component builds can generate PDBs that exceed 8 GiB, so use an + # even larger page size, allowing up to 16 GiB PDBs. + if (is_debug && !is_component_build) { + ldflags += [ "/pdbpagesize:16384" ] + } else { + ldflags += [ "/pdbpagesize:8192" ] + } if (!is_debug && !is_component_build) { # Enable standard linker optimizations like GC (/OPT:REF) and ICF in static @@ -415,6 +421,7 @@ config("delayloads") { "/DELAYLOAD:credui.dll", "/DELAYLOAD:cryptui.dll", "/DELAYLOAD:d3d11.dll", + "/DELAYLOAD:d3d12.dll", "/DELAYLOAD:d3d9.dll", "/DELAYLOAD:dwmapi.dll", "/DELAYLOAD:dxgi.dll", @@ -429,6 +436,7 @@ config("delayloads") { "/DELAYLOAD:ncrypt.dll", "/DELAYLOAD:ole32.dll", "/DELAYLOAD:oleacc.dll", + "/DELAYLOAD:pdh.dll", "/DELAYLOAD:propsys.dll", "/DELAYLOAD:psapi.dll", "/DELAYLOAD:rpcrt4.dll", @@ -609,17 +617,9 @@ config("static_crt") { # Subsystem -------------------------------------------------------------------- # This is appended to the subsystem to specify a minimum version. -if (current_cpu == "x64") { - # The number after the comma is the minimum required OS version. - # 5.02 = Windows Server 2003. - subsystem_version_suffix = ",5.02" -} else if (current_cpu == "arm64") { - # Windows ARM64 requires Windows 10. - subsystem_version_suffix = ",10.0" -} else { - # 5.01 = Windows XP. - subsystem_version_suffix = ",5.01" -} +# The number after the comma is the minimum required OS version. +# Set to 10.0 since we only support >= Win10 since M110. +subsystem_version_suffix = ",10.0" config("console") { ldflags = [ "/SUBSYSTEM:CONSOLE$subsystem_version_suffix" ] diff --git a/build/dotfile_settings.gni b/build/dotfile_settings.gni index 50c04a8..ef20d19 100644 --- a/build/dotfile_settings.gni +++ b/build/dotfile_settings.gni @@ -34,6 +34,7 @@ build_dotfile_settings = { "//build/toolchain/concurrent_links.gni", "//build/toolchain/goma.gni", "//build/toolchain/nacl/BUILD.gn", + "//build/toolchain/rbe.gni", "//build/toolchain/toolchain.gni", "//build/toolchain/win/BUILD.gn", "//build/toolchain/win/win_toolchain_data.gni", diff --git a/build/extract_partition.py b/build/extract_partition.py index 319ce8f..5b8267a 100755 --- a/build/extract_partition.py +++ b/build/extract_partition.py @@ -6,7 +6,6 @@ import argparse import hashlib -import math import os import struct import subprocess @@ -73,16 +72,11 @@ def _ExtractPartition(objcopy, input_elf, output_elf, partition): old_build_id_file = os.path.join(tempdir, 'old_build_id') new_build_id_file = os.path.join(tempdir, 'new_build_id') - # Dump out build-id section and remove original build-id section from - # ELF file. + # Dump out build-id section. subprocess.check_call([ objcopy, '--extract-partition', partition, - # Note: Not using '--update-section' here as it is not supported - # by llvm-objcopy. - '--remove-section', - build_id_section, '--dump-section', '{}={}'.format(build_id_section, old_build_id_file), input_elf, @@ -112,15 +106,11 @@ def _ExtractPartition(objcopy, input_elf, output_elf, partition): with open(new_build_id_file, 'wb') as f: f.write(prefix + _ComputeNewBuildId(build_id, output_elf)) - # Write back the new build-id section. + # Update the build-id section. subprocess.check_call([ objcopy, - '--add-section', + '--update-section', '{}={}'.format(build_id_section, new_build_id_file), - # Add alloc section flag, or else the section will be removed by - # objcopy --strip-all when generating unstripped lib file. - '--set-section-flags', - '{}={}'.format(build_id_section, 'alloc'), temp_elf, output_elf, ]) diff --git a/build/fuchsia/COMMON_METADATA b/build/fuchsia/COMMON_METADATA index f7f8861..99cbf28 100644 --- a/build/fuchsia/COMMON_METADATA +++ b/build/fuchsia/COMMON_METADATA @@ -1,5 +1,8 @@ -monorail { +monorail: { component: "Fuchsia" } team_email: "fuchsia-dev@chromium.org" os: FUCHSIA +buganizer_public: { + component_id: 1456675 +} diff --git a/build/fuchsia/OWNERS b/build/fuchsia/OWNERS index 64bca9e..cbc29ca 100644 --- a/build/fuchsia/OWNERS +++ b/build/fuchsia/OWNERS @@ -4,14 +4,11 @@ # reviewer is added automatically. Thank you. ddorwin@chromium.org -fdegans@chromium.org -grt@chromium.org -kmarshall@chromium.org sergeyu@chromium.org wez@chromium.org +wintermelons@google.com +zijiehe@google.com -per-file linux.sdk.sha1=chromium-autoroll@skia-public.iam.gserviceaccount.com -per-file mac.sdk.sha1=chromium-autoroll@skia-public.iam.gserviceaccount.com per-file linux_internal.sdk.sha1=chromium-internal-autoroll@skia-corp.google.com.iam.gserviceaccount.com per-file SECURITY_OWNERS=set noparent diff --git a/build/fuchsia/PRESUBMIT.py b/build/fuchsia/PRESUBMIT.py index f8c7df2..41949b9 100644 --- a/build/fuchsia/PRESUBMIT.py +++ b/build/fuchsia/PRESUBMIT.py @@ -7,7 +7,6 @@ details on the presubmit API built into depot_tools. """ -USE_PYTHON3 = True import os @@ -23,23 +22,16 @@ def J(*dirs): unit_tests = [ J('binary_sizes_test.py'), J('binary_size_differ_test.py'), - J('device_target_test.py'), J('gcs_download_test.py'), J('update_images_test.py'), J('update_product_bundles_test.py'), J('update_sdk_test.py'), ] - # TODO(1309977): enable on Windows when fixed. - if os.name != 'nt': - unit_tests.extend([J('fvdl_target_test.py')]) tests.extend( input_api.canned_checks.GetUnitTests(input_api, output_api, - unit_tests=unit_tests, - run_on_python2=False, - run_on_python3=True, - skip_shebang_check=True)) + unit_tests=unit_tests)) return input_api.RunTests(tests) diff --git a/build/fuchsia/binary_size_differ.py b/build/fuchsia/binary_size_differ.py index d976a73..190a173 100755 --- a/build/fuchsia/binary_size_differ.py +++ b/build/fuchsia/binary_size_differ.py @@ -6,23 +6,11 @@ '''Implements Chrome-Fuchsia package binary size differ.''' import argparse -import collections -import copy import json -import logging -import math import os -import re -import shutil -import subprocess import sys -import tempfile -import time import traceback -import uuid -from common import GetHostToolPathFromPlatform, GetHostArchFromPlatform -from common import SDK_ROOT, DIR_SOURCE_ROOT from binary_sizes import ReadPackageSizesJson from binary_sizes import PACKAGES_SIZES_FILE @@ -72,6 +60,8 @@ def ComputePackageDiffs(before_sizes_file, after_sizes_file, author=None): ' {} bytes).
').format( package_name, growth['compressed'][package_name], growth['uncompressed'][package_name])) + summary += ('Note that this bot compares growth against trunk, and is ' + 'not aware of CL chaining.
') # Allow rollers to pass even with size increases. See crbug.com/1355914. if author and '-autoroll' in author and status_code == SIZE_FAILURE: diff --git a/build/fuchsia/binary_size_differ_test.py b/build/fuchsia/binary_size_differ_test.py index e18f1d0..6192bf2 100755 --- a/build/fuchsia/binary_size_differ_test.py +++ b/build/fuchsia/binary_size_differ_test.py @@ -12,8 +12,6 @@ import binary_size_differ import binary_sizes -from common import DIR_SOURCE_ROOT - _EXAMPLE_BLOBS_BEFORE = """ { "web_engine": [ diff --git a/build/fuchsia/binary_sizes.py b/build/fuchsia/binary_sizes.py index 2e64e8b..b1aa938 100755 --- a/build/fuchsia/binary_sizes.py +++ b/build/fuchsia/binary_sizes.py @@ -7,9 +7,7 @@ import argparse import collections -import copy import json -import logging import math import os import re @@ -21,8 +19,10 @@ import traceback import uuid -from common import GetHostToolPathFromPlatform, GetHostArchFromPlatform -from common import SDK_ROOT, DIR_SOURCE_ROOT +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), + 'test'))) + +from common import DIR_SRC_ROOT, SDK_ROOT, get_host_tool_path PACKAGES_BLOBS_FILE = 'package_blobs.json' PACKAGES_SIZES_FILE = 'package_sizes.json' @@ -102,7 +102,9 @@ def CreateTestResults(test_status, timestamp): results = { 'tests': {}, 'interrupted': False, - 'path_delimiter': '.', + 'metadata': { + 'test_name_prefix': 'build/fuchsia/' + }, 'version': 3, 'seconds_since_epoch': timestamp, } @@ -273,7 +275,7 @@ def ReadPackageSizesJson(json_path): def GetCompressedSize(file_path): """Measures file size after blobfs compression.""" - compressor_path = GetHostToolPathFromPlatform('blobfs-compression') + compressor_path = get_host_tool_path('blobfs-compression') try: temp_dir = tempfile.mkdtemp() compressed_file_path = os.path.join(temp_dir, os.path.basename(file_path)) @@ -311,7 +313,7 @@ def GetCompressedSize(file_path): def ExtractFarFile(file_path, extract_dir): """Extracts contents of a Fuchsia archive file to the specified directory.""" - far_tool = GetHostToolPathFromPlatform('far') + far_tool = get_host_tool_path('far') if not os.path.isfile(far_tool): raise Exception('Could not find FAR host tool "%s".' % far_tool) @@ -376,7 +378,7 @@ def GetPackageMerkleRoot(far_file_path): """Returns a package's Merkle digest.""" # The digest is the first word on the first line of the merkle tool's output. - merkle_tool = GetHostToolPathFromPlatform('merkleroot') + merkle_tool = get_host_tool_path('merkleroot') output = subprocess.check_output([merkle_tool, far_file_path]) return output.splitlines()[0].split()[0] @@ -552,7 +554,7 @@ def main(): raise Exception('Could not find build output directory "%s".' % args.build_out_dir) - with open(os.path.join(DIR_SOURCE_ROOT, args.sizes_path)) as sizes_file: + with open(os.path.join(DIR_SRC_ROOT, args.sizes_path)) as sizes_file: sizes_config = json.load(sizes_file) if args.verbose: diff --git a/build/fuchsia/binary_sizes_test.py b/build/fuchsia/binary_sizes_test.py index b25c5f2..2f9dcf2 100755 --- a/build/fuchsia/binary_sizes_test.py +++ b/build/fuchsia/binary_sizes_test.py @@ -6,14 +6,11 @@ import json import os import shutil -import subprocess import tempfile import unittest import binary_sizes -from common import DIR_SOURCE_ROOT - _EXAMPLE_BLOBS = """ { diff --git a/build/fuchsia/boot_data.py b/build/fuchsia/boot_data.py deleted file mode 100644 index df9e45c..0000000 --- a/build/fuchsia/boot_data.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Functions used to provision Fuchsia boot images.""" - -import common -import logging -import os -import subprocess -import tempfile -import time -import uuid - -_SSH_CONFIG_TEMPLATE = """ -Host * - CheckHostIP no - StrictHostKeyChecking no - ForwardAgent no - ForwardX11 no - User fuchsia - IdentitiesOnly yes - IdentityFile {identity} - ServerAliveInterval 2 - ServerAliveCountMax 5 - ControlMaster auto - ControlPersist 1m - ControlPath /tmp/ssh-%r@%h:%p - ConnectTimeout 5 - """ - -# Specifies boot files intended for use by an emulator. -TARGET_TYPE_QEMU = 'qemu' - -# Specifies boot files intended for use by anything (incl. physical devices). -TARGET_TYPE_GENERIC = 'generic' - -# Defaults used by Fuchsia SDK -_SSH_DIR = os.path.expanduser('~/.ssh') -_SSH_CONFIG_DIR = os.path.expanduser('~/.fuchsia') - - -def _GetAuthorizedKeysPath(): - """Returns a path to the authorized keys which get copied to your Fuchsia - device during paving""" - - return os.path.join(_SSH_DIR, 'fuchsia_authorized_keys') - - -def ProvisionSSH(): - """Generates a key pair and config file for SSH using the GN SDK.""" - - returncode, out, err = common.RunGnSdkFunction('fuchsia-common.sh', - 'check-fuchsia-ssh-config') - if returncode != 0: - logging.error('Command exited with error code %d' % (returncode)) - logging.error('Stdout: %s' % out) - logging.error('Stderr: %s' % err) - raise Exception('Failed to provision ssh keys') - - -def GetTargetFile(filename, image_path): - """Computes a path to |filename| in the Fuchsia boot image directory specific - to |image_path|.""" - - return os.path.join(common.IMAGES_ROOT, image_path, filename) - - -def GetSSHConfigPath(): - return os.path.join(_SSH_CONFIG_DIR, 'sshconfig') - - -def GetBootImage(output_dir, image_path, image_name): - """"Gets a path to the Zircon boot image, with the SSH client public key - added.""" - ProvisionSSH() - authkeys_path = _GetAuthorizedKeysPath() - zbi_tool = common.GetHostToolPathFromPlatform('zbi') - image_source_path = GetTargetFile(image_name, image_path) - image_dest_path = os.path.join(output_dir, 'gen', 'fuchsia-with-keys.zbi') - - cmd = [ - zbi_tool, '-o', image_dest_path, image_source_path, '-e', - 'data/ssh/authorized_keys=' + authkeys_path - ] - subprocess.check_call(cmd) - - return image_dest_path - - -def GetKernelArgs(): - """Returns a list of Zircon commandline arguments to use when booting a - system.""" - return [ - 'devmgr.epoch=%d' % time.time(), - 'blobfs.write-compression-algorithm=UNCOMPRESSED' - ] - - -def AssertBootImagesExist(image_path): - assert os.path.exists(GetTargetFile('fuchsia.zbi', image_path)), \ - 'This checkout is missing the files necessary for\n' \ - 'booting this configuration of Fuchsia.\n' \ - 'To check out the files, add this entry to the "custom_vars"\n' \ - 'section of your .gclient file:\n\n' \ - ' "checkout_fuchsia_boot_images": "%s"\n\n' % \ - image_path diff --git a/build/fuchsia/boot_data_test.py b/build/fuchsia/boot_data_test.py deleted file mode 100755 index 1c0f58b..0000000 --- a/build/fuchsia/boot_data_test.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env vpython3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import boot_data -import os -import unittest -from boot_data import _SSH_CONFIG_DIR, _SSH_DIR, _GetAuthorizedKeysPath, \ - GetSSHConfigPath - - -class TestBootData(unittest.TestCase): - def testProvisionSSHGeneratesFiles(self): - fuchsia_authorized_keys_path = _GetAuthorizedKeysPath() - fuchsia_id_key_path = os.path.join(_SSH_DIR, 'fuchsia_ed25519') - fuchsia_pub_key_path = os.path.join(_SSH_DIR, 'fuchsia_ed25519.pub') - ssh_config_path = GetSSHConfigPath() - # Check if the keys exists before generating. If they do, delete them - # afterwards before asserting if ProvisionSSH works. - authorized_key_before = os.path.exists(fuchsia_authorized_keys_path) - id_keys_before = os.path.exists(fuchsia_id_key_path) - pub_keys_before = os.path.exists(fuchsia_pub_key_path) - ssh_config_before = os.path.exists(ssh_config_path) - ssh_dir_before = os.path.exists(_SSH_CONFIG_DIR) - boot_data.ProvisionSSH() - authorized_key_after = os.path.exists(fuchsia_authorized_keys_path) - id_keys_after = os.path.exists(fuchsia_id_key_path) - ssh_config_after = os.path.exists(ssh_config_path) - if not authorized_key_before: - os.remove(fuchsia_authorized_keys_path) - if not id_keys_before: - os.remove(fuchsia_id_key_path) - if not pub_keys_before: - os.remove(fuchsia_pub_key_path) - if not ssh_config_before: - os.remove(ssh_config_path) - if not ssh_dir_before: - os.rmdir(_SSH_CONFIG_DIR) - self.assertTrue(os.path.exists(authorized_key_after)) - self.assertTrue(os.path.exists(id_keys_after)) - self.assertTrue(os.path.exists(ssh_config_after)) - - -if __name__ == '__main__': - unittest.main() diff --git a/build/fuchsia/cipd/BUILD.gn b/build/fuchsia/cipd/BUILD.gn index 80fe93b..5ec6b82 100644 --- a/build/fuchsia/cipd/BUILD.gn +++ b/build/fuchsia/cipd/BUILD.gn @@ -8,9 +8,10 @@ assert(is_fuchsia) import("//build/cipd/cipd.gni") import("//build/config/chrome_build.gni") +import("//build/config/compiler/compiler.gni") import("//build/util/process_version.gni") -import("//third_party/fuchsia-sdk/sdk/build/build_id_dir.gni") -import("//third_party/fuchsia-sdk/sdk/build/cipd.gni") +import("//third_party/fuchsia-gn-sdk/src/build_id_dir.gni") +import("//third_party/fuchsia-gn-sdk/src/cipd.gni") visibility = [ ":*" ] @@ -35,9 +36,6 @@ if (fuchsia_cipd_package_base_path == "") { # Archives related specifically to `fuchsia.web` _web_engine_directory = "web_engine" -# Archives related specifically to Chrome browser. -_chrome_directory = "chrome" - # Archives of tools intended to be run on a Linux/Mac host rather than the # Fuchsia device. _host_tools_directory = "host_tools" @@ -226,14 +224,6 @@ template("cipd_test_archive") { } } -cipd_archive("web_runner") { - package_subdirectory = _web_engine_directory - description = "Prebuilt WebRunner binaries for Fuchsia." - - deps = [ "//fuchsia_web/runners:web_runner_pkg" ] - sources = [ "${root_gen_dir}/fuchsia_web/runners/web_runner/web_runner.far" ] -} - cipd_archive("web_engine") { package_subdirectory = _web_engine_directory description = "Prebuilt WebEngine binaries for Fuchsia." @@ -301,11 +291,16 @@ cipd_test_archive("tests") { description = "Prebuilt Chromium tests for Fuchsia." testonly = true + _common_tests = [ + "${root_gen_dir}/base/base_unittests/base_unittests.far", + "${root_gen_dir}/ipc/ipc_tests/ipc_tests.far", + "${root_gen_dir}/media/media_unittests/media_unittests.far", + "${root_gen_dir}/mojo/mojo_unittests/mojo_unittests.far", + "${root_gen_dir}/skia/skia_unittests/skia_unittests.far", + "${root_gen_dir}/third_party/blink/common/blink_common_unittests/blink_common_unittests.far", + ] deps = [ "//base:base_unittests_pkg", - "//fuchsia_web/runners:cast_runner_integration_tests_pkg", - "//fuchsia_web/runners:web_runner_integration_tests_pkg", - "//fuchsia_web/webengine:web_engine_integration_tests_pkg", "//ipc:ipc_tests_pkg", "//media:media_unittests_pkg", "//mojo:mojo_unittests_pkg", @@ -313,42 +308,30 @@ cipd_test_archive("tests") { "//third_party/blink/common:blink_common_unittests_pkg", ] + _web_engine_tests = [ "${root_gen_dir}/fuchsia_web/webengine/web_engine_integration_tests/web_engine_integration_tests.far" ] + deps += [ "//fuchsia_web/webengine:web_engine_integration_tests_pkg" ] + + _cast_runner_tests = [ "${root_gen_dir}/fuchsia_web/runners/cast_runner_integration_tests/cast_runner_integration_tests.far" ] + deps += [ "//fuchsia_web/runners:cast_runner_integration_tests_pkg" ] + + _all_tests = _common_tests + _web_engine_tests + _cast_runner_tests + test_sets = [ { manifest_path = "${target_gen_dir}/test_manifest.json" - far_sources = [ - "${root_gen_dir}/base/base_unittests/base_unittests.far", - "${root_gen_dir}/fuchsia_web/runners/cast_runner_integration_tests/cast_runner_integration_tests.far", - "${root_gen_dir}/fuchsia_web/runners/web_runner_integration_tests/web_runner_integration_tests.far", - "${root_gen_dir}/fuchsia_web/webengine/web_engine_integration_tests/web_engine_integration_tests.far", - "${root_gen_dir}/ipc/ipc_tests/ipc_tests.far", - "${root_gen_dir}/media/media_unittests/media_unittests.far", - "${root_gen_dir}/mojo/mojo_unittests/mojo_unittests.far", - "${root_gen_dir}/skia/skia_unittests/skia_unittests.far", - "${root_gen_dir}/third_party/blink/common/blink_common_unittests/blink_common_unittests.far", - ] + far_sources = _all_tests }, { manifest_path = "${target_gen_dir}/common_tests_manifest.json" - far_sources = [ - "${root_gen_dir}/base/base_unittests/base_unittests.far", - "${root_gen_dir}/ipc/ipc_tests/ipc_tests.far", - "${root_gen_dir}/media/media_unittests/media_unittests.far", - "${root_gen_dir}/mojo/mojo_unittests/mojo_unittests.far", - "${root_gen_dir}/skia/skia_unittests/skia_unittests.far", - "${root_gen_dir}/third_party/blink/common/blink_common_unittests/blink_common_unittests.far", - ] + far_sources = _common_tests }, { manifest_path = "${target_gen_dir}/web_engine_tests_manifest.json" - far_sources = [ - "${root_gen_dir}/fuchsia_web/runners/web_runner_integration_tests/web_runner_integration_tests.far", - "${root_gen_dir}/fuchsia_web/webengine/web_engine_integration_tests/web_engine_integration_tests.far", - ] + far_sources = _web_engine_tests }, { manifest_path = "${target_gen_dir}/cast_runner_tests_manifest.json" - far_sources = [ "${root_gen_dir}/fuchsia_web/runners/cast_runner_integration_tests/cast_runner_integration_tests.far" ] + far_sources = _cast_runner_tests }, ] } @@ -378,44 +361,11 @@ fuchsia_cipd_package(_web_engine_debug_symbols_archive_name) { deps = [ ":${_web_engine_build_ids_target}" ] } -cipd_archive("chrome") { - package_subdirectory = _chrome_directory - description = "Prebuilt Chrome browser package." - - deps = [ "//chrome/app:chrome_pkg" ] - sources = [ "${root_gen_dir}/chrome/app/chrome/chrome.far" ] -} - -_chrome_build_ids_target = "chrome_debug_symbol_directory" -_chrome_debug_symbols_archive_name = "chrome_debug_symbols" -_chrome_debug_symbols_outdir = "${target_gen_dir}/${_chrome_debug_symbols_archive_name}/${_chrome_build_ids_target}" - -build_id_dir(_chrome_build_ids_target) { - testonly = true # Some of the archives contain test packages. - output_path = _chrome_debug_symbols_outdir - deps = [ ":chrome${_archive_suffix}" ] -} - -fuchsia_cipd_package(_chrome_debug_symbols_archive_name) { - testonly = true - package = - "${package_base_path}/${_chrome_directory}/${targetarch}/debug-symbols" - package_root = _chrome_debug_symbols_outdir - package_definition_name = "${target_name}.yaml" - package_definition_dir = "${target_gen_dir}/${target_name}" - description = "Debugging symbols for prebuilt binaries from Chromium." - use_absolute_root_path = true - - directories = [ "." ] - deps = [ ":${_chrome_build_ids_target}" ] -} - # A group for production archives to ensure nothing is testonly. group("web_engine_production_archives") { deps = [ ":cast_runner${_archive_suffix}", ":web_engine${_archive_suffix}", - ":web_runner${_archive_suffix}", ] } @@ -437,8 +387,6 @@ group("web_engine_archives_with_tests") { group("cipd") { testonly = true # Some archives are testonly. deps = [ - ":chrome${_archive_suffix}", - ":chrome_debug_symbols", ":web_engine_archives_with_tests", # Symbols are not uploaded for the following. diff --git a/build/fuchsia/common.py b/build/fuchsia/common.py deleted file mode 100644 index 2a0b1b3..0000000 --- a/build/fuchsia/common.py +++ /dev/null @@ -1,149 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import logging -import os -import platform -import shutil -import socket -import subprocess -import sys - -DIR_SOURCE_ROOT = os.path.abspath( - os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) -IMAGES_ROOT = os.path.join( - DIR_SOURCE_ROOT, 'third_party', 'fuchsia-sdk', 'images') -SDK_ROOT = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'fuchsia-sdk', 'sdk') - -# The number of seconds to wait when trying to attach to a target. -ATTACH_RETRY_SECONDS = 120 - - -def EnsurePathExists(path): - """Checks that the file |path| exists on the filesystem and returns the path - if it does, raising an exception otherwise.""" - - if not os.path.exists(path): - raise IOError('Missing file: ' + path) - - return path - -def GetHostOsFromPlatform(): - host_platform = sys.platform - if host_platform.startswith('linux'): - return 'linux' - elif host_platform.startswith('darwin'): - return 'mac' - raise Exception('Unsupported host platform: %s' % host_platform) - -def GetHostArchFromPlatform(): - host_arch = platform.machine() - # platform.machine() returns AMD64 on 64-bit Windows. - if host_arch in ['x86_64', 'AMD64']: - return 'x64' - elif host_arch in ['aarch64', 'arm64']: - return 'arm64' - raise Exception('Unsupported host architecture: %s' % host_arch) - -def GetHostToolPathFromPlatform(tool): - host_arch = platform.machine() - return os.path.join(SDK_ROOT, 'tools', GetHostArchFromPlatform(), tool) - - -# Remove when arm64 emulator is also included in Fuchsia SDK. -def GetEmuRootForPlatform(emulator): - if GetHostArchFromPlatform() == 'x64': - return GetHostToolPathFromPlatform('{0}_internal'.format(emulator)) - return os.path.join( - DIR_SOURCE_ROOT, 'third_party', '{0}-{1}-{2}'.format( - emulator, GetHostOsFromPlatform(), GetHostArchFromPlatform())) - - -def ConnectPortForwardingTask(target, local_port, remote_port = 0): - """Establishes a port forwarding SSH task to a localhost TCP endpoint hosted - at port |local_port|. Blocks until port forwarding is established. - - Returns the remote port number.""" - - forwarding_flags = ['-O', 'forward', # Send SSH mux control signal. - '-R', '%d:localhost:%d' % (remote_port, local_port), - '-v', # Get forwarded port info from stderr. - '-NT'] # Don't execute command; don't allocate terminal. - - if remote_port != 0: - # Forward to a known remote port. - task = target.RunCommand([], ssh_args=forwarding_flags) - if task.returncode != 0: - raise Exception('Could not establish a port forwarding connection.') - return - - task = target.RunCommandPiped([], - ssh_args=forwarding_flags, - stdout=subprocess.PIPE, - stderr=open('/dev/null')) - output = task.stdout.readlines() - task.wait() - if task.returncode != 0: - raise Exception('Got an error code when requesting port forwarding: %d' % - task.returncode) - - parsed_port = int(output[0].strip()) - logging.debug('Port forwarding established (local=%d, device=%d)' % - (local_port, parsed_port)) - return parsed_port - - -def GetAvailableTcpPort(): - """Finds a (probably) open port by opening and closing a listen socket.""" - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.bind(("", 0)) - port = sock.getsockname()[1] - sock.close() - return port - - -def RunGnSdkFunction(script, function): - script_path = os.path.join(SDK_ROOT, 'bin', script) - function_cmd = ['bash', '-c', '. %s; %s' % (script_path, function)] - return SubprocessCallWithTimeout(function_cmd) - - -def SubprocessCallWithTimeout(command, timeout_secs=None): - """Helper function for running a command. - - Args: - command: The command to run. - timeout_secs: Maximum amount of time allowed for the command to finish. - - Returns: - A tuple of (return code, stdout, stderr) of the command. Raises - an exception if the subprocess times out. - """ - - process = None - try: - process = subprocess.run(command, - capture_output=True, - timeout=timeout_secs, - encoding='utf-8') - except subprocess.TimeoutExpired as te: - raise TimeoutError(str(te)) - - return process.returncode, process.stdout, process.stderr - - -def IsRunningUnattended(): - """Returns true if running non-interactively. - - When running unattended, confirmation prompts and the like are suppressed. - """ - # Chromium tests only for the presence of the variable, so match that here. - return 'CHROME_HEADLESS' in os.environ - - -def MakeCleanDirectory(directory_name): - """If the directory exists, delete it and then remake it with no contents.""" - if os.path.exists(directory_name): - shutil.rmtree(directory_name) - os.mkdir(directory_name) diff --git a/build/fuchsia/common_args.py b/build/fuchsia/common_args.py deleted file mode 100644 index 3def52f..0000000 --- a/build/fuchsia/common_args.py +++ /dev/null @@ -1,189 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import argparse -import importlib -import logging -import multiprocessing -import os -import sys - -from common import GetHostArchFromPlatform - -BUILTIN_TARGET_NAMES = ['qemu', 'device', 'fvdl'] - - -def _AddTargetSpecificationArgs(arg_parser): - """Returns a parser that handles the target type used for the test run.""" - - device_args = arg_parser.add_argument_group( - 'target', - 'Arguments specifying the Fuchsia target type. To see a list of ' - 'arguments available for a specific target type, specify the desired ' - 'target to use and add the --help flag.') - device_args.add_argument('--target-cpu', - default=GetHostArchFromPlatform(), - help='GN target_cpu setting for the build. Defaults ' - 'to the same architecture as host cpu.') - device_args.add_argument('--device', - default=None, - choices=BUILTIN_TARGET_NAMES + ['custom'], - help='Choose to run on fvdl|qemu|device. ' - 'By default, Fuchsia will run on Fvdl on x64 ' - 'hosts and QEMU on arm64 hosts. Alternatively, ' - 'setting to custom will require specifying the ' - 'subclass of Target class used via the ' - '--custom-device-target flag.') - device_args.add_argument('-d', - action='store_const', - dest='device', - const='device', - help='Run on device instead of emulator.') - device_args.add_argument('--custom-device-target', - default=None, - help='Specify path to file that contains the ' - 'subclass of Target that will be used. Only ' - 'needed if device specific operations is ' - 'required.') - - -def _GetPathToBuiltinTarget(target_name): - return '%s_target' % target_name - - -def _LoadTargetClass(target_path): - try: - loaded_target = importlib.import_module(target_path) - except ImportError: - logging.error( - 'Cannot import from %s. Make sure that --custom-device-target ' - 'is pointing to a file containing a target ' - 'module.' % target_path) - raise - return loaded_target.GetTargetType() - - -def _GetDefaultEmulatedCpuCoreCount(): - # Revise the processor count on arm64, the trybots on arm64 are in - # dockers and cannot use all processors. - # For x64, fvdl always assumes hyperthreading is supported by intel - # processors, but the cpu_count returns the number regarding if the core - # is a physical one or a hyperthreading one, so the number should be - # divided by 2 to avoid creating more threads than the processor - # supports. - if GetHostArchFromPlatform() == 'x64': - return max(int(multiprocessing.cpu_count() / 2) - 1, 4) - return 4 - - -def AddCommonArgs(arg_parser): - """Adds command line arguments to |arg_parser| for options which are shared - across test and executable target types. - - Args: - arg_parser: an ArgumentParser object.""" - - common_args = arg_parser.add_argument_group('common', 'Common arguments') - common_args.add_argument('--logs-dir', help='Directory to write logs to.') - common_args.add_argument('--verbose', - '-v', - default=False, - action='store_true', - help='Enable debug-level logging.') - common_args.add_argument( - '--out-dir', - type=os.path.realpath, - help=('Path to the directory in which build files are located. ' - 'Defaults to current directory.')) - common_args.add_argument('--fuchsia-out-dir', - default=None, - help='Path to a Fuchsia build output directory. ' - 'Setting the GN arg ' - '"default_fuchsia_build_dir_for_installation" ' - 'will cause it to be passed here.') - - package_args = arg_parser.add_argument_group('package', 'Fuchsia Packages') - package_args.add_argument( - '--package', - action='append', - help='Paths of the packages to install, including ' - 'all dependencies.') - package_args.add_argument( - '--package-name', - help='Name of the package to execute, defined in ' + 'package metadata.') - - emu_args = arg_parser.add_argument_group('emu', 'General emulator arguments') - emu_args.add_argument('--cpu-cores', - type=int, - default=_GetDefaultEmulatedCpuCoreCount(), - help='Sets the number of CPU cores to provide.') - emu_args.add_argument('--ram-size-mb', - type=int, - default=8192, - help='Sets the emulated RAM size (MB).'), - emu_args.add_argument('--allow-no-kvm', - action='store_false', - dest='require_kvm', - default=True, - help='Do not require KVM acceleration for ' - 'emulators.') - - -# Register the arguments for all known target types and the optional custom -# target type (specified on the commandline). -def AddTargetSpecificArgs(arg_parser): - # Parse the minimal set of arguments to determine if custom targets need to - # be loaded so that their arguments can be registered. - target_spec_parser = argparse.ArgumentParser(add_help=False) - _AddTargetSpecificationArgs(target_spec_parser) - target_spec_args, _ = target_spec_parser.parse_known_args() - _AddTargetSpecificationArgs(arg_parser) - - for target in BUILTIN_TARGET_NAMES: - _LoadTargetClass(_GetPathToBuiltinTarget(target)).RegisterArgs(arg_parser) - if target_spec_args.custom_device_target: - _LoadTargetClass( - target_spec_args.custom_device_target).RegisterArgs(arg_parser) - - -def ConfigureLogging(args): - """Configures the logging level based on command line |args|.""" - - logging.basicConfig(level=(logging.DEBUG if args.verbose else logging.INFO), - format='%(asctime)s:%(levelname)s:%(name)s:%(message)s') - - # The test server spawner is too noisy with INFO level logging, so tweak - # its verbosity a bit by adjusting its logging level. - logging.getLogger('chrome_test_server_spawner').setLevel( - logging.DEBUG if args.verbose else logging.WARN) - - # Verbose SCP output can be useful at times but oftentimes is just too noisy. - # Only enable it if -vv is passed. - logging.getLogger('ssh').setLevel( - logging.DEBUG if args.verbose else logging.WARN) - - -def InitializeTargetArgs(): - """Set args for all targets to default values. This is used by test scripts - that have their own parser but still uses the target classes.""" - parser = argparse.ArgumentParser() - AddCommonArgs(parser) - AddTargetSpecificArgs(parser) - return parser.parse_args([]) - - -def GetDeploymentTargetForArgs(args): - """Constructs a deployment target object using command line arguments. - If needed, an additional_args dict can be used to supplement the - command line arguments.""" - - if args.device == 'custom': - return _LoadTargetClass(args.custom_device_target).CreateFromArgs(args) - - if args.device: - device = args.device - else: - device = 'fvdl' if args.target_cpu == 'x64' else 'qemu' - - return _LoadTargetClass(_GetPathToBuiltinTarget(device)).CreateFromArgs(args) diff --git a/build/fuchsia/deploy_to_pkg_repo.py b/build/fuchsia/deploy_to_pkg_repo.py deleted file mode 100755 index a1945a6..0000000 --- a/build/fuchsia/deploy_to_pkg_repo.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env vpython3 -# -# Copyright 2019 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Deploys Fuchsia packages to a package repository in a Fuchsia -build output directory.""" - -import pkg_repo -import argparse -import os -import sys - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('--package', - action='append', - required=True, - help='Paths to packages to install.') - parser.add_argument('--fuchsia-out-dir', - required=True, - help='Path to a Fuchsia build output directory. ' - 'Setting the GN arg ' - '"default_fuchsia_build_dir_for_installation" ' - 'will cause it to be passed here.') - args, _ = parser.parse_known_args() - assert args.package - - fuchsia_out_dir = os.path.expanduser(args.fuchsia_out_dir) - assert os.path.exists(fuchsia_out_dir), \ - '{} not found, check that --fuchsia-out-dir points to a valid out dir.' \ - ' eg. /path/to/fuchsia/out/default'.format(fuchsia_out_dir) - - repo = pkg_repo.ExternalPkgRepo(fuchsia_out_dir, - os.path.join(fuchsia_out_dir, '.build-id')) - print('Installing packages and symbols in package repo %s...' % - repo.GetPath()) - - for package in args.package: - repo.PublishPackage(package) - - print('Installation success.') - - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/build/fuchsia/device_target.py b/build/fuchsia/device_target.py deleted file mode 100644 index 8f2c48f..0000000 --- a/build/fuchsia/device_target.py +++ /dev/null @@ -1,404 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Implements commands for running and interacting with Fuchsia on devices.""" - -import errno -import itertools -import logging -import os -import pkg_repo -import re -import subprocess -import sys -import target -import time - -import legacy_ermine_ctl -import ffx_session - -from common import ATTACH_RETRY_SECONDS, EnsurePathExists, \ - GetHostToolPathFromPlatform, RunGnSdkFunction, SDK_ROOT - -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), - 'test'))) -from compatible_utils import get_sdk_hash, pave, find_image_in_sdk - -# The maximum times to attempt mDNS resolution when connecting to a freshly -# booted Fuchsia instance before aborting. -BOOT_DISCOVERY_ATTEMPTS = 30 - -# Number of failed connection attempts before redirecting system logs to stdout. -CONNECT_RETRY_COUNT_BEFORE_LOGGING = 10 - -# Number of seconds between each device discovery. -BOOT_DISCOVERY_DELAY_SECS = 4 - -# Time between a reboot command is issued and when connection attempts from the -# host begin. -_REBOOT_SLEEP_PERIOD = 20 - -# File on device that indicates Fuchsia version. -_ON_DEVICE_VERSION_FILE = '/config/build-info/version' - -# File on device that indicates Fuchsia product. -_ON_DEVICE_PRODUCT_FILE = '/config/build-info/product' - - -def GetTargetType(): - return DeviceTarget - - -class ProvisionDeviceException(Exception): - def __init__(self, message: str): - super(ProvisionDeviceException, self).__init__(message) - - -class DeviceTarget(target.Target): - """Prepares a device to be used as a deployment target. Depending on the - command line parameters, it automatically handling a number of preparatory - steps relating to address resolution. - - If |_node_name| is unset: - If there is one running device, use it for deployment and execution. - - If there are more than one running devices, then abort and instruct the - user to re-run the command with |_node_name| - - If |_node_name| is set: - If there is a running device with a matching nodename, then it is used - for deployment and execution. - - If |_host| is set: - Deploy to a device at the host IP address as-is.""" - - def __init__(self, out_dir, target_cpu, host, node_name, port, ssh_config, - fuchsia_out_dir, os_check, logs_dir, system_image_dir): - """out_dir: The directory which will contain the files that are - generated to support the deployment. - target_cpu: The CPU architecture of the deployment target. Can be - "x64" or "arm64". - host: The address of the deployment target device. - node_name: The node name of the deployment target device. - port: The port of the SSH service on the deployment target device. - ssh_config: The path to SSH configuration data. - fuchsia_out_dir: The path to a Fuchsia build output directory, for - deployments to devices paved with local Fuchsia builds. - os_check: If 'check', the target's SDK version must match. - If 'update', the target will be repaved if the SDK versions - mismatch. - If 'ignore', the target's SDK version is ignored. - system_image_dir: The directory which contains the files used to pave the - device.""" - - super(DeviceTarget, self).__init__(out_dir, target_cpu, logs_dir) - - self._host = host - self._port = port - self._fuchsia_out_dir = None - self._node_name = node_name or os.environ.get('FUCHSIA_NODENAME') - self._system_image_dir = system_image_dir - self._os_check = os_check - self._pkg_repo = None - self._target_context = None - self._ffx_target = None - self._ermine_ctl = legacy_ermine_ctl.LegacyErmineCtl(self) - - if self._os_check != 'ignore': - if not self._system_image_dir: - raise Exception( - "Image directory must be provided if a repave is needed.") - # Determine if system_image_dir exists and find dynamically if not. - if not os.path.exists(system_image_dir): - logging.warning('System image dir does not exist. Assuming it\'s a ' - 'product-bundle and dynamically searching for it') - sdk_root_parent = os.path.split(SDK_ROOT)[0] - new_dir = find_image_in_sdk(system_image_dir, - product_bundle=True, - sdk_root=sdk_root_parent) - if not new_dir: - raise FileNotFoundError( - errno.ENOENT, - 'Could not find system image directory in SDK path ' + - sdk_root_parent, system_image_dir) - self._system_image_dir = new_dir - - if self._host and self._node_name: - raise Exception('Only one of "--host" or "--name" can be specified.') - - if fuchsia_out_dir: - if ssh_config: - raise Exception('Only one of "--fuchsia-out-dir" or "--ssh_config" can ' - 'be specified.') - - self._fuchsia_out_dir = os.path.expanduser(fuchsia_out_dir) - # Use SSH keys from the Fuchsia output directory. - self._ssh_config_path = os.path.join(self._fuchsia_out_dir, 'ssh-keys', - 'ssh_config') - self._os_check = 'ignore' - - elif ssh_config: - # Use the SSH config provided via the commandline. - self._ssh_config_path = os.path.expanduser(ssh_config) - - else: - return_code, ssh_config_raw, _ = RunGnSdkFunction( - 'fuchsia-common.sh', 'get-fuchsia-sshconfig-file') - if return_code != 0: - raise Exception('Could not get Fuchsia ssh config file.') - self._ssh_config_path = os.path.expanduser(ssh_config_raw.strip()) - - @staticmethod - def CreateFromArgs(args): - return DeviceTarget(args.out_dir, args.target_cpu, args.host, - args.node_name, args.port, args.ssh_config, - args.fuchsia_out_dir, args.os_check, args.logs_dir, - args.system_image_dir) - - @staticmethod - def RegisterArgs(arg_parser): - device_args = arg_parser.add_argument_group( - 'device', 'External device deployment arguments') - device_args.add_argument('--host', - help='The IP of the target device. Optional.') - device_args.add_argument('--node-name', - help='The node-name of the device to boot or ' - 'deploy to. Optional, will use the first ' - 'discovered device if omitted.') - device_args.add_argument('--port', - '-p', - type=int, - default=None, - help='The port of the SSH service running on the ' - 'device. Optional.') - device_args.add_argument('--ssh-config', - '-F', - help='The path to the SSH configuration used for ' - 'connecting to the target device.') - device_args.add_argument( - '--os-check', - choices=['check', 'update', 'ignore'], - default='ignore', - help="Sets the OS version enforcement policy. If 'check', then the " - "deployment process will halt if the target\'s version doesn\'t " - "match. If 'update', then the target device will automatically " - "be repaved. If 'ignore', then the OS version won\'t be checked.") - device_args.add_argument('--system-image-dir', - help="Specify the directory that contains the " - "Fuchsia image used to pave the device. Only " - "needs to be specified if 'os_check' is not " - "'ignore'.") - - def _Discover(self): - """Queries mDNS for the IP address of a booted Fuchsia instance whose name - matches |_node_name| on the local area network. If |_node_name| is not - specified and there is only one device on the network, |_node_name| is set - to that device's name. - - Returns: - True if exactly one device is found, after setting |_host| and |_port| to - its SSH address. False if no devices are found. - - Raises: - Exception: If more than one device is found. - """ - - if self._node_name: - target = ffx_session.FfxTarget.from_node_name(self._ffx_runner, - self._node_name) - else: - # Get the node name of a single attached target. - try: - # Get at most the first 2 valid targets - targets = list( - itertools.islice(self._ffx_runner.list_active_targets(), 2)) - except subprocess.CalledProcessError: - # A failure to list targets could mean that the device is in zedboot. - # Return false in this case so that Start() will attempt to provision. - return False - if not targets: - return False - - if len(targets) > 1: - raise Exception('More than one device was discovered on the network. ' - 'Use --node-name to specify the device to use.' - 'List of devices: {}'.format(targets)) - target = targets[0] - - # Get the ssh address of the target. - ssh_address = target.get_ssh_address() - if ssh_address: - self._host, self._port = ssh_address - else: - return False - - logging.info('Found device "%s" at %s.' % - (self._node_name if self._node_name else '', - ffx_session.format_host_port(self._host, self._port))) - - # TODO(crbug.com/1307220): Remove this once the telemetry scripts can handle - # specifying the port for a device that is not listening on localhost. - if self._port == 22: - self._port = None - - return True - - def _Login(self): - """Attempts to log into device, if possible. - - This method should not be called from anything other than Start, - though calling it multiple times should have no adverse effect. - """ - if self._ermine_ctl.exists: - self._ermine_ctl.take_to_shell() - - def Start(self): - if self._host: - self._ConnectToTarget() - self._Login() - elif self._Discover(): - self._ConnectToTarget() - if self._os_check == 'ignore': - self._Login() - return - - # If accessible, check version. - new_version = get_sdk_hash(self._system_image_dir) - installed_version = self._GetInstalledSdkVersion() - if new_version == installed_version: - logging.info('Fuchsia version installed on device matches Chromium ' - 'SDK version. Skipping pave.') - else: - if self._os_check == 'check': - raise Exception('Image and Fuchsia version installed on device ' - 'does not match. Abort.') - logging.info('Putting device in recovery mode') - self.RunCommandPiped(['dm', 'reboot-recovery'], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - self._ProvisionDevice() - self._Login() - else: - if self._node_name: - logging.info('Could not detect device %s.' % self._node_name) - if self._os_check == 'update': - logging.info('Assuming it is in zedboot. Continuing with paving...') - self._ProvisionDevice() - self._Login() - return - raise Exception('Could not find device. If the device is connected ' - 'to the host remotely, make sure that --host flag ' - 'is set and that remote serving is set up.') - - def GetFfxTarget(self): - assert self._ffx_target - return self._ffx_target - - def _GetInstalledSdkVersion(self): - """Retrieves installed OS version from device. - - Returns: - Tuple of strings, containing (product, version number) - """ - return (self.GetFileAsString(_ON_DEVICE_PRODUCT_FILE).strip(), - self.GetFileAsString(_ON_DEVICE_VERSION_FILE).strip()) - - def GetPkgRepo(self): - if not self._pkg_repo: - if self._fuchsia_out_dir: - # Deploy to an already-booted device running a local Fuchsia build. - self._pkg_repo = pkg_repo.ExternalPkgRepo( - os.path.join(self._fuchsia_out_dir, 'amber-files'), - os.path.join(self._fuchsia_out_dir, '.build-id')) - else: - # Create an ephemeral package repository, then start both "pm serve" as - # well as the bootserver. - self._pkg_repo = pkg_repo.ManagedPkgRepo(self) - - return self._pkg_repo - - def _ParseNodename(self, output): - # Parse the nodename from bootserver stdout. - m = re.search(r'.*Proceeding with nodename (?P.*)$', output, - re.MULTILINE) - if not m: - raise Exception('Couldn\'t parse nodename from bootserver output.') - self._node_name = m.groupdict()['nodename'] - logging.info('Booted device "%s".' % self._node_name) - - # Repeatedly search for a device for |BOOT_DISCOVERY_ATTEMPT| - # number of attempts. If a device isn't found, wait - # |BOOT_DISCOVERY_DELAY_SECS| before searching again. - logging.info('Waiting for device to join network.') - for _ in range(BOOT_DISCOVERY_ATTEMPTS): - if self._Discover(): - break - time.sleep(BOOT_DISCOVERY_DELAY_SECS) - - if not self._host: - raise Exception('Device %s couldn\'t be discovered via mDNS.' % - self._node_name) - - self._ConnectToTarget() - - def _GetEndpoint(self): - return (self._host, self._port) - - def _ConnectToTarget(self): - logging.info('Connecting to Fuchsia using ffx.') - # Prefer connecting via node name over address:port. - if self._node_name: - # Assume that ffx already knows about the target, so there's no need to - # add/remove it. - self._ffx_target = ffx_session.FfxTarget.from_node_name( - self._ffx_runner, self._node_name) - else: - # The target may not be known by ffx. Probe to see if it has already been - # added. - ffx_target = ffx_session.FfxTarget.from_address(self._ffx_runner, - self._host, self._port) - if ffx_target.get_ssh_address(): - # If we could lookup the address, the target must be reachable. Do not - # open a new scoped_target_context, as that will `ffx target add` now - # and then `ffx target remove` later, which will break subsequent - # interactions with a persistent emulator. - self._ffx_target = ffx_target - else: - # The target is not known, so take on responsibility of adding and - # removing it. - self._target_context = self._ffx_runner.scoped_target_context( - self._host, self._port) - self._ffx_target = self._target_context.__enter__() - self._ffx_target.wait(ATTACH_RETRY_SECONDS) - return super(DeviceTarget, self)._ConnectToTarget() - - def _DisconnectFromTarget(self): - self._ffx_target = None - if self._target_context: - self._target_context.__exit__(None, None, None) - self._target_context = None - super(DeviceTarget, self)._DisconnectFromTarget() - - def _GetSshConfigPath(self): - return self._ssh_config_path - - def _ProvisionDevice(self): - self._ParseNodename(pave(self._system_image_dir, self._node_name).stderr) - - def Restart(self): - """Restart the device.""" - - self.RunCommandPiped('dm reboot') - time.sleep(_REBOOT_SLEEP_PERIOD) - self.Start() - - def Stop(self): - try: - self._DisconnectFromTarget() - # End multiplexed ssh connection, ensure that ssh logging stops before - # tests/scripts return. - if self.IsStarted(): - self.RunCommand(['-O', 'exit']) - finally: - super(DeviceTarget, self).Stop() diff --git a/build/fuchsia/device_target_test.py b/build/fuchsia/device_target_test.py deleted file mode 100755 index 04c4d0d..0000000 --- a/build/fuchsia/device_target_test.py +++ /dev/null @@ -1,272 +0,0 @@ -#!/usr/bin/env vpython3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Tests scenarios with number of devices and invalid devices""" -import common -import os -import subprocess -import time -import unittest -import unittest.mock as mock - -from argparse import Namespace -from device_target import DeviceTarget -from legacy_ermine_ctl import LegacyErmineCtl -from ffx_session import FfxRunner, FfxTarget -from target import Target, FuchsiaTargetException - - -@mock.patch.object(FfxRunner, 'daemon_stop') -class TestDiscoverDeviceTarget(unittest.TestCase): - def setUp(self): - self.args = Namespace(out_dir='out/fuchsia', - target_cpu='x64', - host=None, - node_name=None, - port=None, - ssh_config='mock_config', - fuchsia_out_dir=None, - os_check='ignore', - logs_dir=None, - system_image_dir=None) - - def testUnspecifiedNodeNameOneDeviceReturnNoneCheckNameAndAddress( - self, mock_daemon_stop): - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object(FfxRunner, 'list_targets') as mock_list_targets, \ - mock.patch.object( - FfxTarget, 'get_ssh_address') as mock_get_ssh_address, \ - mock.patch.object( - DeviceTarget, '_ConnectToTarget') as mock_connecttotarget, \ - mock.patch.object( - DeviceTarget, '_Login') as mock_login: - mock_list_targets.return_value = [{ - "nodename": "device_name", - "rcs_state": "Y", - "serial": "", - "target_type": "terminal.qemu-x64", - "target_state": "Product", - }] - mock_get_ssh_address.return_value = ('address', 12345) - mock_connecttotarget.return_value = True - self.assertIsNone(device_target_instance.Start()) - self.assertEqual(device_target_instance._host, 'address') - self.assertEqual(device_target_instance._port, 12345) - mock_daemon_stop.assert_called_once() - - def testUnspecifiedNodeNameOneUnknownDeviceReturnNoneCheckAddressAndPort( - self, mock_daemon_stop): - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object(FfxRunner, 'list_targets') as mock_list_targets, \ - mock.patch.object( - FfxTarget, 'get_ssh_address') as mock_get_ssh_address, \ - mock.patch.object( - DeviceTarget, '_ConnectToTarget') as mock_connecttotarget, \ - mock.patch.object( - DeviceTarget, '_Login') as mock_login: - mock_list_targets.return_value = [{ - "nodename": "", - "rcs_state": "Y", - "serial": "", - "target_type": "terminal.qemu-x64", - "target_state": "Product", - "addresses": ["address"] - }] - mock_get_ssh_address.return_value = ('address', 12345) - mock_connecttotarget.return_value = True - self.assertIsNone(device_target_instance.Start()) - self.assertEqual(device_target_instance._host, 'address') - self.assertEqual(device_target_instance._port, 12345) - mock_login.assert_called_once() - mock_daemon_stop.assert_called_once() - - def testUnspecifiedNodeNameTwoDevicesRaiseExceptionAmbiguousTarget( - self, mock_daemon_stop): - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object(FfxRunner, 'list_targets') as mock_list_targets, \ - mock.patch.object( - FfxTarget, 'get_ssh_address') as mock_get_ssh_address, \ - self.assertRaisesRegex(Exception, \ - 'More than one device was discovered'): - mock_get_ssh_address.return_value = ('address', 12345) - mock_list_targets.return_value = [{ - "nodename": "device_name1", - "rcs_state": "Y", - "serial": "", - "target_type": "terminal.qemu-x64", - "target_state": "Product", - "addresses": ["address1"] - }, { - "nodename": "device_name2", - "rcs_state": "Y", - "serial": "", - "target_type": "terminal.qemu-x64", - "target_state": "Product", - "addresses": ["address2"] - }] - device_target_instance.Start() - self.assertIsNone(device_target_instance._node_name) - self.assertIsNone(device_target_instance._host) - mock_daemon_stop.assert_called_once() - - def testNodeNameDefinedDeviceFoundReturnNoneCheckNameAndHost( - self, mock_daemon_stop): - self.args.node_name = 'device_name' - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object( - FfxTarget, 'get_ssh_address') as mock_get_ssh_address, \ - mock.patch.object( - DeviceTarget, '_ConnectToTarget') as mock_connecttotarget, \ - mock.patch.object( - DeviceTarget, '_Login') as mock_login: - mock_get_ssh_address.return_value = ('address', 12345) - mock_connecttotarget.return_value = True - self.assertIsNone(device_target_instance.Start()) - self.assertEqual(device_target_instance._node_name, 'device_name') - self.assertEqual(device_target_instance._host, 'address') - self.assertEqual(device_target_instance._port, 12345) - mock_login.assert_called_once() - mock_daemon_stop.assert_called_once() - - def testNodeNameDefinedDeviceNotFoundRaiseExceptionCouldNotFind( - self, mock_daemon_stop): - self.args.node_name = 'wrong_device_name' - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object( - FfxTarget, 'get_ssh_address') as mock_get_ssh_address, \ - self.assertRaisesRegex(Exception, 'Could not find device.'): - mock_get_ssh_address.return_value = None - device_target_instance.Start() - self.assertIsNone(device_target_instance._node_name) - self.assertIsNone(device_target_instance._host) - mock_daemon_stop.assert_called_once() - - def testNoDevicesFoundRaiseExceptionCouldNotFind(self, mock_daemon_stop): - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object(FfxRunner, 'list_targets') as mock_list_targets, \ - self.assertRaisesRegex(Exception, 'Could not find device.'): - mock_list_targets.return_value = [] - device_target_instance.Start() - self.assertIsNone(device_target_instance._node_name) - self.assertIsNone(device_target_instance._host) - mock_daemon_stop.assert_called_once() - - @mock.patch('os.path.exists', return_value=True) - def testNoProvisionDeviceIfVersionsMatch(self, unused_mock, mock_daemon_stop): - self.args.os_check = 'update' - self.args.system_image_dir = 'mockdir' - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object(DeviceTarget, '_Discover') as mock_discover, \ - mock.patch.object(DeviceTarget, '_ConnectToTarget') as mock_connect, \ - mock.patch('device_target.get_sdk_hash') as mock_hash, \ - mock.patch.object( - DeviceTarget, '_GetInstalledSdkVersion') as mock_version, \ - mock.patch.object( - DeviceTarget, '_ProvisionDevice') as mock_provision, \ - mock.patch.object( - DeviceTarget, '_Login') as mock_login: - mock_discover.return_value = True - mock_hash.return_value = '1.0' - mock_version.return_value = '1.0' - device_target_instance.Start() - self.assertEqual(mock_provision.call_count, 0) - mock_login.assert_called_once() - mock_daemon_stop.assert_called_once() - - @mock.patch('os.path.exists', return_value=True) - def testRaiseExceptionIfCheckVersionsNoMatch(self, unused_mock, - mock_daemon_stop): - self.args.os_check = 'check' - self.args.system_image_dir = 'mockdir' - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object(DeviceTarget, '_Discover') as mock_discover, \ - mock.patch.object(DeviceTarget, '_ConnectToTarget') as mock_ready, \ - mock.patch('device_target.get_sdk_hash') as mock_hash, \ - mock.patch.object( - DeviceTarget, '_GetInstalledSdkVersion') as mock_version, \ - mock.patch.object( - DeviceTarget, '_ProvisionDevice') as mock_provision, \ - self.assertRaisesRegex(Exception, 'Image and Fuchsia version'): - mock_discover.return_value = True - mock_hash.return_value = '2.0' - mock_version.return_value = '1.0' - device_target_instance.Start() - mock_daemon_stop.assert_called_once() - - def testLoginCallsOnlyIfErmineExists(self, mock_daemon_stop): - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object( - LegacyErmineCtl, 'exists', - new_callable=mock.PropertyMock) as mock_exists, \ - mock.patch.object(LegacyErmineCtl, 'take_to_shell') as mock_shell: - mock_exists.return_value = True - - device_target_instance._Login() - - mock_exists.assert_called_once() - mock_shell.assert_called_once() - - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object( - LegacyErmineCtl, 'exists', - new_callable=mock.PropertyMock) as mock_exists, \ - mock.patch.object(LegacyErmineCtl, 'take_to_shell') as mock_shell: - mock_exists.return_value = False - - device_target_instance._Login() - - mock_exists.assert_called_once() - self.assertEqual(mock_shell.call_count, 0) - - @mock.patch('os.path.exists', return_value=True) - def testProvisionIfOneNonDetectableDevice(self, unused_mock, - mock_daemon_stop): - self.args.os_check = 'update' - self.args.node_name = 'mocknode' - self.args.system_image_dir = 'mockdir' - with DeviceTarget.CreateFromArgs(self.args) as device_target_instance, \ - mock.patch.object( - FfxTarget, 'get_ssh_address') as mock_get_ssh_address, \ - mock.patch.object(DeviceTarget, - '_ProvisionDevice') as mock_provision, \ - mock.patch.object(DeviceTarget, '_Login') as mock_bypass: - mock_get_ssh_address.return_value = None - device_target_instance.Start() - self.assertEqual(mock_provision.call_count, 1) - mock_daemon_stop.assert_called_once() - - def testRaiseExceptionIfNoTargetDir(self, mock_daemon_stop): - self.args.os_check = 'update' - self.args.system_image_dir = '' - with self.assertRaises(Exception): - DeviceTarget.CreateFromArgs(self.args) - - def testSearchSDKIfImageDirNotFound(self, mock_daemon_stop): - self.args.os_check = 'update' - self.args.system_image_dir = 'product-bundle-instead-of-image' - with mock.patch('os.path.exists', return_value=False), \ - mock.patch('device_target.find_image_in_sdk', - return_value='some/path/to/image') as mock_find, \ - mock.patch('device_target.SDK_ROOT', 'some/path/to/sdk'), \ - self.assertLogs(): - target = DeviceTarget.CreateFromArgs(self.args) - mock_find.assert_called_once_with('product-bundle-instead-of-image', - product_bundle=True, - sdk_root='some/path/to') - self.assertEqual(target._system_image_dir, 'some/path/to/image') - - def testSearchSDKThrowsExceptionIfNoPathReturned(self, mock_daemon_stop): - self.args.os_check = 'update' - self.args.system_image_dir = 'product-bundle-instead-of-image' - with mock.patch('os.path.exists', return_value=False), \ - mock.patch('device_target.find_image_in_sdk', - return_value=None), \ - mock.patch('device_target.SDK_ROOT', 'some/path/to/sdk'), \ - self.assertLogs(), \ - self.assertRaises(FileNotFoundError): - target = DeviceTarget.CreateFromArgs(self.args) - - -if __name__ == '__main__': - unittest.main() diff --git a/build/fuchsia/emu_target.py b/build/fuchsia/emu_target.py deleted file mode 100644 index d430cdf..0000000 --- a/build/fuchsia/emu_target.py +++ /dev/null @@ -1,190 +0,0 @@ -# Copyright 2019 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Implements commands for running/interacting with Fuchsia on an emulator.""" - -import json -import logging -import os -import subprocess -import sys -import tempfile - -import boot_data -import common -import ffx_session -import pkg_repo -import target - -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), - 'test'))) -from compatible_utils import find_image_in_sdk, running_unattended - - -class EmuTarget(target.Target): - LOCAL_ADDRESS = 'localhost' - - def __init__(self, out_dir, target_cpu, logs_dir, image): - """out_dir: The directory which will contain the files that are - generated to support the emulator deployment. - target_cpu: The emulated target CPU architecture. - Can be 'x64' or 'arm64'.""" - - super(EmuTarget, self).__init__(out_dir, target_cpu, logs_dir) - self._emu_process = None - self._pkg_repo = None - self._target_context = None - self._ffx_target = None - - self._pb_path = self._GetPbPath(image) - metadata = self._GetEmuMetadata() - self._disk_image = metadata['disk_images'][0] - self._kernel = metadata['kernel'] - self._ramdisk = metadata['initial_ramdisk'] - - def _GetPbPath(self, image): - if not image: - image = 'terminal.qemu-%s' % self._target_cpu - image_path = find_image_in_sdk(image, - product_bundle=True, - sdk_root=os.path.dirname(common.IMAGES_ROOT)) - if not image_path: - raise FileNotFoundError(f'Product bundle {image} is not downloaded. Add ' - 'the image and run "gclient sync" again.') - return image_path - - def _GetEmuMetadata(self): - with open(os.path.join(self._pb_path, 'product_bundle.json')) as f: - return json.load(f)['data']['manifests']['emu'] - - def __enter__(self): - return self - - def _BuildCommand(self): - """Build the command that will be run to start Fuchsia in the emulator.""" - pass - - def _SetEnv(self): - return os.environ.copy() - - def Start(self): - if running_unattended() and not self._HasNetworking(): - # Bots may accumulate stale manually-added targets with the same address - # as the one to be added here. Preemtively remove any unknown targets at - # this address before starting the emulator and adding it as a target. - self._ffx_runner.remove_stale_targets('127.0.0.1') - emu_command = self._BuildCommand() - logging.debug(' '.join(emu_command)) - - # Zircon sends debug logs to serial port (see kernel.serial=legacy flag - # above). Serial port is redirected to a file through emulator stdout. - # If runner_logs are not enabled, we output the kernel serial log - # to a temporary file, and print that out if we are unable to connect to - # the emulator guest, to make it easier to diagnose connectivity issues. - temporary_log_file = None - if self._log_manager.IsLoggingEnabled(): - stdout = self._log_manager.Open('serial_log') - else: - temporary_log_file = tempfile.NamedTemporaryFile('w') - stdout = temporary_log_file - - self.LogProcessStatistics('proc_stat_start_log') - self.LogSystemStatistics('system_statistics_start_log') - - self._emu_process = subprocess.Popen(emu_command, - stdin=open(os.devnull), - stdout=stdout, - stderr=subprocess.STDOUT, - env=self._SetEnv()) - try: - self._ConnectToTarget() - self.LogProcessStatistics('proc_stat_ready_log') - except target.FuchsiaTargetException: - self._DisconnectFromTarget() - if temporary_log_file: - logging.info('Kernel logs:\n' + - open(temporary_log_file.name, 'r').read()) - raise - - def GetFfxTarget(self): - assert self._ffx_target - return self._ffx_target - - def Stop(self): - try: - self._DisconnectFromTarget() - self._Shutdown() - finally: - self.LogProcessStatistics('proc_stat_end_log') - self.LogSystemStatistics('system_statistics_end_log') - super(EmuTarget, self).Stop() - - def GetPkgRepo(self): - if not self._pkg_repo: - self._pkg_repo = pkg_repo.ManagedPkgRepo(self) - - return self._pkg_repo - - def _Shutdown(self): - """Shuts down the emulator.""" - raise NotImplementedError() - - def _HasNetworking(self): - """Returns `True` if the emulator will be started with networking (e.g., - TUN/TAP emulated networking). - """ - raise NotImplementedError() - - def _IsEmuStillRunning(self): - """Returns `True` if the emulator is still running.""" - raise NotImplementedError() - - def _GetEndpoint(self): - raise NotImplementedError() - - def _ConnectToTarget(self): - with_network = self._HasNetworking() - if not with_network: - # The target was started without networking, so tell ffx how to find it. - logging.info('Connecting to Fuchsia using ffx.') - _, host_ssh_port = self._GetEndpoint() - self._target_context = self._ffx_runner.scoped_target_context( - '127.0.0.1', host_ssh_port) - self._ffx_target = self._target_context.__enter__() - self._ffx_target.wait(common.ATTACH_RETRY_SECONDS) - super(EmuTarget, self)._ConnectToTarget() - if with_network: - # Interact with the target via its address:port, which ffx should now know - # about. - self._ffx_target = ffx_session.FfxTarget.from_address( - self._ffx_runner, *self._GetEndpoint()) - - def _DisconnectFromTarget(self): - self._ffx_target = None - if self._target_context: - self._target_context.__exit__(None, None, None) - self._target_context = None - super(EmuTarget, self)._DisconnectFromTarget() - - def _GetSshConfigPath(self): - return boot_data.GetSSHConfigPath() - - def LogSystemStatistics(self, log_file_name): - self._LaunchSubprocessWithLogs(['top', '-b', '-n', '1'], log_file_name) - self._LaunchSubprocessWithLogs(['ps', '-ax'], log_file_name) - - def LogProcessStatistics(self, log_file_name): - self._LaunchSubprocessWithLogs(['cat', '/proc/stat'], log_file_name) - - def _LaunchSubprocessWithLogs(self, command, log_file_name): - """Launch a subprocess and redirect stdout and stderr to log_file_name. - Command will not be run if logging directory is not set.""" - - if not self._log_manager.IsLoggingEnabled(): - return - log = self._log_manager.Open(log_file_name) - subprocess.call(command, - stdin=open(os.devnull), - stdout=log, - stderr=subprocess.STDOUT) diff --git a/build/fuchsia/exit_on_sig_term.py b/build/fuchsia/exit_on_sig_term.py deleted file mode 100644 index cea81f8..0000000 --- a/build/fuchsia/exit_on_sig_term.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2022 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import signal -import sys - - -# TODO(grt): Derive from contextlib.AbstractContextManager when p3 is supported. -class ExitOnSigTerm(): - """A context manager that calls sys.exit(0) upon receipt of SIGTERM. This - results in a SystemExit exception being raised, which causes any finally - clauses to be run and other contexts to be cleaned up. - """ - - def __init__(self): - self._previous_handler = None - - def __enter__(self): - self._previous_handler = signal.signal( - signal.SIGTERM, lambda sig_num, frame: sys.exit(0)) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - signal.signal(signal.SIGTERM, self._previous_handler) - return False diff --git a/build/fuchsia/ffx_session.py b/build/fuchsia/ffx_session.py deleted file mode 100755 index 0e54c15..0000000 --- a/build/fuchsia/ffx_session.py +++ /dev/null @@ -1,619 +0,0 @@ -#!/usr/bin/env vpython3 -# Copyright 2022 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""A helper tool for running Fuchsia's `ffx`. -""" - -# Enable use of the print() built-in function. - -import argparse -import contextlib -import errno -import json -import logging -import os -import re -import shutil -import subprocess -import sys -import tempfile -import time - -import common -import log_manager - -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), - 'test'))) -from compatible_utils import parse_host_port - -RUN_SUMMARY_SCHEMA = \ - 'https://fuchsia.dev/schema/ffx_test/run_summary-8d1dd964.json' - - -def get_ffx_path(): - """Returns the full path to `ffx`.""" - return os.path.join(common.SDK_ROOT, 'tools', - common.GetHostArchFromPlatform(), 'ffx') - - -def format_host_port(host, port): - """Formats a host name or IP address and port number into a host:port string. - """ - # Wrap `host` in brackets if it looks like an IPv6 address - return ('[%s]:%d' if ':' in host else '%s:%d') % (host, port) - - -class FfxRunner(): - """A helper to run `ffx` commands.""" - - def __init__(self, log_manager): - self._ffx = get_ffx_path() - self._log_manager = log_manager - - def _get_daemon_status(self): - """Determines daemon status via `ffx daemon socket`. - - Returns: - dict of status of the socket. Status will have a key Running or - NotRunning to indicate if the daemon is running. - """ - status = json.loads( - self.run_ffx(['--machine', 'json', 'daemon', 'socket'], - check=True, - suppress_repair=True)) - if status.get('pid') and status.get('pid', {}).get('status', {}): - return status['pid']['status'] - return {'NotRunning': True} - - def _is_daemon_running(self): - return 'Running' in self._get_daemon_status() - - def _wait_for_daemon(self, start=True, timeout_seconds=100): - """Waits for daemon to reach desired state in a polling loop. - - Sleeps for 5s between polls. - - Args: - start: bool. Indicates to wait for daemon to start up. If False, - indicates waiting for daemon to die. - timeout_seconds: int. Number of seconds to wait for the daemon to reach - the desired status. - Raises: - TimeoutError: if the daemon does not reach the desired state in time. - """ - wanted_status = 'start' if start else 'stop' - sleep_period_seconds = 5 - attempts = int(timeout_seconds / sleep_period_seconds) - for i in range(attempts): - if self._is_daemon_running() == start: - return - if i != attempts: - logging.info('Waiting for daemon to %s...', wanted_status) - time.sleep(sleep_period_seconds) - - raise TimeoutError(f'Daemon did not {wanted_status} in time.') - - def _run_repair_command(self, output): - """Scans `output` for a self-repair command to run and, if found, runs it. - - If logging is enabled, `ffx` is asked to emit its own logs to the log - directory. - - Returns: - True if a repair command was found and ran successfully. False otherwise. - """ - # Check for a string along the lines of: - # "Run `ffx doctor --restart-daemon` for further diagnostics." - match = re.search('`ffx ([^`]+)`', output) - if not match or len(match.groups()) != 1: - return False # No repair command found. - args = match.groups()[0].split() - # Tell ffx to include the configuration file without prompting in case - # logging is enabled. - with self.scoped_config('doctor.record_config', 'true'): - # If the repair command is `ffx doctor` and logging is enabled, add the - # options to emit ffx logs to the logging directory. - if len(args) and args[0] == 'doctor' and \ - self._log_manager.IsLoggingEnabled(): - args.extend( - ('--record', '--output-dir', self._log_manager.GetLogDirectory())) - try: - self.run_ffx(args, suppress_repair=True) - self._wait_for_daemon(start=True) - except subprocess.CalledProcessError as cpe: - return False # Repair failed. - return True # Repair succeeded. - - def run_ffx(self, args, check=True, suppress_repair=False): - """Runs `ffx` with the given arguments, waiting for it to exit. - - If `ffx` exits with a non-zero exit code, the output is scanned for a - recommended repair command (e.g., "Run `ffx doctor --restart-daemon` for - further diagnostics."). If such a command is found, it is run and then the - original command is retried. This behavior can be suppressed via the - `suppress_repair` argument. - - Args: - args: A sequence of arguments to ffx. - check: If True, CalledProcessError is raised if ffx returns a non-zero - exit code. - suppress_repair: If True, do not attempt to find and run a repair command. - Returns: - A string containing combined stdout and stderr. - Raises: - CalledProcessError if `check` is true. - """ - log_file = self._log_manager.Open('ffx_log') \ - if self._log_manager.IsLoggingEnabled() else None - command = [self._ffx] - command.extend(args) - logging.debug(command) - if log_file: - print(command, file=log_file) - repair_succeeded = False - try: - # TODO(grt): Switch to subprocess.run() with encoding='utf-8' when p3 is - # supported. - process = subprocess.Popen(command, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - stdout_data, stderr_data = process.communicate() - stdout_data = stdout_data.decode('utf-8') - stderr_data = stderr_data.decode('utf-8') - if check and process.returncode != 0: - # TODO(grt): Pass stdout and stderr as two args when p2 support is no - # longer needed. - raise subprocess.CalledProcessError( - process.returncode, command, '\n'.join((stdout_data, stderr_data))) - except subprocess.CalledProcessError as cpe: - if log_file: - log_file.write('Process exited with code %d. Output: %s\n' % - (cpe.returncode, cpe.output.strip())) - # Let the exception fly unless a repair command is found and succeeds. - if suppress_repair or not self._run_repair_command(cpe.output): - raise - repair_succeeded = True - - # If the original command failed but a repair command was found and - # succeeded, try one more time with the original command. - if repair_succeeded: - return self.run_ffx(args, check, suppress_repair=True) - - stripped_stdout = stdout_data.strip() - stripped_stderr = stderr_data.strip() - if log_file: - if process.returncode != 0 or stripped_stderr: - log_file.write('Process exited with code %d.' % process.returncode) - if stripped_stderr: - log_file.write(' Stderr:\n%s\n' % stripped_stderr) - if stripped_stdout: - log_file.write(' Stdout:\n%s\n' % stripped_stdout) - if not stripped_stderr and not stripped_stdout: - log_file.write('\n') - elif stripped_stdout: - log_file.write('%s\n' % stripped_stdout) - logging.debug( - 'ffx command returned %d with %s%s', process.returncode, - ('output "%s"' % stripped_stdout if stripped_stdout else 'no output'), - (' and error "%s".' % stripped_stderr if stripped_stderr else '.')) - return stdout_data - - def open_ffx(self, args): - """Runs `ffx` with some arguments. - Args: - args: A sequence of arguments to ffx. - Returns: - A subprocess.Popen object. - """ - log_file = self._log_manager.Open('ffx_log') \ - if self._log_manager.IsLoggingEnabled() else None - command = [self._ffx] - command.extend(args) - logging.debug(command) - if log_file: - print(command, file=log_file) - try: - # TODO(grt): Add encoding='utf-8' when p3 is supported. - return subprocess.Popen(command, - stdin=open(os.devnull, 'r'), - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - except: - logging.exception('Failed to open ffx') - if log_file: - print('Exception caught while opening ffx: %s' % str(sys.exc_info[1])) - raise - - @contextlib.contextmanager - def scoped_config(self, name, value): - """Temporarily overrides `ffx` configuration. - - Args: - name: The name of the property to set. - value: The value to associate with `name`. - - Returns: - Yields nothing. Restores the previous value upon exit. - """ - assert value is not None - # Cache the current value. - old_value = None - try: - old_value = self.run_ffx(['config', 'get', name]).strip() - except subprocess.CalledProcessError as cpe: - if cpe.returncode != 2: - raise # The failure was for something other than value not found. - # Set the new value if it is different. - if value != old_value: - self.run_ffx(['config', 'set', name, value]) - try: - yield None - finally: - if value == old_value: - return # There is no need to restore an old value. - # Clear the new value. - self.run_ffx(['config', 'remove', name]) - if old_value is None: - return - # Did removing the new value restore the original value on account of it - # either being the default or being set in a different scope? - if (self.run_ffx(['config', 'get', name], - check=False).strip() == old_value): - return - # If not, explicitly set the original value. - self.run_ffx(['config', 'set', name, old_value]) - - def list_targets(self): - """Returns the (possibly empty) list of targets known to ffx. - - Returns: - The list of targets parsed from the JSON output of `ffx target list`. - """ - json_targets = self.run_ffx(['target', 'list', '-f', 'json']) - if not json_targets: - return [] - try: - return json.loads(json_targets) - except ValueError: - # TODO(grt): Change to json.JSONDecodeError once p3 is supported. - return [] - - def list_active_targets(self): - """Gets the list of targets and filters down to the targets that are active. - - Returns: - An iterator over active FfxTargets. - """ - targets = [ - FfxTarget.from_target_list_json(self, json_target) - for json_target in self.list_targets() - ] - return filter(lambda target: target.get_ssh_address(), targets) - - def remove_stale_targets(self, address): - """Removes any targets from ffx that are listening at a given address. - - Args: - address: A string representation of the target's ip address. - """ - for target in self.list_targets(): - if target['rcs_state'] == 'N' and address in target['addresses']: - self.run_ffx(['target', 'remove', address]) - - @contextlib.contextmanager - def scoped_target_context(self, address, port): - """Temporarily adds a new target. - - Args: - address: The IP address at which the target is listening. - port: The port number on which the target is listening. - - Yields: - An FfxTarget for interacting with the target. - """ - target_id = format_host_port(address, port) - # -n allows `target add` to skip waiting for the device to come up, - # as this can take longer than the default wait period. - self.run_ffx(['target', 'add', '-n', target_id]) - try: - yield FfxTarget.from_address(self, address, port) - finally: - self.run_ffx(['target', 'remove', target_id], check=False) - - def get_node_name(self, address, port): - """Returns the node name for a target given its SSH address. - - Args: - address: The address at which the target's SSH daemon is listening. - port: The port number on which the daemon is listening. - - Returns: - The target's node name. - - Raises: - Exception: If the target cannot be found. - """ - for target in self.list_targets(): - if target['nodename'] and address in target['addresses']: - ssh_address = FfxTarget.from_target_list_json(target).get_ssh_address() - if ssh_address and ssh_address[1] == port: - return target['nodename'] - raise Exception('Failed to determine node name for target at %s' % - format_host_port(address, port)) - - def daemon_stop(self): - """Stops the ffx daemon.""" - self.run_ffx(['daemon', 'stop'], check=False, suppress_repair=True) - # Daemon should stop at this point. - self._wait_for_daemon(start=False) - - -class FfxTarget(): - """A helper to run `ffx` commands for a specific target.""" - - @classmethod - def from_address(cls, ffx_runner, address, port=None): - """Args: - ffx_runner: The runner to use to run ffx. - address: The target's address. - port: The target's port, defaults to None in which case it will target - the first device at the specified address - """ - return cls(ffx_runner, format_host_port(address, port) if port else address) - - @classmethod - def from_node_name(cls, ffx_runner, node_name): - """Args: - ffx_runner: The runner to use to run ffx. - node_name: The target's node name. - """ - return cls(ffx_runner, node_name) - - @classmethod - def from_target_list_json(cls, ffx_runner, json_target): - """Args: - ffx_runner: The runner to use to run ffx. - json_target: the json dict as returned from `ffx list targets` - """ - # Targets seen via `fx serve-remote` frequently have no name, so fall back - # to using the first address. - if json_target['nodename'].startswith(' mock.Mock: @mock.patch('tempfile.TemporaryDirectory') @mock.patch('subprocess.run') @mock.patch('tarfile.open') +@unittest.skipIf(os.name == 'nt', 'Fuchsia tests not supported on Windows') class TestDownloadAndUnpackFromCloudStorage(unittest.TestCase): def testHappyPath(self, mock_tarfile, mock_run, mock_tmp_dir): mock_run.return_value = _mock_task() - mock_tmp_dir.return_value.__enter__.return_value = '/some/tmp/dir' + + tmp_dir = os.path.join('some', 'tmp', 'dir') + mock_tmp_dir.return_value.__enter__.return_value = tmp_dir mock_seq = mock.Mock() mock_seq.attach_mock(mock_run, 'Run') mock_seq.attach_mock(mock_tarfile, 'Untar') mock_seq.attach_mock(mock_tmp_dir, 'MkTmpD') - DownloadAndUnpackFromCloudStorage('gs://some/url', 'output/dir') + output_dir = os.path.join('output', 'dir') + DownloadAndUnpackFromCloudStorage('gs://some/url', output_dir) + image_tgz_path = os.path.join(tmp_dir, 'image.tgz') mock_seq.assert_has_calls([ mock.call.MkTmpD(), mock.call.MkTmpD().__enter__(), @@ -47,8 +52,8 @@ def testHappyPath(self, mock_tarfile, mock_run, mock_tmp_dir): stdout=subprocess.PIPE, check=True, encoding='utf-8'), - mock.call.Untar(name='/some/tmp/dir/image.tgz', mode='r|gz'), - mock.call.Untar().extractall(path='output/dir'), + mock.call.Untar(name=image_tgz_path, mode='r|gz'), + mock.call.Untar().extractall(path=output_dir), mock.call.MkTmpD().__exit__(None, None, None) ], any_order=False) @@ -56,8 +61,7 @@ def testHappyPath(self, mock_tarfile, mock_run, mock_tmp_dir): # Verify cmd. cmd = ' '.join(mock_run.call_args[0][0]) self.assertRegex( - cmd, - r'.*python\s.*gsutil.py\s+cp\s+gs://some/url\s+/some/tmp/dir/image.tgz') + cmd, r'.*python3?\s.*gsutil.py\s+cp\s+gs://some/url\s+' + image_tgz_path) def testFailedTarOpen(self, mock_tarfile, mock_run, mock_tmp_dir): mock_run.return_value = _mock_task(stderr='some error') diff --git a/build/fuchsia/gen_build_defs.py b/build/fuchsia/gen_build_defs.py new file mode 100755 index 0000000..69481d9 --- /dev/null +++ b/build/fuchsia/gen_build_defs.py @@ -0,0 +1,344 @@ +#!/usr/bin/env vpython3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# Generates a single BUILD.gn file with build targets generated using the +# manifest files in the SDK. + +import json +import logging +import os +import sys + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), + 'test'))) + +from common import DIR_SRC_ROOT, SDK_ROOT, get_host_os + +# Inserted at the top of the generated BUILD.gn file. +_GENERATED_PREAMBLE = """# DO NOT EDIT! This file was generated by +# //build/fuchsia/gen_build_def.py. +# Any changes made to this file will be discarded. + +import("//third_party/fuchsia-gn-sdk/src/fidl_library.gni") +import("//third_party/fuchsia-gn-sdk/src/fuchsia_sdk_pkg.gni") + +""" + + +def ReformatTargetName(dep_name): + """"Substitutes characters in |dep_name| which are not valid in GN target + names (e.g. dots become hyphens).""" + return dep_name + + +def FormatGNTarget(fields): + """Returns a GN target definition as a string. + + |fields|: The GN fields to include in the target body. + 'target_name' and 'type' are mandatory.""" + + output = '%s("%s") {\n' % (fields['type'], fields['target_name']) + del fields['target_name'] + del fields['type'] + + # Ensure that fields with no ordering requirement are sorted. + for field in ['sources', 'public_deps']: + if field in fields: + fields[field].sort() + + for key, val in fields.items(): + if isinstance(val, str): + val_serialized = '\"%s\"' % val + elif isinstance(val, list): + # Serialize a list of strings in the prettiest possible manner. + if len(val) == 0: + val_serialized = '[]' + elif len(val) == 1: + val_serialized = '[ \"%s\" ]' % val[0] + else: + val_serialized = '[\n ' + ',\n '.join(['\"%s\"' % x + for x in val]) + '\n ]' + else: + raise Exception('Could not serialize %r' % val) + + output += ' %s = %s\n' % (key, val_serialized) + output += '}' + + return output + + +def MetaRootRelativePaths(sdk_relative_paths, meta_root): + return [os.path.relpath(path, meta_root) for path in sdk_relative_paths] + + +def ConvertCommonFields(json): + """Extracts fields from JSON manifest data which are used across all + target types. Note that FIDL packages do their own processing.""" + + meta_root = json['root'] + + converted = {'target_name': ReformatTargetName(json['name'])} + + if 'deps' in json: + converted['public_deps'] = MetaRootRelativePaths(json['deps'], + os.path.dirname(meta_root)) + + # FIDL bindings dependencies are relative to the "fidl" sub-directory. + if 'fidl_binding_deps' in json: + for entry in json['fidl_binding_deps']: + converted['public_deps'] += MetaRootRelativePaths([ + 'fidl/' + dep + ':' + os.path.basename(dep) + '_' + + entry['binding_type'] for dep in entry['deps'] + ], meta_root) + + return converted + + +def ConvertFidlLibrary(json): + """Converts a fidl_library manifest entry to a GN target. + + Arguments: + json: The parsed manifest JSON. + Returns: + The GN target definition, represented as a string.""" + + meta_root = json['root'] + + converted = ConvertCommonFields(json) + converted['type'] = 'fidl_library' + converted['sources'] = MetaRootRelativePaths(json['sources'], meta_root) + converted['library_name'] = json['name'] + + return converted + + +def ConvertCcPrebuiltLibrary(json): + """Converts a cc_prebuilt_library manifest entry to a GN target. + + Arguments: + json: The parsed manifest JSON. + Returns: + The GN target definition, represented as a string.""" + + meta_root = json['root'] + + converted = ConvertCommonFields(json) + converted['type'] = 'fuchsia_sdk_pkg' + + converted['sources'] = MetaRootRelativePaths(json['headers'], meta_root) + + converted['include_dirs'] = MetaRootRelativePaths([json['include_dir']], + meta_root) + + if json['format'] == 'shared': + converted['shared_libs'] = [json['name']] + else: + converted['static_libs'] = [json['name']] + + return converted + + +def ConvertCcSourceLibrary(json): + """Converts a cc_source_library manifest entry to a GN target. + + Arguments: + json: The parsed manifest JSON. + Returns: + The GN target definition, represented as a string.""" + + meta_root = json['root'] + + converted = ConvertCommonFields(json) + converted['type'] = 'fuchsia_sdk_pkg' + + # Headers and source file paths can be scattered across "sources", "headers", + # and "files". Merge them together into one source list. + converted['sources'] = MetaRootRelativePaths(json['sources'], meta_root) + if 'headers' in json: + converted['sources'] += MetaRootRelativePaths(json['headers'], meta_root) + if 'files' in json: + converted['sources'] += MetaRootRelativePaths(json['files'], meta_root) + converted['sources'] = list(set(converted['sources'])) + + converted['include_dirs'] = MetaRootRelativePaths([json['include_dir']], + meta_root) + + return converted + + +def ConvertLoadableModule(json): + """Converts a loadable module manifest entry to GN targets. + + Arguments: + json: The parsed manifest JSON. + Returns: + A list of GN target definitions.""" + + name = json['name'] + if name != 'vulkan_layers': + raise RuntimeError('Unsupported loadable_module: %s' % name) + + # Copy resources and binaries + resources = json['resources'] + + binaries = json['binaries'] + + def _filename_no_ext(name): + return os.path.splitext(os.path.basename(name))[0] + + # Pair each json resource with its corresponding binary. Each such pair + # is a "layer". We only need to check one arch because each arch has the + # same list of binaries. + arch = next(iter(binaries)) + binary_names = binaries[arch] + local_pkg = json['root'] + vulkan_targets = [] + + for res in resources: + layer_name = _filename_no_ext(res) + + # Filter binaries for a matching name. + filtered = [n for n in binary_names if _filename_no_ext(n) == layer_name] + + if not filtered: + # If the binary could not be found then do not generate a + # target for this layer. The missing targets will cause a + # mismatch with the "golden" outputs. + continue + + # Replace hardcoded arch in the found binary filename. + binary = filtered[0].replace('/' + arch + '/', "/${target_cpu}/") + + target = {} + target['name'] = layer_name + target['config'] = os.path.relpath(res, start=local_pkg) + target['binary'] = os.path.relpath(binary, start=local_pkg) + + vulkan_targets.append(target) + + converted = [] + all_target = {} + all_target['target_name'] = 'all' + all_target['type'] = 'group' + all_target['data_deps'] = [] + for target in vulkan_targets: + config_target = {} + config_target['target_name'] = target['name'] + '_config' + config_target['type'] = 'copy' + config_target['sources'] = [target['config']] + config_target['outputs'] = ['${root_gen_dir}/' + target['config']] + converted.append(config_target) + lib_target = {} + lib_target['target_name'] = target['name'] + '_lib' + lib_target['type'] = 'copy' + lib_target['sources'] = [target['binary']] + lib_target['outputs'] = ['${root_out_dir}/lib/{{source_file_part}}'] + converted.append(lib_target) + group_target = {} + group_target['target_name'] = target['name'] + group_target['type'] = 'group' + group_target['data_deps'] = [ + ':' + target['name'] + '_config', ':' + target['name'] + '_lib' + ] + converted.append(group_target) + all_target['data_deps'].append(':' + target['name']) + converted.append(all_target) + return converted + + +def ConvertNoOp(json): + """Null implementation of a conversion function. No output is generated.""" + + return None + + +"""Maps manifest types to conversion functions.""" +_CONVERSION_FUNCTION_MAP = { + 'fidl_library': ConvertFidlLibrary, + 'cc_source_library': ConvertCcSourceLibrary, + 'cc_prebuilt_library': ConvertCcPrebuiltLibrary, + 'loadable_module': ConvertLoadableModule, + + # No need to build targets for these types yet. + 'bind_library': ConvertNoOp, + 'companion_host_tool': ConvertNoOp, + 'component_manifest': ConvertNoOp, + 'config': ConvertNoOp, + 'dart_library': ConvertNoOp, + 'data': ConvertNoOp, + 'device_profile': ConvertNoOp, + 'documentation': ConvertNoOp, + 'ffx_tool': ConvertNoOp, + 'host_tool': ConvertNoOp, + 'image': ConvertNoOp, + 'package': ConvertNoOp, + 'sysroot': ConvertNoOp, +} + + +def ConvertMeta(meta_path): + parsed = json.load(open(meta_path)) + if 'type' not in parsed: + return + + convert_function = _CONVERSION_FUNCTION_MAP.get(parsed['type']) + if convert_function is None: + logging.warning('Unexpected SDK artifact type %s in %s.' % + (parsed['type'], meta_path)) + return + + converted = convert_function(parsed) + if not converted: + return + output_path = os.path.join(os.path.dirname(meta_path), 'BUILD.gn') + if os.path.exists(output_path): + os.unlink(output_path) + with open(output_path, 'w') as buildfile: + buildfile.write(_GENERATED_PREAMBLE) + + # Loadable modules have multiple targets + if convert_function != ConvertLoadableModule: + buildfile.write(FormatGNTarget(converted) + '\n\n') + else: + for target in converted: + buildfile.write(FormatGNTarget(target) + '\n\n') + + +def ProcessSdkManifest(): + toplevel_meta = json.load( + open(os.path.join(SDK_ROOT, 'meta', 'manifest.json'))) + + for part in toplevel_meta['parts']: + meta_path = os.path.join(SDK_ROOT, part['meta']) + ConvertMeta(meta_path) + + +def main(): + + # Exit if there's no Fuchsia support for this platform. + try: + get_host_os() + except: + logging.warning('Fuchsia SDK is not supported on this platform.') + return 0 + + # TODO(crbug/1432399): Remove this when links to these files inside the sdk + # directory have been redirected. + build_path = os.path.join(SDK_ROOT, 'build') + os.makedirs(build_path, exist_ok=True) + for gn_file in ['component.gni', 'package.gni']: + open(os.path.join(build_path, gn_file), + "w").write("""# DO NOT EDIT! This file was generated by +# //build/fuchsia/gen_build_def.py. +# Any changes made to this file will be discarded. + +import("//third_party/fuchsia-gn-sdk/src/{}") + """.format(gn_file)) + + ProcessSdkManifest() + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/build/fuchsia/get_auth_token.py b/build/fuchsia/get_auth_token.py new file mode 100755 index 0000000..3f5569b --- /dev/null +++ b/build/fuchsia/get_auth_token.py @@ -0,0 +1,31 @@ +#!/usr/bin/env vpython3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Print the default service account's auth token to stdout.""" + +from __future__ import absolute_import +import os +import subprocess +import sys + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), + 'test'))) +from common import DIR_SRC_ROOT + +sys.path.append(os.path.join(DIR_SRC_ROOT, 'build')) +import find_depot_tools + + +def main(): + luci_auth = os.path.join(find_depot_tools.DEPOT_TOOLS_PATH, 'luci-auth') + proc = subprocess.run([ + luci_auth, 'token', '-scopes', + 'https://www.googleapis.com/auth/devstorage.read_only' + ], + encoding='utf-8') + return proc.returncode + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/build/fuchsia/legacy_ermine_ctl.py b/build/fuchsia/legacy_ermine_ctl.py deleted file mode 100644 index ed2f3f3..0000000 --- a/build/fuchsia/legacy_ermine_ctl.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2022 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Adds python interface to erminectl tools on workstation products.""" - -import os -import subprocess -import sys -from typing import Any, List - -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), - 'test'))) -import base_ermine_ctl - - -class LegacyErmineCtl(base_ermine_ctl.BaseErmineCtl): - def __init__(self, target: Any): - super().__init__() - self._target = target - - def execute_command_async(self, args: List[str]) -> subprocess.Popen: - return self._target.RunCommandPiped(args, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - encoding='utf-8') diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index fe6fc1c..1e92396 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1 @@ -1 +1 @@ -11.20230214.1.1 +18.20240217.1.1 diff --git a/build/fuchsia/log_manager.py b/build/fuchsia/log_manager.py deleted file mode 100644 index f2d142a..0000000 --- a/build/fuchsia/log_manager.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2020 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Creates and manages log file objects. - -Provides an object that handles opening and closing file streams for -logging purposes. -""" - -import os - - -class LogManager(object): - def __init__(self, logs_dir): - - # A dictionary with the log file path as the key and a file stream as value. - self._logs = {} - - self._logs_dir = logs_dir - if self._logs_dir: - if not os.path.isdir(self._logs_dir): - os.makedirs(self._logs_dir) - - def IsLoggingEnabled(self): - return self._logs_dir is not None - - def GetLogDirectory(self): - """Get the directory logs are placed into.""" - - return self._logs_dir - - def Open(self, log_file_name): - """Open a file stream with log_file_name in the logs directory.""" - - parent_dir = self.GetLogDirectory() - if not parent_dir: - return open(os.devnull, 'w') - log_file_path = os.path.join(parent_dir, log_file_name) - if log_file_path in self._logs: - return self._logs[log_file_path] - log_file = open(log_file_path, 'w', buffering=1) - self._logs[log_file_path] = log_file - return log_file - - def Stop(self): - for log in self._logs.values(): - log.close() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.Stop() diff --git a/build/fuchsia/net_test_server.py b/build/fuchsia/net_test_server.py deleted file mode 100644 index 4a617e7..0000000 --- a/build/fuchsia/net_test_server.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import common -import json -import logging -import os -import re -import socket -import sys -import subprocess -import tempfile - -DIR_SOURCE_ROOT = os.path.abspath( - os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) -sys.path.append(os.path.join(DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')) -import chrome_test_server_spawner - - -# Implementation of chrome_test_server_spawner.PortForwarder that uses SSH's -# remote port forwarding feature to forward ports. -class SSHPortForwarder(chrome_test_server_spawner.PortForwarder): - def __init__(self, target): - self._target = target - - # Maps the host (server) port to the device port number. - self._port_mapping = {} - - def Map(self, port_pairs): - for p in port_pairs: - _, host_port = p - self._port_mapping[host_port] = \ - common.ConnectPortForwardingTask(self._target, host_port) - - def GetDevicePortForHostPort(self, host_port): - return self._port_mapping[host_port] - - def Unmap(self, device_port): - for host_port, entry in self._port_mapping.items(): - if entry == device_port: - forwarding_args = [ - '-NT', '-O', 'cancel', '-R', '0:localhost:%d' % host_port] - task = self._target.RunCommandPiped([], - ssh_args=forwarding_args, - stdout=open(os.devnull, 'w'), - stderr=subprocess.PIPE) - task.wait() - if task.returncode != 0: - raise Exception( - 'Error %d when unmapping port %d' % (task.returncode, - device_port)) - del self._port_mapping[host_port] - return - - raise Exception('Unmap called for unknown port: %d' % device_port) - - -def SetupTestServer(target, test_concurrency): - """Provisions a forwarding test server and configures |target| to use it. - - Args: - target: The target to which port forwarding to the test server will be - established. - test_concurrency: The number of parallel test jobs that will be run. - - Returns a tuple of a Popen object for the test server process and the local - url to use on `target` to reach the test server.""" - - logging.debug('Starting test server.') - # The TestLauncher can launch more jobs than the limit specified with - # --test-launcher-jobs so the max number of spawned test servers is set to - # twice that limit here. See https://crbug.com/913156#c19. - spawning_server = chrome_test_server_spawner.SpawningServer( - 0, SSHPortForwarder(target), test_concurrency * 2) - forwarded_port = common.ConnectPortForwardingTask( - target, spawning_server.server_port) - spawning_server.Start() - - logging.debug('Test server listening for connections (port=%d)' % - spawning_server.server_port) - logging.debug('Forwarded port is %d' % forwarded_port) - - return (spawning_server, 'http://localhost:%d' % forwarded_port) diff --git a/build/fuchsia/pkg_repo.py b/build/fuchsia/pkg_repo.py deleted file mode 100644 index e772db2..0000000 --- a/build/fuchsia/pkg_repo.py +++ /dev/null @@ -1,236 +0,0 @@ -# Copyright 2019 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import common -import json -import logging -import os -import shutil -import subprocess -import sys -import tempfile -import time - -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), - 'test'))) -from compatible_utils import install_symbols - -# Maximum amount of time to block while waiting for "pm serve" to come up. -_PM_SERVE_LISTEN_TIMEOUT_SECS = 10 - -# Amount of time to sleep in between busywaits for "pm serve"'s port file. -_PM_SERVE_POLL_INTERVAL = 0.1 - -_MANAGED_REPO_NAME = 'chromium-test-package-server' - -_HOSTS = ['fuchsia.com', 'chrome.com', 'chromium.org'] - - -class PkgRepo(object): - """Abstract interface for a repository used to serve packages to devices.""" - - def __init__(self): - pass - - def PublishPackage(self, package_path): - pm_tool = common.GetHostToolPathFromPlatform('pm') - # Flags for `pm publish`: - # https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/src/sys/pkg/bin/pm/cmd/pm/publish/publish.go - # https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/src/sys/pkg/bin/pm/repo/config.go - # -a: Publish archived package - # -f : Path to packages - # -r : Path to repository - # -vt: Repo versioning based on time rather than monotonic version number - # increase - # -v: Verbose output - subprocess.check_call([ - pm_tool, 'publish', '-a', '-f', package_path, '-r', - self.GetPath(), '-vt', '-v' - ], stderr=subprocess.STDOUT) - - def GetPath(self): - pass - - -class ManagedPkgRepo(PkgRepo): - """Creates and serves packages from an ephemeral repository.""" - - def __init__(self, target): - super(ManagedPkgRepo, self).__init__() - self._with_count = 0 - self._target = target - - self._pkg_root = tempfile.mkdtemp() - pm_tool = common.GetHostToolPathFromPlatform('pm') - subprocess.check_call([pm_tool, 'newrepo', '-repo', self._pkg_root]) - logging.debug('Creating and serving temporary package root: {}.'.format( - self._pkg_root)) - - with tempfile.NamedTemporaryFile() as pm_port_file: - # Flags for `pm serve`: - # https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/src/sys/pkg/bin/pm/cmd/pm/serve/serve.go - self._pm_serve_task = subprocess.Popen([ - pm_tool, 'serve', - '-d', os.path.join(self._pkg_root, 'repository'), - '-c', '2', # Use config.json format v2, the default for pkgctl. - '-q', # Don't log transfer activity. - '-l', ':0', # Bind to ephemeral port. - '-f', pm_port_file.name # Publish port number to |pm_port_file|. - ]) # yapf: disable - - # Busywait until 'pm serve' starts the server and publishes its port to - # a temporary file. - timeout = time.time() + _PM_SERVE_LISTEN_TIMEOUT_SECS - serve_port = None - while not serve_port: - if time.time() > timeout: - raise Exception( - 'Timeout waiting for \'pm serve\' to publish its port.') - - with open(pm_port_file.name, 'r', encoding='utf8') as serve_port_file: - serve_port = serve_port_file.read() - - time.sleep(_PM_SERVE_POLL_INTERVAL) - - serve_port = int(serve_port) - logging.debug('pm serve is active on port {}.'.format(serve_port)) - - remote_port = common.ConnectPortForwardingTask(target, serve_port, 0) - self._RegisterPkgRepository(self._pkg_root, remote_port) - - def __enter__(self): - self._with_count += 1 - return self - - def __exit__(self, type, value, tb): - # Allows the repository to delete itself when it leaves the scope of a - # 'with' block. - self._with_count -= 1 - if self._with_count > 0: - return - - self._UnregisterPkgRepository() - self._pm_serve_task.kill() - self._pm_serve_task = None - - logging.info('Cleaning up package root: ' + self._pkg_root) - shutil.rmtree(self._pkg_root) - self._pkg_root = None - - def GetPath(self): - return self._pkg_root - - def _RegisterPkgRepository(self, tuf_repo, remote_port): - """Configures a device to use a local TUF repository as an installation - source for packages. - |tuf_repo|: The host filesystem path to the TUF repository. - |remote_port|: The reverse-forwarded port used to connect to instance of - `pm serve` that is serving the contents of |tuf_repo|.""" - - # Extract the public signing key for inclusion in the config file. - root_keys = [] - root_json_path = os.path.join(tuf_repo, 'repository', 'root.json') - root_json = json.load(open(root_json_path, 'r')) - for root_key_id in root_json['signed']['roles']['root']['keyids']: - root_keys.append({ - 'type': - root_json['signed']['keys'][root_key_id]['keytype'], - 'value': - root_json['signed']['keys'][root_key_id]['keyval']['public'] - }) - - # "pm serve" can automatically generate a "config.json" file at query time, - # but the file is unusable because it specifies URLs with port - # numbers that are unreachable from across the port forwarding boundary. - # So instead, we generate our own config file with the forwarded port - # numbers instead. - config_file = open(os.path.join(tuf_repo, 'repository', 'repo_config.json'), - 'w') - json.dump( - { - 'repo_url': - 'fuchsia-pkg://{}'.format(_MANAGED_REPO_NAME), - 'root_keys': - root_keys, - 'mirrors': [{ - "mirror_url": 'http://127.0.0.1:{}'.format(remote_port), - "subscribe": True - }], - 'root_threshold': - 1, - 'root_version': - 1 - }, config_file) - config_file.close() - - # Register the repo. - return_code = self._target.RunCommand([ - ('pkgctl repo rm fuchsia-pkg://{}; ' + - 'pkgctl repo add url http://127.0.0.1:{}/repo_config.json; ').format( - _MANAGED_REPO_NAME, remote_port) - ]) - if return_code != 0: - raise Exception( - 'Error code {} when running pkgctl repo add.'.format(return_code)) - - self._AddHostReplacementRule(_MANAGED_REPO_NAME) - - def _UnregisterPkgRepository(self): - """Unregisters the package repository.""" - - logging.debug('Unregistering package repository.') - self._target.RunCommand( - ['pkgctl', 'repo', 'rm', 'fuchsia-pkg://{}'.format(_MANAGED_REPO_NAME)]) - - # Re-enable 'devhost' repo if it's present. This is useful for devices that - # were booted with 'fx serve'. - self._AddHostReplacementRule('devhost', silent=True) - - def _AddHostReplacementRule(self, host_replacement, silent=False): - rule = json.dumps({ - 'version': - '1', - 'content': [{ - 'host_match': host, - 'host_replacement': host_replacement, - 'path_prefix_match': '/', - 'path_prefix_replacement': '/' - } for host in _HOSTS] - }) - - return_code = self._target.RunCommand( - ['pkgctl', 'rule', 'replace', 'json', "'{}'".format(rule)]) - if not silent and return_code != 0: - raise Exception( - 'Error code {} when running pkgctl rule replace with {}'.format( - return_code, rule)) - - -class ExternalPkgRepo(PkgRepo): - """Publishes packages to a package repository located and served externally - (ie. located under a Fuchsia build directory and served by "fx serve".""" - - def __init__(self, fuchsia_out_dir): - super(PkgRepo, self).__init__() - - self._fuchsia_out_dir = fuchsia_out_dir - self._pkg_root = os.path.join(fuchsia_out_dir, 'amber-files') - - logging.info('Using existing package root: {}'.format(self._pkg_root)) - logging.info('ATTENTION: This will not start a package server. ' + - 'Please run "fx serve" manually.') - - def GetPath(self): - return self._pkg_root - - def PublishPackage(self, package_path): - super(ExternalPkgRepo, self).PublishPackage(package_path) - - install_symbols((package_path), self._fuchsia_out_dir) - - def __enter__(self): - return self - - def __exit__(self, type, value, tb): - pass diff --git a/build/fuchsia/qemu_image.py b/build/fuchsia/qemu_image.py deleted file mode 100644 index 8c2f9b8..0000000 --- a/build/fuchsia/qemu_image.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright 2020 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Workaround for qemu-img bug on arm64 platforms with multiple cores. - -Runs qemu-img command with timeout and retries the command if it hangs. - -See: -crbug.com/1046861 QEMU is out of date; current version of qemu-img -is unstable - -https://bugs.launchpad.net/qemu/+bug/1805256 qemu-img hangs on -rcu_call_ready_event logic in Aarch64 when converting images - -TODO(crbug.com/1046861): Remove this workaround when the bug is fixed. -""" - -import logging -import subprocess -import tempfile -import time - - -# qemu-img p99 run time on Cavium ThunderX2 servers is 26 seconds. -# Using 2x the p99 time as the timeout. -QEMU_IMG_TIMEOUT_SEC = 52 - - -def _ExecQemuImgWithTimeout(command): - """Execute qemu-img command in subprocess with timeout. - - Returns: None if command timed out or return code if command completed. - """ - - logging.info('qemu-img starting') - command_output_file = tempfile.NamedTemporaryFile('w') - p = subprocess.Popen(command, stdout=command_output_file, - stderr=subprocess.STDOUT) - start_sec = time.time() - while p.poll() is None and time.time() - start_sec < QEMU_IMG_TIMEOUT_SEC: - time.sleep(1) - stop_sec = time.time() - logging.info('qemu-img duration: %f' % float(stop_sec - start_sec)) - - if p.poll() is None: - returncode = None - p.kill() - p.wait() - else: - returncode = p.returncode - - log_level = logging.WARN if returncode else logging.DEBUG - for line in open(command_output_file.name, 'r'): - logging.log(log_level, 'qemu-img stdout: ' + line.strip()) - - return returncode - - -def ExecQemuImgWithRetry(command): - """ Execute qemu-img command in subprocess with 2 retries. - - Raises CalledProcessError if command does not complete successfully. - """ - - tries = 0 - status = None - while status is None and tries <= 2: - tries += 1 - status = _ExecQemuImgWithTimeout(command) - - if status is None: - raise subprocess.CalledProcessError(-1, command) - if status: - raise subprocess.CalledProcessError(status, command) diff --git a/build/fuchsia/qemu_target.py b/build/fuchsia/qemu_target.py deleted file mode 100644 index da3458f..0000000 --- a/build/fuchsia/qemu_target.py +++ /dev/null @@ -1,274 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Implements commands for running and interacting with Fuchsia on QEMU.""" - -import boot_data -import common -import emu_target -import hashlib -import logging -import os -import platform -import qemu_image -import shutil -import subprocess -import sys -import tempfile - -from common import EnsurePathExists, GetHostArchFromPlatform, \ - GetEmuRootForPlatform -from qemu_image import ExecQemuImgWithRetry -from target import FuchsiaTargetException - - -# Virtual networking configuration data for QEMU. -HOST_IP_ADDRESS = '10.0.2.2' -GUEST_MAC_ADDRESS = '52:54:00:63:5e:7b' - -# Capacity of the system's blobstore volume. -EXTENDED_BLOBSTORE_SIZE = 2147483648 # 2GB - - -def GetTargetType(): - return QemuTarget - - -class QemuTarget(emu_target.EmuTarget): - EMULATOR_NAME = 'qemu' - - def __init__(self, out_dir, target_cpu, cpu_cores, require_kvm, ram_size_mb, - logs_dir): - super(QemuTarget, self).__init__(out_dir, target_cpu, logs_dir, None) - self._cpu_cores=cpu_cores - self._require_kvm=require_kvm - self._ram_size_mb=ram_size_mb - self._host_ssh_port = None - - @staticmethod - def CreateFromArgs(args): - return QemuTarget(args.out_dir, args.target_cpu, args.cpu_cores, - args.require_kvm, args.ram_size_mb, args.logs_dir) - - def _IsKvmEnabled(self): - kvm_supported = sys.platform.startswith('linux') and \ - os.access('/dev/kvm', os.R_OK | os.W_OK) - same_arch = \ - (self._target_cpu == 'arm64' and platform.machine() == 'aarch64') or \ - (self._target_cpu == 'x64' and platform.machine() == 'x86_64') - if kvm_supported and same_arch: - return True - elif self._require_kvm: - if same_arch: - if not os.path.exists('/dev/kvm'): - kvm_error = 'File /dev/kvm does not exist. Please install KVM first.' - else: - kvm_error = 'To use KVM acceleration, add user to the kvm group '\ - 'with "sudo usermod -a -G kvm $USER". Log out and back '\ - 'in for the change to take effect.' - raise FuchsiaTargetException(kvm_error) - else: - raise FuchsiaTargetException('KVM unavailable when CPU architecture '\ - 'of host is different from that of'\ - ' target. See --allow-no-kvm.') - else: - return False - - def _BuildQemuConfig(self): - boot_data.AssertBootImagesExist(self._pb_path) - - emu_command = [ - '-kernel', - EnsurePathExists(boot_data.GetTargetFile(self._kernel, self._pb_path)), - '-initrd', - EnsurePathExists( - boot_data.GetBootImage(self._out_dir, self._pb_path, - self._ramdisk)), - '-m', - str(self._ram_size_mb), - '-smp', - str(self._cpu_cores), - - # Attach the blobstore and data volumes. Use snapshot mode to discard - # any changes. - '-snapshot', - '-drive', - 'file=%s,format=qcow2,if=none,id=blobstore,snapshot=on,cache=unsafe' % - _EnsureBlobstoreQcowAndReturnPath(self._out_dir, self._disk_image, - self._pb_path), - '-object', - 'iothread,id=iothread0', - '-device', - 'virtio-blk-pci,drive=blobstore,iothread=iothread0', - - # Use stdio for the guest OS only; don't attach the QEMU interactive - # monitor. - '-serial', - 'stdio', - '-monitor', - 'none', - ] - - # Configure the machine to emulate, based on the target architecture. - if self._target_cpu == 'arm64': - emu_command.extend([ - '-machine', - 'virt-2.12,gic-version=host', - ]) - else: - emu_command.extend([ - '-machine', 'q35', - ]) - - # Configure virtual network. - netdev_type = 'virtio-net-pci' - netdev_config = 'type=user,id=net0,restrict=off' - - self._host_ssh_port = common.GetAvailableTcpPort() - netdev_config += ",hostfwd=tcp::%s-:22" % self._host_ssh_port - emu_command.extend([ - '-netdev', netdev_config, - '-device', '%s,netdev=net0,mac=%s' % (netdev_type, GUEST_MAC_ADDRESS), - ]) - - # Configure the CPU to emulate. - # On Linux, we can enable lightweight virtualization (KVM) if the host and - # guest architectures are the same. - if self._IsKvmEnabled(): - kvm_command = ['-enable-kvm', '-cpu'] - if self._target_cpu == 'arm64': - kvm_command.append('host') - else: - kvm_command.append('host,migratable=no,+invtsc') - else: - logging.warning('Unable to launch %s with KVM acceleration. ' - 'The guest VM will be slow.' % (self.EMULATOR_NAME)) - if self._target_cpu == 'arm64': - kvm_command = ['-cpu', 'cortex-a53'] - else: - kvm_command = ['-cpu', 'Haswell,+smap,-check,-fsgsbase'] - - emu_command.extend(kvm_command) - - kernel_args = boot_data.GetKernelArgs() - - # TERM=dumb tells the guest OS to not emit ANSI commands that trigger - # noisy ANSI spew from the user's terminal emulator. - kernel_args.append('TERM=dumb') - - # Construct kernel cmd line - kernel_args.append('kernel.serial=legacy') - - # Don't 'reboot' the emulator if the kernel crashes - kernel_args.append('kernel.halt-on-panic=true') - - emu_command.extend(['-append', ' '.join(kernel_args)]) - - return emu_command - - def _BuildCommand(self): - if self._target_cpu == 'arm64': - qemu_exec = 'qemu-system-' + 'aarch64' - elif self._target_cpu == 'x64': - qemu_exec = 'qemu-system-' + 'x86_64' - else: - raise Exception('Unknown target_cpu %s:' % self._target_cpu) - - qemu_command = [ - os.path.join(GetEmuRootForPlatform(self.EMULATOR_NAME), 'bin', - qemu_exec) - ] - qemu_command.extend(self._BuildQemuConfig()) - qemu_command.append('-nographic') - return qemu_command - - def _Shutdown(self): - if not self._emu_process: - logging.error('%s did not start' % (self.EMULATOR_NAME)) - return - returncode = self._emu_process.poll() - if returncode == None: - logging.info('Shutting down %s' % (self.EMULATOR_NAME)) - self._emu_process.kill() - elif returncode == 0: - logging.info('%s quit unexpectedly without errors' % self.EMULATOR_NAME) - elif returncode < 0: - logging.error('%s was terminated by signal %d' % - (self.EMULATOR_NAME, -returncode)) - else: - logging.error('%s quit unexpectedly with exit code %d' % - (self.EMULATOR_NAME, returncode)) - - def _HasNetworking(self): - return False - - def _IsEmuStillRunning(self): - if not self._emu_process: - return False - return os.waitpid(self._emu_process.pid, os.WNOHANG)[0] == 0 - - def _GetEndpoint(self): - if not self._IsEmuStillRunning(): - raise Exception('%s quit unexpectedly.' % (self.EMULATOR_NAME)) - return (self.LOCAL_ADDRESS, self._host_ssh_port) - - -def _ComputeFileHash(filename): - hasher = hashlib.md5() - with open(filename, 'rb') as f: - buf = f.read(4096) - while buf: - hasher.update(buf) - buf = f.read(4096) - - return hasher.hexdigest() - - -def _EnsureBlobstoreQcowAndReturnPath(out_dir, kernel, image_path): - """Returns a file containing the Fuchsia blobstore in a QCOW format, - with extra buffer space added for growth.""" - - qimg_tool = os.path.join(common.GetEmuRootForPlatform('qemu'), - 'bin', 'qemu-img') - fvm_tool = common.GetHostToolPathFromPlatform('fvm') - blobstore_path = boot_data.GetTargetFile(kernel, image_path) - qcow_path = os.path.join(out_dir, 'gen', 'blobstore.qcow') - - # Check a hash of the blobstore to determine if we can re-use an existing - # extended version of it. - blobstore_hash_path = os.path.join(out_dir, 'gen', 'blobstore.hash') - current_blobstore_hash = _ComputeFileHash(blobstore_path) - - if os.path.exists(blobstore_hash_path) and os.path.exists(qcow_path): - if current_blobstore_hash == open(blobstore_hash_path, 'r').read(): - return qcow_path - - # Add some extra room for growth to the Blobstore volume. - # Fuchsia is unable to automatically extend FVM volumes at runtime so the - # volume enlargement must be performed prior to QEMU startup. - - # The 'fvm' tool only supports extending volumes in-place, so make a - # temporary copy of 'blobstore.bin' before it's mutated. - extended_blobstore = tempfile.NamedTemporaryFile() - shutil.copyfile(blobstore_path, extended_blobstore.name) - subprocess.check_call([fvm_tool, extended_blobstore.name, 'extend', - '--length', str(EXTENDED_BLOBSTORE_SIZE), - blobstore_path]) - - # Construct a QCOW image from the extended, temporary FVM volume. - # The result will be retained in the build output directory for re-use. - qemu_img_cmd = [qimg_tool, 'convert', '-f', 'raw', '-O', 'qcow2', - '-c', extended_blobstore.name, qcow_path] - # TODO(crbug.com/1046861): Remove arm64 call with retries when bug is fixed. - if common.GetHostArchFromPlatform() == 'arm64': - qemu_image.ExecQemuImgWithRetry(qemu_img_cmd) - else: - subprocess.check_call(qemu_img_cmd) - - # Write out a hash of the original blobstore file, so that subsequent runs - # can trivially check if a cached extended FVM volume is available for reuse. - with open(blobstore_hash_path, 'w') as blobstore_hash_file: - blobstore_hash_file.write(current_blobstore_hash) - - return qcow_path diff --git a/build/fuchsia/qemu_target_test.py b/build/fuchsia/qemu_target_test.py deleted file mode 100755 index 8f2846b..0000000 --- a/build/fuchsia/qemu_target_test.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import qemu_target -import shutil -import subprocess -import tempfile -import time -import unittest - -TEST_PAYLOAD = "Let's get this payload across the finish line!" - -tmpdir = tempfile.mkdtemp() - -# Register the target with the context manager so that it always gets -# torn down on process exit. Otherwise there might be lingering QEMU instances -# if Python crashes or is interrupted. -with qemu_target.QemuTarget(tmpdir, 'x64') as target: - class TestQemuTarget(unittest.TestCase): - @classmethod - def setUpClass(cls): - target.Start() - - @classmethod - def tearDownClass(cls): - target.Shutdown() - shutil.rmtree(tmpdir) - - def testRunCommand(self): - self.assertEqual(0, target.RunCommand(['true'])) - self.assertEqual(1, target.RunCommand(['false'])) - - def testRunCommandPiped(self): - proc = target.RunCommandPiped(['cat'], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - proc.stdin.write(TEST_PAYLOAD) - proc.stdin.flush() - proc.stdin.close() - self.assertEqual(TEST_PAYLOAD, proc.stdout.readline()) - proc.kill() - - - if __name__ == '__main__': - unittest.main() diff --git a/build/fuchsia/remote_cmd.py b/build/fuchsia/remote_cmd.py deleted file mode 100644 index e103851..0000000 --- a/build/fuchsia/remote_cmd.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import logging -import os -import subprocess - -from common import SubprocessCallWithTimeout - -_SSH = ['ssh'] -_SCP = ['scp', '-C'] # Use gzip compression. -_SSH_LOGGER = logging.getLogger('ssh') - -COPY_TO_TARGET = 0 -COPY_FROM_TARGET = 1 - - -def _IsLinkLocalIPv6(hostname): - return hostname.startswith('fe80::') - -def _EscapeIfIPv6Address(address): - if ':' in address: - return '[' + address + ']' - else: - return address - -class CommandRunner(object): - """Helper class used to execute commands on a remote host over SSH.""" - - def __init__(self, config_path, host, port): - """Creates a CommandRunner that connects to the specified |host| and |port| - using the ssh config at the specified |config_path|. - - config_path: Full path to SSH configuration. - host: The hostname or IP address of the remote host. - port: The port to connect to.""" - - self._config_path = config_path - self._host = host - self._port = port - - def _GetSshCommandLinePrefix(self): - cmd_prefix = _SSH + ['-F', self._config_path, self._host] - if self._port: - cmd_prefix += ['-p', str(self._port)] - return cmd_prefix - - def RunCommand(self, command, silent=False, timeout_secs=None): - """Executes an SSH command on the remote host and blocks until completion. - - command: A list of strings containing the command and its arguments. - silent: Suppresses all logging in case of success or failure. - timeout_secs: If set, limits the amount of time that |command| may run. - Commands which exceed the timeout are killed. - - Returns the exit code from the remote command.""" - - ssh_command = self._GetSshCommandLinePrefix() + command - _SSH_LOGGER.debug('ssh exec: ' + ' '.join(ssh_command)) - retval, stdout, stderr = SubprocessCallWithTimeout(ssh_command, - timeout_secs) - if silent: - return retval - - stripped_stdout = stdout.strip() - stripped_stderr = stderr.strip() - if retval: - _SSH_LOGGER.error('"%s" failed with exit code %d%s%s', - ' '.join(ssh_command), - retval, - (' and stdout: "%s"' % stripped_stdout) \ - if stripped_stdout else '', - (' and stderr: "%s"' % stripped_stderr) \ - if stripped_stderr else '', - ) - elif stripped_stdout or stripped_stderr: - _SSH_LOGGER.debug('succeeded with%s%s', - (' stdout: "%s"' % stripped_stdout) \ - if stripped_stdout else '', - (' stderr: "%s"' % stripped_stderr) \ - if stripped_stderr else '', - ) - - return retval - - def RunCommandPiped(self, command, stdout, stderr, ssh_args = None, **kwargs): - """Executes an SSH command on the remote host and returns a process object - with access to the command's stdio streams. Does not block. - - command: A list of strings containing the command and its arguments. - stdout: subprocess stdout. Must not be None. - stderr: subprocess stderr. Must not be None. - ssh_args: Arguments that will be passed to SSH. - kwargs: A dictionary of parameters to be passed to subprocess.Popen(). - The parameters can be used to override stdin and stdout, for - example. - - Returns a Popen object for the command.""" - - if not stdout or not stderr: - raise Exception('Stdout/stderr must be specified explicitly') - - if not ssh_args: - ssh_args = [] - - ssh_command = self._GetSshCommandLinePrefix() + ssh_args + ['--'] + command - _SSH_LOGGER.debug(' '.join(ssh_command)) - return subprocess.Popen(ssh_command, stdout=stdout, stderr=stderr, **kwargs) - - - def RunScp(self, sources, dest, direction, recursive=False): - """Copies a file to or from a remote host using SCP and blocks until - completion. - - sources: Paths of the files to be copied. - dest: The path that |source| will be copied to. - direction: Indicates whether the file should be copied to - or from the remote side. - Valid values are COPY_TO_TARGET or COPY_FROM_TARGET. - recursive: If true, performs a recursive copy. - - Function will raise an assertion if a failure occurred.""" - - scp_command = _SCP[:] - if _SSH_LOGGER.getEffectiveLevel() == logging.DEBUG: - scp_command.append('-v') - if recursive: - scp_command.append('-r') - - host = _EscapeIfIPv6Address(self._host) - - if direction == COPY_TO_TARGET: - dest = "%s:%s" % (host, dest) - else: - sources = ["%s:%s" % (host, source) for source in sources] - - scp_command += ['-F', self._config_path] - if self._port: - scp_command += ['-P', str(self._port)] - scp_command += sources - scp_command += [dest] - - _SSH_LOGGER.debug(' '.join(scp_command)) - try: - scp_output = subprocess.check_output(scp_command, - stderr=subprocess.STDOUT) - except subprocess.CalledProcessError as error: - _SSH_LOGGER.info(error.output) - raise diff --git a/build/fuchsia/run_test_package.py b/build/fuchsia/run_test_package.py deleted file mode 100644 index 6bd39f1..0000000 --- a/build/fuchsia/run_test_package.py +++ /dev/null @@ -1,212 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Contains a helper function for deploying and executing a packaged -executable on a Target.""" - - -import common -import hashlib -import logging -import multiprocessing -import os -import re -import select -import subprocess -import sys -import threading -import time -import uuid - -from exit_on_sig_term import ExitOnSigTerm -from symbolizer import BuildIdsPaths, RunSymbolizer - -FAR = common.GetHostToolPathFromPlatform('far') - -# Amount of time to wait for the termination of the system log output thread. -_JOIN_TIMEOUT_SECS = 5 - - -def _AttachKernelLogReader(target): - """Attaches a kernel log reader as a long-running SSH task.""" - - logging.info('Attaching kernel logger.') - return target.RunCommandPiped(['log_listener', - '--since_now', - '--hide_metadata', - '--tag', - 'klog', - ], - stdin=open(os.devnull, 'r'), - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - - -class MergedInputStream(object): - """Merges a number of input streams into a UTF-8 encoded UNIX pipe on a - dedicated thread. Terminates when the file descriptor of the primary stream - (the first in the sequence) is closed.""" - - def __init__(self, streams): - assert len(streams) > 0 - self._streams = streams - self._output_stream = None - self._thread = None - - def Start(self): - """Returns a pipe to the merged output stream.""" - - read_pipe, write_pipe = os.pipe() - - self._output_stream = os.fdopen(write_pipe, 'wb', 0) - self._thread = threading.Thread(target=self._Run) - self._thread.start() - - return os.fdopen(read_pipe, 'r') - - def _Run(self): - streams_by_fd = {} - primary_fd = self._streams[0].fileno() - for s in self._streams: - streams_by_fd[s.fileno()] = s - - # Set when the primary FD is closed. Input from other FDs will continue to - # be processed until select() runs dry. - flush = False - - # The lifetime of the MergedInputStream is bound to the lifetime of - # |primary_fd|. - while primary_fd: - # When not flushing: block until data is read or an exception occurs. - rlist, _, xlist = select.select(streams_by_fd, [], streams_by_fd) - - if len(rlist) == 0 and flush: - break - - for fileno in xlist: - del streams_by_fd[fileno] - if fileno == primary_fd: - primary_fd = None - - for fileno in rlist: - line = streams_by_fd[fileno].readline() - if line: - self._output_stream.write(line) - else: - del streams_by_fd[fileno] - if fileno == primary_fd: - primary_fd = None - - # Flush the streams by executing nonblocking reads from the input file - # descriptors until no more data is available, or all the streams are - # closed. - while streams_by_fd: - rlist, _, _ = select.select(streams_by_fd, [], [], 0) - - if not rlist: - break - - for fileno in rlist: - line = streams_by_fd[fileno].readline() - if line: - self._output_stream.write(line) - else: - del streams_by_fd[fileno] - - -def _GetComponentUri(package_name): - return 'fuchsia-pkg://fuchsia.com/%s#meta/%s.cm' % (package_name, - package_name) - - -def _DrainStreamToStdout(stream, quit_event): - """Outputs the contents of |stream| until |quit_event| is set.""" - - while not quit_event.is_set(): - rlist, _, _ = select.select([stream], [], [], 0.1) - if rlist: - line = rlist[0].readline() - if not line: - return - print(line.rstrip()) - - -def _SymbolizeStream(input_fd, ids_txt_files): - """Returns a Popen object for a symbolizer process invocation. - input_fd: The data to symbolize. - ids_txt_files: A list of ids.txt files which contain symbol data.""" - - return RunSymbolizer(input_fd, subprocess.PIPE, ids_txt_files) - - -def RunTestPackage(target, ffx_session, package_paths, package_name, - package_args): - """Installs the Fuchsia package at |package_path| on the target, - executes it with |package_args|, and symbolizes its output. - - target: The deployment Target object that will run the package. - ffx_session: An FfxSession object. - package_paths: The paths to the .far packages to be installed. - package_name: The name of the primary package to run. - package_args: The arguments which will be passed to the Fuchsia process. - - Returns the exit code of the remote package process.""" - - assert ffx_session - kernel_logger = _AttachKernelLogReader(target) - try: - # Spin up a thread to asynchronously dump the system log to stdout - # for easier diagnoses of early, pre-execution failures. - log_output_quit_event = multiprocessing.Event() - log_output_thread = threading.Thread(target=lambda: _DrainStreamToStdout( - kernel_logger.stdout, log_output_quit_event)) - log_output_thread.daemon = True - log_output_thread.start() - - with ExitOnSigTerm(), target.GetPkgRepo(): - on_target = True - start_time = time.time() - target.InstallPackage(package_paths) - logging.info('Test installed in {:.2f} seconds.'.format(time.time() - - start_time)) - - log_output_quit_event.set() - log_output_thread.join(timeout=_JOIN_TIMEOUT_SECS) - - logging.info('Running application.') - - component_uri = _GetComponentUri(package_name) - process = ffx_session.test_run(target.GetFfxTarget(), component_uri, - package_args) - - # Symbolize klog and systemlog as separate streams. The symbolizer - # protocol is stateful, so comingled raw stack dumps can yield - # unsymbolizable garbage data. - ids_txt_paths = BuildIdsPaths(package_paths) - with _SymbolizeStream(process.stdout, ids_txt_paths) as \ - symbolized_stdout, \ - _SymbolizeStream(kernel_logger.stdout, ids_txt_paths) as \ - symbolized_klog: - output_stream = MergedInputStream([symbolized_stdout.stdout, - symbolized_klog.stdout]).Start() - for next_line in output_stream: - print(next_line.rstrip()) - symbolized_stdout.wait() # Should return instantly. - symbolized_klog.kill() # klog is never-ending and must be killed. - - process.wait() - if process.returncode == 0: - logging.info('Process exited normally with status code 0.') - else: - # The test runner returns an error status code if *any* tests fail, - # so we should proceed anyway. - logging.warning('Process exited with status code %d.' % - process.returncode) - - finally: - logging.info('Terminating kernel log reader.') - log_output_quit_event.set() - log_output_thread.join() - kernel_logger.kill() - - return process.returncode diff --git a/build/fuchsia/runner_exceptions.py b/build/fuchsia/runner_exceptions.py deleted file mode 100644 index ca465c4..0000000 --- a/build/fuchsia/runner_exceptions.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2020 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Converts exceptions to return codes and prints error messages. - -This makes it easier to query build tables for particular error types as -exit codes are visible to queries while exception stack traces are not.""" - -import errno -import fcntl -import logging -import os -import subprocess -import sys -import traceback - -from device_target import ProvisionDeviceException -from target import FuchsiaTargetException - -def _PrintException(value, trace): - """Prints stack trace and error message for the current exception.""" - - traceback.print_tb(trace) - print(str(value)) - - -def IsStdoutBlocking(): - """Returns True if sys.stdout is blocking or False if non-blocking. - - sys.stdout should always be blocking. Non-blocking is associated with - intermittent IOErrors (crbug.com/1080858). - """ - - nonblocking = fcntl.fcntl(sys.stdout, fcntl.F_GETFL) & os.O_NONBLOCK - return not nonblocking - - -def HandleExceptionAndReturnExitCode(): - """Maps the current exception to a return code and prints error messages. - - Mapped exception types are assigned blocks of 8 return codes starting at 64. - The choice of 64 as the starting code is based on the Advanced Bash-Scripting - Guide (http://tldp.org/LDP/abs/html/exitcodes.html). - - A generic exception is mapped to the start of the block. More specific - exceptions are mapped to numbers inside the block. For example, a - FuchsiaTargetException is mapped to return code 64, unless it involves SSH - in which case it is mapped to return code 65. - - Exceptions not specifically mapped go to return code 1. - - Returns the mapped return code.""" - - (type, value, trace) = sys.exc_info() - _PrintException(value, trace) - - if type is FuchsiaTargetException: - if 'ssh' in str(value).lower(): - print('Error: FuchsiaTargetException: SSH to Fuchsia target failed.') - return 65 - return 64 - elif type is IOError: - if value.errno == errno.EAGAIN: - logging.info('Python print to sys.stdout probably failed') - if not IsStdoutBlocking(): - logging.warn('sys.stdout is non-blocking') - return 73 - return 72 - elif type is subprocess.CalledProcessError: - if os.path.basename(value.cmd[0]) == 'scp': - print('Error: scp operation failed - %s' % str(value)) - return 81 - if os.path.basename(value.cmd[0]) == 'qemu-img': - print('Error: qemu-img fuchsia image generation failed.') - return 82 - return 80 - elif type is ProvisionDeviceException: - print('Error: Failed to pave device') - return 90 - else: - return 1 diff --git a/build/fuchsia/symbolizer.py b/build/fuchsia/symbolizer.py deleted file mode 100644 index aea5377..0000000 --- a/build/fuchsia/symbolizer.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import logging -import os -import subprocess - -from common import SDK_ROOT -from common import GetHostArchFromPlatform -from common import GetHostToolPathFromPlatform - - -def BuildIdsPaths(package_paths): - """Generates build ids paths for symbolizer processes.""" - - return [ - os.path.join(os.path.dirname(package_path), 'ids.txt') - for package_path in package_paths - ] - - -def RunSymbolizer(input_fd, output_fd, ids_txt_paths): - """Starts a symbolizer process. - - input_fd: Input file to be symbolized. - output_fd: Output file for symbolizer stdout and stderr. - ids_txt_paths: Path to the ids.txt files which map build IDs to - unstripped binaries on the filesystem. - Returns a Popen object for the started process.""" - - symbolizer = GetHostToolPathFromPlatform('symbolizer') - symbolizer_cmd = [ - symbolizer, '--omit-module-lines', '--build-id-dir', - os.path.join(SDK_ROOT, '.build-id') - ] - for ids_txt in ids_txt_paths: - symbolizer_cmd.extend(['--ids-txt', ids_txt]) - - logging.debug('Running "%s".' % ' '.join(symbolizer_cmd)) - return subprocess.Popen(symbolizer_cmd, - stdin=input_fd, - stdout=output_fd, - stderr=subprocess.STDOUT, - close_fds=True) diff --git a/build/fuchsia/target.py b/build/fuchsia/target.py deleted file mode 100644 index bf09a74..0000000 --- a/build/fuchsia/target.py +++ /dev/null @@ -1,339 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import json -import logging -import os -import subprocess -import time - -import common -import ffx_session -import remote_cmd - -from log_manager import LogManager -from symbolizer import BuildIdsPaths, RunSymbolizer - - -_SHUTDOWN_CMD = ['dm', 'poweroff'] -_ATTACH_RETRY_INTERVAL = 1 - -# Amount of time to wait for a complete package installation, as a -# mitigation against hangs due to pkg/network-related failures. -_INSTALL_TIMEOUT_SECS = 10 * 60 - - -def _GetPackageUri(package_name): - """Returns the URI for the specified package name.""" - return 'fuchsia-pkg://fuchsia.com/%s' % (package_name) - - -def _GetPackageInfo(package_path): - """Returns a tuple with the name and version of a package.""" - - # Query the metadata file which resides next to the package file. - package_info = json.load( - open(os.path.join(os.path.dirname(package_path), 'package'))) - return package_info['name'], package_info['version'], - - -class _MapIsolatedPathsForPackage: - """Callable object which remaps /data and /tmp paths to their component- - specific locations, based on the package name and test realm path.""" - - def __init__(self, package_name, package_version, realms): - realms_path_fragment = '/r/'.join(['r/sys'] + realms) - package_sub_path = '{2}/fuchsia.com:{0}:{1}#meta:{0}.cmx/'.format( - package_name, package_version, realms_path_fragment) - self.isolated_format = '{0}' + package_sub_path + '{1}' - - def __call__(self, path): - for isolated_directory in ['/data/' , '/tmp/']: - if (path+'/').startswith(isolated_directory): - return self.isolated_format.format(isolated_directory, - path[len(isolated_directory):]) - return path - - -class FuchsiaTargetException(Exception): - def __init__(self, message): - super(FuchsiaTargetException, self).__init__(message) - - -# TODO(crbug.com/1250803): Factor high level commands out of target. -class Target(object): - """Base class representing a Fuchsia deployment target.""" - - def __init__(self, out_dir, target_cpu, logs_dir): - self._out_dir = out_dir - self._target_cpu = target_cpu - self._command_runner = None - self._symbolizer_proc = None - self._log_listener_proc = None - self._dry_run = False - self._started = False - self._log_manager = LogManager(logs_dir) - self._ffx_runner = ffx_session.FfxRunner(self._log_manager) - - @staticmethod - def CreateFromArgs(args): - raise NotImplementedError() - - @staticmethod - def RegisterArgs(arg_parser): - pass - - # Functions used by the Python context manager for teardown. - def __enter__(self): - return self - def __exit__(self, exc_type, exc_val, exc_tb): - try: - self.Stop() - finally: - # Stop the ffx daemon, since the target device is going / has gone away. - # This ensures that the daemon does not become "hung" if the target device - # stops responding to network I/O (e.g., due to emulator instance - # teardown). The daemon will be automatically restarted by the next `ffx` - # call. - self._ffx_runner.daemon_stop() - # Stop the log manager only after the last use of _ffx_runner. - self._log_manager.Stop() - - def Start(self): - """Handles the instantiation and connection process for the Fuchsia - target instance.""" - raise NotImplementedError() - - def IsStarted(self): - """Returns True if the Fuchsia target instance is ready to accept - commands.""" - return self._started - - def GetFfxTarget(self): - """Returns the FfxTarget instance to use to interact with this target.""" - raise NotImplementedError() - - def Stop(self): - """Stop all subprocesses and close log streams.""" - if self._symbolizer_proc: - self._symbolizer_proc.kill() - if self._log_listener_proc: - self._log_listener_proc.kill() - - def IsNewInstance(self): - """Returns True if the connected target instance is newly provisioned.""" - return True - - def GetCommandRunner(self): - """Returns CommandRunner that can be used to execute commands on the - target. Most clients should prefer RunCommandPiped() and RunCommand().""" - self._AssertIsStarted() - - if self._command_runner is None: - host, port = self._GetEndpoint() - self._command_runner = \ - remote_cmd.CommandRunner(self._GetSshConfigPath(), host, port) - - return self._command_runner - - def StartSystemLog(self, package_paths): - """Start a system log reader as a long-running SSH task.""" - system_log = self._log_manager.Open('system_log') - if package_paths: - self._log_listener_proc = self.RunCommandPiped(['log_listener'], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - self._symbolizer_proc = RunSymbolizer(self._log_listener_proc.stdout, - system_log, - BuildIdsPaths(package_paths)) - else: - self._log_listener_proc = self.RunCommandPiped(['log_listener'], - stdout=system_log, - stderr=subprocess.STDOUT) - - def RunCommandPiped(self, command, **kwargs): - """Starts a remote command and immediately returns a Popen object for the - command. The caller may interact with the streams, inspect the status code, - wait on command termination, etc. - - command: A list of strings representing the command and arguments. - kwargs: A dictionary of parameters to be passed to subprocess.Popen(). - The parameters can be used to override stdin and stdout, for - example. - - Returns: a Popen object. - - Note: method does not block. - """ - logging.debug('running (non-blocking) \'%s\'.', ' '.join(command)) - return self.GetCommandRunner().RunCommandPiped(command, **kwargs) - - def RunCommand(self, command, silent=False, timeout_secs=None): - """Executes a remote command and waits for it to finish executing. - - Returns the exit code of the command. - """ - return self.GetCommandRunner().RunCommand(command, silent, timeout_secs) - - def EnsureIsolatedPathsExist(self, for_package, for_realms): - """Ensures that the package's isolated /data and /tmp exist.""" - for isolated_directory in ['/data', '/tmp']: - self.RunCommand([ - 'mkdir', '-p', - _MapIsolatedPathsForPackage(for_package, 0, - for_realms)(isolated_directory) - ]) - - def GetFile(self, - source, - dest, - for_package=None, - for_realms=(), - recursive=False): - """Copies a file from the target filesystem to the local filesystem. - - source: The path of the file being copied. - dest: The path on the local filesystem which will be copied to. - for_package: If specified, /data in paths in |sources| is mapped to the - package's isolated /data location. - for_realms: If specified, identifies the sub-realm of 'sys' under which - isolated paths (see |for_package|) are stored. - recursive: If true, performs a recursive copy. - """ - assert type(source) is str - self.GetFiles([source], dest, for_package, for_realms, recursive) - - def GetFiles(self, - sources, - dest, - for_package=None, - for_realms=(), - recursive=False): - """Copies files from the target filesystem to the local filesystem. - - sources: List of remote file paths to copy. - dest: The path on the local filesystem which will be copied to. - for_package: If specified, /data in paths in |sources| is mapped to the - package's isolated /data location. - for_realms: If specified, identifies the sub-realm of 'sys' under which - isolated paths (see |for_package|) are stored. - recursive: If true, performs a recursive copy. - """ - assert type(sources) is tuple or type(sources) is list - self._AssertIsStarted() - if for_package: - sources = map(_MapIsolatedPathsForPackage(for_package, 0, for_realms), - sources) - logging.debug('copy remote:%s => local:%s', sources, dest) - return self.GetCommandRunner().RunScp(sources, dest, - remote_cmd.COPY_FROM_TARGET, - recursive) - - def GetFileAsString(self, source): - """Reads a file on the device and returns it as a string. - - source: The remote file path to read. - """ - cat_proc = self.RunCommandPiped(['cat', source], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - stdout, _ = cat_proc.communicate() - if cat_proc.returncode != 0: - raise Exception('Could not read file %s on device.', source) - return stdout.decode('utf-8') - - def _GetEndpoint(self): - """Returns a (host, port) tuple for the SSH connection to the target.""" - raise NotImplementedError() - - def _GetTargetSdkArch(self): - """Returns the Fuchsia SDK architecture name for the target CPU.""" - if self._target_cpu == 'arm64' or self._target_cpu == 'x64': - return self._target_cpu - raise FuchsiaTargetException('Unknown target_cpu:' + self._target_cpu) - - def _AssertIsStarted(self): - assert self.IsStarted() - - def _ConnectToTarget(self): - logging.info('Connecting to Fuchsia using SSH.') - - host, port = self._GetEndpoint() - end_time = time.time() + common.ATTACH_RETRY_SECONDS - ssh_diagnostic_log = self._log_manager.Open('ssh_diagnostic_log') - while time.time() < end_time: - runner = remote_cmd.CommandRunner(self._GetSshConfigPath(), host, port) - ssh_proc = runner.RunCommandPiped(['true'], - ssh_args=['-v'], - stdout=ssh_diagnostic_log, - stderr=subprocess.STDOUT) - if ssh_proc.wait() == 0: - logging.info('Connected!') - self._started = True - self._command_runner = runner - return True - time.sleep(_ATTACH_RETRY_INTERVAL) - - logging.error('Timeout limit reached.') - - raise FuchsiaTargetException('Couldn\'t connect using SSH.') - - def _DisconnectFromTarget(self): - pass - - def _GetSshConfigPath(self, path): - raise NotImplementedError() - - def GetPkgRepo(self): - """Returns an PkgRepo instance which serves packages for this Target. - Callers should typically call GetPkgRepo() in a |with| statement, and - install and execute commands inside the |with| block, so that the returned - PkgRepo can teardown correctly, if necessary. - """ - raise NotImplementedError() - - def InstallPackage(self, package_paths): - """Installs a package and it's dependencies on the device. If the package is - already installed then it will be updated to the new version. - - package_paths: Paths to the .far files to install. - """ - with self.GetPkgRepo() as pkg_repo: - # Publish all packages to the serving TUF repository under |tuf_root|. - for package_path in package_paths: - pkg_repo.PublishPackage(package_path) - - # Resolve all packages, to have them pulled into the device/VM cache. - for package_path in package_paths: - package_name, package_version = _GetPackageInfo(package_path) - logging.info('Installing %s...', package_name) - return_code = self.RunCommand( - ['pkgctl', 'resolve', - _GetPackageUri(package_name)], - timeout_secs=_INSTALL_TIMEOUT_SECS) - if return_code != 0: - raise Exception( - 'Error {} while resolving {}.'.format(return_code, package_name)) - - # Verify that the newly resolved versions of packages are reported. - for package_path in package_paths: - # Use pkgctl get-hash to determine which version will be resolved. - package_name, package_version = _GetPackageInfo(package_path) - pkgctl = self.RunCommandPiped( - ['pkgctl', 'get-hash', - _GetPackageUri(package_name)], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - pkgctl_out, pkgctl_err = pkgctl.communicate() - pkgctl_out = pkgctl_out.strip() - - # Read the expected version from the meta.far Merkel hash file alongside - # the package's FAR. - meta_far_path = os.path.join(os.path.dirname(package_path), 'meta.far') - meta_far_merkle = subprocess.check_output( - [common.GetHostToolPathFromPlatform('merkleroot'), - meta_far_path]).split()[0] - if pkgctl_out != meta_far_merkle: - raise Exception('Hash mismatch for %s after resolve (%s vs %s).' % - (package_name, pkgctl_out, meta_far_merkle)) diff --git a/build/fuchsia/test/OWNERS b/build/fuchsia/test/OWNERS deleted file mode 100644 index 97ae20b..0000000 --- a/build/fuchsia/test/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -chonggu@google.com -grt@chromium.org -kmarshall@chromium.org \ No newline at end of file diff --git a/build/fuchsia/test/PRESUBMIT.py b/build/fuchsia/test/PRESUBMIT.py index 9047d2d..076d1b0 100644 --- a/build/fuchsia/test/PRESUBMIT.py +++ b/build/fuchsia/test/PRESUBMIT.py @@ -7,12 +7,15 @@ for more details about the presubmit API built into depot_tools. """ -USE_PYTHON3 = True _EXTRA_PATHS_COMPONENTS = [('testing', )] # pylint: disable=invalid-name,missing-function-docstring def CommonChecks(input_api, output_api): + # Neither running nor linting Fuchsia tests is supported on Windows. + if input_api.is_windows: + return [] + tests = [] chromium_src_path = input_api.os_path.realpath( diff --git a/build/fuchsia/test/base_ermine_ctl.py b/build/fuchsia/test/base_ermine_ctl.py deleted file mode 100644 index c751986..0000000 --- a/build/fuchsia/test/base_ermine_ctl.py +++ /dev/null @@ -1,201 +0,0 @@ -# Copyright 2022 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Adds python interface to erminectl tools on workstation products.""" - -import logging -import subprocess -import time -from typing import List, Tuple - - -class BaseErmineCtl: - """Compatible class for automating control of Ermine and its OOBE. - - Must be used after checking if the tool exists. - - Usage: - ctl = base_ermine_ctl.BaseErmineCtl(some_target) - if ctl.exists: - ctl.take_to_shell() - - logging.info('In the shell') - else: - logging.info('Tool does not exist!') - - This is only necessary after a target reboot or provision (IE pave). - """ - - _OOBE_PASSWORD = 'workstation_test_password' - _TOOL = 'erminectl' - _OOBE_SUBTOOL = 'oobe' - _MAX_STATE_TRANSITIONS = 5 - - # Mapping between the current state and the next command to run - # to move it to the next state. - _STATE_TO_NEXT = { - 'SetPassword': ['set_password', _OOBE_PASSWORD], - 'Unknown': ['skip'], - 'Shell': [], - 'Login': ['login', _OOBE_PASSWORD], - } - _COMPLETE_STATE = 'Shell' - - _READY_TIMEOUT = 10 - _WAIT_ATTEMPTS = 10 - _WAIT_FOR_READY_SLEEP_SEC = 3 - - def __init__(self): - self._ermine_exists = False - self._ermine_exists_check = False - - # pylint: disable=no-self-use - # Overridable method to determine how command gets executed. - def execute_command_async(self, args: List[str]) -> subprocess.Popen: - """Executes command asynchronously, returning immediately.""" - raise NotImplementedError - - # pylint: enable=no-self-use - - @property - def exists(self) -> bool: - """Returns the existence of the tool. - - Checks whether the tool exists on and caches the result. - - Returns: - True if the tool exists, False if not. - """ - if not self._ermine_exists_check: - self._ermine_exists = self._execute_tool(['--help'], - can_fail=True) == 0 - self._ermine_exists_check = True - logging.debug('erminectl exists: %s', - ('true' if self._ermine_exists else 'false')) - return self._ermine_exists - - @property - def status(self) -> Tuple[int, str]: - """Returns the status of ermine. - - Note that if the tool times out or does not exist, a non-zero code - is returned. - - Returns: - Tuple of (return code, status as string). -1 for timeout. - Raises: - AssertionError: if the tool does not exist. - """ - assert self.exists, (f'Tool {self._TOOL} cannot have a status if' - ' it does not exist') - # Executes base command, which returns status. - proc = self._execute_tool_async([]) - try: - proc.wait(timeout=self._READY_TIMEOUT) - except subprocess.TimeoutExpired: - logging.warning('Timed out waiting for status') - return -1, 'Timeout' - stdout, _ = proc.communicate() - return proc.returncode, stdout.strip() - - @property - def ready(self) -> bool: - """Indicates if the tool is ready for regular use. - - Returns: - False if not ready, and True if ready. - Raises: - AssertionError: if the tool does not exist. - """ - assert self.exists, (f'Tool {self._TOOL} cannot be ready if' - ' it does not exist') - return_code, _ = self.status - return return_code == 0 - - def _execute_tool_async(self, command: List[str]) -> subprocess.Popen: - """Executes a sub-command asynchronously. - - Args: - command: list of strings to compose the command. Forwards to the - command runner. - Returns: - Popen of the subprocess. - """ - full_command = [self._TOOL, self._OOBE_SUBTOOL] - full_command.extend(command) - - # Returns immediately with Popen. - return self.execute_command_async(full_command) - - def _execute_tool(self, command: List[str], can_fail: bool = False) -> int: - """Executes a sub-command of the tool synchronously. - Raises exception if non-zero returncode is given and |can_fail| = False. - - Args: - command: list of strings to compose the command. Forwards to the - command runner. - can_fail: Whether or not the command can fail. - Raises: - RuntimeError: if non-zero returncode is returned and can_fail = - False. - Returns: - Return code of command execution if |can_fail| is True. - """ - proc = self._execute_tool_async(command) - stdout, stderr = proc.communicate() - if not can_fail and proc.returncode != 0: - raise RuntimeError(f'Command {" ".join(command)} failed.' - f'\nSTDOUT: {stdout}\nSTDERR: {stderr}') - return proc.returncode - - def wait_until_ready(self) -> None: - """Waits until the tool is ready through sleep-poll. - - The tool may not be ready after a pave or restart. - This checks the status and exits after its ready or Timeout. - - Raises: - TimeoutError: if tool is not ready after certain amount of attempts. - AssertionError: if tool does not exist. - """ - assert self.exists, f'Tool {self._TOOL} must exist to use it.' - for _ in range(self._WAIT_ATTEMPTS): - if self.ready: - return - time.sleep(self._WAIT_FOR_READY_SLEEP_SEC) - raise TimeoutError('Timed out waiting for a valid status to return') - - def take_to_shell(self) -> None: - """Takes device to shell after waiting for tool to be ready. - - Examines the current state of the device after waiting for it to be - ready. Once ready, goes through the states of logging in. This is: - - CreatePassword -> Skip screen -> Shell - - Login -> Shell - - Shell - - Regardless of starting state, this will exit once the shell state is - reached. - - Raises: - NotImplementedError: if an unknown state is reached. - RuntimeError: If number of state transitions exceeds the max number - that is expected. - """ - self.wait_until_ready() - _, state = self.status - max_states = self._MAX_STATE_TRANSITIONS - while state != self._COMPLETE_STATE and max_states: - max_states -= 1 - command = self._STATE_TO_NEXT.get(state) - logging.debug('Ermine state is: %s', state) - if command is None: - raise NotImplementedError('Encountered invalid state: %s' % - state) - self._execute_tool(command) - _, state = self.status - - if not max_states: - raise RuntimeError('Did not transition to shell in %d attempts.' - ' Please file a bug.' % - self._MAX_STATE_TRANSITIONS) diff --git a/build/fuchsia/test/base_ermine_ctl_unittests.py b/build/fuchsia/test/base_ermine_ctl_unittests.py deleted file mode 100755 index c0d72fe..0000000 --- a/build/fuchsia/test/base_ermine_ctl_unittests.py +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/env vpython3 -# Copyright 2022 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Tests scenarios for ermine_ctl""" -import logging -import subprocess -import time -import unittest -import unittest.mock as mock - -from base_ermine_ctl import BaseErmineCtl - - -class BaseBaseErmineCtlTest(unittest.TestCase): - """Unit tests for BaseBaseErmineCtl interface.""" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.ermine_ctl = BaseErmineCtl() - - def _set_mock_proc(self, return_value: int): - """Set |execute_command_async|'s return value to a mocked subprocess.""" - self.ermine_ctl.execute_command_async = mock.MagicMock() - mock_proc = mock.create_autospec(subprocess.Popen, instance=True) - mock_proc.communicate.return_value = 'foo', 'stderr' - mock_proc.returncode = return_value - self.ermine_ctl.execute_command_async.return_value = mock_proc - - return mock_proc - - def test_check_exists(self): - """Test |exists| returns True if tool command succeeds (returns 0).""" - self._set_mock_proc(return_value=0) - - self.assertTrue(self.ermine_ctl.exists) - - # Modifying this will not result in a change in state due to caching. - self._set_mock_proc(return_value=42) - self.assertTrue(self.ermine_ctl.exists) - - def test_does_not_exist(self): - """Test |exists| returns False if tool command fails (returns != 0).""" - self._set_mock_proc(return_value=42) - - self.assertFalse(self.ermine_ctl.exists) - - def test_ready_raises_assertion_error_if_not_exist(self): - """Test |ready| raises AssertionError if tool does not exist.""" - self._set_mock_proc(return_value=42) - self.assertRaises(AssertionError, getattr, self.ermine_ctl, 'ready') - - def test_ready_returns_false_if_bad_status(self): - """Test |ready| return False if tool has a bad status.""" - with mock.patch.object( - BaseErmineCtl, 'status', - new_callable=mock.PropertyMock) as mock_status, \ - mock.patch.object(BaseErmineCtl, 'exists', - new_callable=mock.PropertyMock) as mock_exists: - mock_exists.return_value = True - mock_status.return_value = (1, 'FakeStatus') - self.assertFalse(self.ermine_ctl.ready) - - def test_ready_returns_true(self): - """Test |ready| return True if tool returns good status (rc = 0).""" - with mock.patch.object( - BaseErmineCtl, 'status', - new_callable=mock.PropertyMock) as mock_status, \ - mock.patch.object(BaseErmineCtl, 'exists', - new_callable=mock.PropertyMock) as mock_exists: - mock_exists.return_value = True - mock_status.return_value = (0, 'FakeStatus') - self.assertTrue(self.ermine_ctl.ready) - - def test_status_raises_assertion_error_if_dne(self): - """Test |status| returns |InvalidState| if tool does not exist.""" - with mock.patch.object(BaseErmineCtl, - 'exists', - new_callable=mock.PropertyMock) as mock_exists: - mock_exists.return_value = False - - self.assertRaises(AssertionError, getattr, self.ermine_ctl, - 'status') - - def test_status_returns_rc_and_stdout(self): - """Test |status| returns subprocess stdout and rc if tool exists.""" - with mock.patch.object(BaseErmineCtl, - 'exists', - new_callable=mock.PropertyMock) as _: - self._set_mock_proc(return_value=10) - - self.assertEqual(self.ermine_ctl.status, (10, 'foo')) - - def test_status_returns_timeout_state(self): - """Test |status| returns |Timeout| if exception is raised.""" - with mock.patch.object( - BaseErmineCtl, 'exists', new_callable=mock.PropertyMock) as _, \ - mock.patch.object(logging, 'warning') as _: - mock_proc = self._set_mock_proc(return_value=0) - mock_proc.wait.side_effect = subprocess.TimeoutExpired( - 'cmd', 'some timeout') - - self.assertEqual(self.ermine_ctl.status, (-1, 'Timeout')) - - def test_wait_until_ready_raises_assertion_error_if_tool_dne(self): - """Test |wait_until_ready| is returns false if tool does not exist.""" - with mock.patch.object(BaseErmineCtl, - 'exists', - new_callable=mock.PropertyMock) as mock_exists: - mock_exists.return_value = False - - self.assertRaises(AssertionError, self.ermine_ctl.wait_until_ready) - - def test_wait_until_ready_loops_until_ready(self): - """Test |wait_until_ready| loops until |ready| returns True.""" - with mock.patch.object(BaseErmineCtl, 'exists', - new_callable=mock.PropertyMock) as mock_exists, \ - mock.patch.object(time, 'sleep') as mock_sleep, \ - mock.patch.object(BaseErmineCtl, 'ready', - new_callable=mock.PropertyMock) as mock_ready: - mock_exists.return_value = True - mock_ready.side_effect = [False, False, False, True] - - self.ermine_ctl.wait_until_ready() - - self.assertEqual(mock_ready.call_count, 4) - self.assertEqual(mock_sleep.call_count, 3) - - def test_wait_until_ready_raises_assertion_error_if_attempts_exceeded( - self): - """Test |wait_until_ready| loops if |ready| is not True n attempts.""" - with mock.patch.object(BaseErmineCtl, 'exists', - new_callable=mock.PropertyMock) as mock_exists, \ - mock.patch.object(time, 'sleep') as mock_sleep, \ - mock.patch.object(BaseErmineCtl, 'ready', - new_callable=mock.PropertyMock) as mock_ready: - mock_exists.return_value = True - mock_ready.side_effect = [False] * 15 + [True] - - self.assertRaises(TimeoutError, self.ermine_ctl.wait_until_ready) - - self.assertEqual(mock_ready.call_count, 10) - self.assertEqual(mock_sleep.call_count, 10) - - def test_take_to_shell_raises_assertion_error_if_tool_dne(self): - """Test |take_to_shell| throws AssertionError if not ready is False.""" - with mock.patch.object(BaseErmineCtl, - 'exists', - new_callable=mock.PropertyMock) as mock_exists: - mock_exists.return_value = False - self.assertRaises(AssertionError, self.ermine_ctl.take_to_shell) - - def test_take_to_shell_exits_on_complete_state(self): - """Test |take_to_shell| exits with no calls if in completed state.""" - with mock.patch.object(BaseErmineCtl, - 'wait_until_ready') as mock_wait_ready, \ - mock.patch.object( - BaseErmineCtl, 'status', - new_callable=mock.PropertyMock) as mock_status: - mock_proc = self._set_mock_proc(return_value=52) - mock_wait_ready.return_value = True - mock_status.return_value = (0, 'Shell') - - self.ermine_ctl.take_to_shell() - - self.assertEqual(mock_proc.call_count, 0) - - def test_take_to_shell_invalid_state_raises_not_implemented_error(self): - """Test |take_to_shell| raises exception if invalid state is returned. - """ - with mock.patch.object(BaseErmineCtl, - 'wait_until_ready') as mock_wait_ready, \ - mock.patch.object( - BaseErmineCtl, 'status', - new_callable=mock.PropertyMock) as mock_status: - mock_wait_ready.return_value = True - mock_status.return_value = (0, 'SomeUnknownState') - - self.assertRaises(NotImplementedError, - self.ermine_ctl.take_to_shell) - - def test_take_to_shell_with_max_transitions_raises_runtime_error(self): - """Test |take_to_shell| raises exception on too many transitions. - - |take_to_shell| attempts to transition from one state to another. - After 5 attempts, if this does not end in the completed state, an - Exception is thrown. - """ - with mock.patch.object(BaseErmineCtl, - 'wait_until_ready') as mock_wait_ready, \ - mock.patch.object( - BaseErmineCtl, 'status', - new_callable=mock.PropertyMock) as mock_status: - mock_wait_ready.return_value = True - # Returns too many state transitions before CompleteState. - mock_status.side_effect = [(0, 'Unknown'), - (0, 'KnownWithPassword'), - (0, 'Unknown')] * 3 + [ - (0, 'CompleteState') - ] - self.assertRaises(RuntimeError, self.ermine_ctl.take_to_shell) - - def test_take_to_shell_executes_known_commands(self): - """Test |take_to_shell| executes commands if necessary. - - Some states can only be transitioned between with specific commands. - These are executed by |take_to_shell| until the final test |Shell| is - reached. - """ - with mock.patch.object(BaseErmineCtl, - 'wait_until_ready') as mock_wait_ready, \ - mock.patch.object( - BaseErmineCtl, 'status', - new_callable=mock.PropertyMock) as mock_status: - self._set_mock_proc(return_value=0) - mock_wait_ready.return_value = True - mock_status.side_effect = [(0, 'Unknown'), (0, 'SetPassword'), - (0, 'Shell')] - - self.ermine_ctl.take_to_shell() - - self.assertEqual(self.ermine_ctl.execute_command_async.call_count, - 2) - self.ermine_ctl.execute_command_async.assert_has_calls([ - mock.call(['erminectl', 'oobe', 'skip']), - mock.call().communicate(), - mock.call([ - 'erminectl', 'oobe', 'set_password', - 'workstation_test_password' - ]), - mock.call().communicate() - ]) - - -if __name__ == '__main__': - unittest.main() diff --git a/build/fuchsia/test/boot_device.py b/build/fuchsia/test/boot_device.py new file mode 100644 index 0000000..8bebba2 --- /dev/null +++ b/build/fuchsia/test/boot_device.py @@ -0,0 +1,44 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Functionalities to reliably reboot the device.""" + +import enum + +from typing import Optional + +class BootMode(enum.Enum): + """Specifies boot mode for device.""" + REGULAR = enum.auto() + RECOVERY = enum.auto() + BOOTLOADER = enum.auto() + + +class StateTransitionError(Exception): + """Raised when target does not transition to desired state.""" + + +def boot_device(target_id: Optional[str], + mode: BootMode, + serial_num: Optional[str] = None, + must_boot: bool = False) -> None: + """Boot device into desired mode. + + Args: + target_id: Optional target_id of device. + mode: Desired boot mode. + must_boot: Forces device to boot, regardless of current state. + Raises: + StateTransitionError: When final state of device is not desired. + """ + # Avoid cycle dependency. + # This file will be replaced with serial_boot_device quite soon, later one + # should be much more reliable comparing to ffx target list and ssh. So + # changing the file structure is not necessary in the current situation. + # pylint: disable=cyclic-import, import-outside-toplevel + # pylint: disable=wrong-import-position + import serial_boot_device + if not serial_boot_device.boot_device(target_id, serial_num, mode, + must_boot): + raise StateTransitionError( + f'Could not get device to desired state {mode}.') diff --git a/build/fuchsia/test/common.py b/build/fuchsia/test/common.py index 5438244..68bd04e 100644 --- a/build/fuchsia/test/common.py +++ b/build/fuchsia/test/common.py @@ -7,31 +7,107 @@ import logging import os import re +import signal +import shutil import subprocess +import sys import time from argparse import ArgumentParser -from typing import Iterable, List, Optional +from typing import Iterable, List, Optional, Tuple from compatible_utils import get_ssh_prefix, get_host_arch -DIR_SRC_ROOT = os.path.abspath( - os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir)) + +def _find_src_root() -> str: + """Find the root of the src folder.""" + if os.environ.get('SRC_ROOT'): + return os.environ['SRC_ROOT'] + return os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, + os.pardir) + + +# The absolute path of the root folder to work on. It may not always be the +# src folder since there may not be source code at all, but it's expected to +# have folders like third_party/fuchsia-sdk in it. +DIR_SRC_ROOT = os.path.abspath(_find_src_root()) + + +def _find_fuchsia_images_root() -> str: + """Define the root of the fuchsia images.""" + if os.environ.get('FUCHSIA_IMAGES_ROOT'): + return os.environ['FUCHSIA_IMAGES_ROOT'] + return os.path.join(DIR_SRC_ROOT, 'third_party', 'fuchsia-sdk', 'images') + + +IMAGES_ROOT = os.path.abspath(_find_fuchsia_images_root()) + + +def _find_fuchsia_internal_images_root() -> str: + """Define the root of the fuchsia images.""" + if os.environ.get('FUCHSIA_INTERNAL_IMAGES_ROOT'): + return os.environ['FUCHSIA_INTERNAL_IMAGES_ROOT'] + return IMAGES_ROOT + '-internal' + + +INTERNAL_IMAGES_ROOT = os.path.abspath(_find_fuchsia_internal_images_root()) + REPO_ALIAS = 'fuchsia.com' -SDK_ROOT = os.path.join(DIR_SRC_ROOT, 'third_party', 'fuchsia-sdk', 'sdk') + + +def _find_fuchsia_sdk_root() -> str: + """Define the root of the fuchsia sdk.""" + if os.environ.get('FUCHSIA_SDK_ROOT'): + return os.environ['FUCHSIA_SDK_ROOT'] + return os.path.join(DIR_SRC_ROOT, 'third_party', 'fuchsia-sdk', 'sdk') + + +SDK_ROOT = os.path.abspath(_find_fuchsia_sdk_root()) + SDK_TOOLS_DIR = os.path.join(SDK_ROOT, 'tools', get_host_arch()) _FFX_TOOL = os.path.join(SDK_TOOLS_DIR, 'ffx') -# This global variable is used to set the environment variable -# |FFX_ISOLATE_DIR| when running ffx commands in E2E testing scripts. -_FFX_ISOLATE_DIR = None - def set_ffx_isolate_dir(isolate_dir: str) -> None: - """Overwrites |_FFX_ISOLATE_DIR|.""" + """Overwrites the global environment so the following ffx calls will have + the isolate dir being carried.""" + + os.environ['FFX_ISOLATE_DIR'] = isolate_dir + + +def get_hash_from_sdk(): + """Retrieve version info from the SDK.""" + + version_file = os.path.join(SDK_ROOT, 'meta', 'manifest.json') + assert os.path.exists(version_file), \ + 'Could not detect version file. Make sure the SDK is downloaded.' + with open(version_file, 'r') as f: + return json.load(f)['id'] + + +def get_host_tool_path(tool): + """Get a tool from the SDK.""" + + return os.path.join(SDK_TOOLS_DIR, tool) + + +def get_host_os(): + """Get host operating system.""" - global _FFX_ISOLATE_DIR # pylint: disable=global-statement - _FFX_ISOLATE_DIR = isolate_dir + host_platform = sys.platform + if host_platform.startswith('linux'): + return 'linux' + if host_platform.startswith('darwin'): + return 'mac' + raise Exception('Unsupported host platform: %s' % host_platform) + + +def make_clean_directory(directory_name): + """If the directory exists, delete it and remake with no contents.""" + + if os.path.exists(directory_name): + shutil.rmtree(directory_name) + os.makedirs(directory_name) def _get_daemon_status(): @@ -42,9 +118,10 @@ def _get_daemon_status(): NotRunning to indicate if the daemon is running. """ status = json.loads( - run_ffx_command(['--machine', 'json', 'daemon', 'socket'], + run_ffx_command(cmd=('daemon', 'socket'), check=True, capture_output=True, + json_out=True, suppress_repair=True).stdout.strip()) return status.get('pid', {}).get('status', {'NotRunning': True}) @@ -53,14 +130,6 @@ def _is_daemon_running(): return 'Running' in _get_daemon_status() -def check_ssh_config_file() -> None: - """Checks for ssh keys and generates them if they are missing.""" - - script_path = os.path.join(SDK_ROOT, 'bin', 'fuchsia-common.sh') - check_cmd = ['bash', '-c', f'. {script_path}; check-fuchsia-ssh-config'] - subprocess.run(check_cmd, check=True) - - def _wait_for_daemon(start=True, timeout_seconds=100): """Waits for daemon to reach desired state in a polling loop. @@ -101,7 +170,7 @@ def _run_repair_command(output): args = match.groups()[0].split() try: - run_ffx_command(args, suppress_repair=True) + run_ffx_command(cmd=args, suppress_repair=True) # Need the daemon to be up at the end of this. _wait_for_daemon(start=True) except subprocess.CalledProcessError: @@ -109,11 +178,34 @@ def _run_repair_command(output): return True # Repair succeeded. -def run_ffx_command(cmd: Iterable[str], - target_id: Optional[str] = None, +# The following two functions are the temporary work around before +# https://fxbug.dev/92296 and https://fxbug.dev/125873 are being fixed. +def start_ffx_daemon(): + """Starts the ffx daemon by using doctor --restart-daemon since daemon start + blocks the current shell. + + Note, doctor --restart-daemon usually fails since the timeout in ffx is + short and won't be sufficient to wait for the daemon to really start. + + Also, doctor --restart-daemon always restarts the daemon, so this function + should be used with caution unless it's really needed to "restart" the + daemon by explicitly calling stop daemon first. + """ + assert not _is_daemon_running(), "Call stop_ffx_daemon first." + run_ffx_command(cmd=('doctor', '--restart-daemon'), check=False) + _wait_for_daemon(start=True) + + +def stop_ffx_daemon(): + """Stops the ffx daemon""" + run_ffx_command(cmd=('daemon', 'stop', '-t', '10000')) + _wait_for_daemon(start=False) + + +def run_ffx_command(suppress_repair: bool = False, check: bool = True, - suppress_repair: bool = False, - configs: Optional[List[str]] = None, + capture_output: Optional[bool] = None, + timeout: Optional[int] = None, **kwargs) -> subprocess.CompletedProcess: """Runs `ffx` with the given arguments, waiting for it to exit. @@ -123,51 +215,50 @@ def run_ffx_command(cmd: Iterable[str], original command is retried. This behavior can be suppressed via the `suppress_repair` argument. + ** + Except for `suppress_repair`, the arguments below are named after + |subprocess.run| arguments. They are overloaded to avoid them from being + forwarded to |subprocess.Popen|. + ** + See run_continuous_ffx_command for additional arguments. Args: - cmd: A sequence of arguments to ffx. - target_id: Whether to execute the command for a specific target. The - target_id could be in the form of a nodename or an address. - check: If True, CalledProcessError is raised if ffx returns a non-zero - exit code. suppress_repair: If True, do not attempt to find and run a repair command. - configs: A list of configs to be applied to the current command. + check: If True, CalledProcessError is raised if ffx returns a non-zero + exit code. + capture_output: Whether to capture both stdout/stderr. + timeout: Optional timeout (in seconds). Throws TimeoutError if process + does not complete in timeout period. Returns: A CompletedProcess instance Raises: CalledProcessError if |check| is true. """ - - ffx_cmd = [_FFX_TOOL] - if target_id: - ffx_cmd.extend(('--target', target_id)) - if configs: - for config in configs: - ffx_cmd.extend(('--config', config)) - ffx_cmd.extend(cmd) - env = os.environ - if _FFX_ISOLATE_DIR: - env['FFX_ISOLATE_DIR'] = _FFX_ISOLATE_DIR - + # Always capture output when: + # - Repair does not need to be suppressed + # - capture_output is Truthy + if capture_output or not suppress_repair: + kwargs['stdout'] = subprocess.PIPE + kwargs['stderr'] = subprocess.STDOUT + proc = None try: - if not suppress_repair: - # If we want to repair, we need to capture output in STDOUT and - # STDERR. This could conflict with expectations of the caller. - output_captured = kwargs.get('capture_output') or ( - kwargs.get('stdout') and kwargs.get('stderr')) - if not output_captured: - # Force output to combine into STDOUT. - kwargs['stdout'] = subprocess.PIPE - kwargs['stderr'] = subprocess.STDOUT - return subprocess.run(ffx_cmd, - check=check, - encoding='utf-8', - env=env, - **kwargs) + proc = run_continuous_ffx_command(**kwargs) + stdout, stderr = proc.communicate(input=kwargs.get('stdin'), + timeout=timeout) + completed_proc = subprocess.CompletedProcess( + args=proc.args, + returncode=proc.returncode, + stdout=stdout, + stderr=stderr) + if check: + completed_proc.check_returncode() + return completed_proc except subprocess.CalledProcessError as cpe: + if proc is None: + raise logging.error('%s %s failed with returncode %s.', os.path.relpath(_FFX_TOOL), - subprocess.list2cmdline(ffx_cmd[1:]), cpe.returncode) + subprocess.list2cmdline(proc.args[1:]), cpe.returncode) if cpe.output: logging.error('stdout of the command: %s', cpe.output) if suppress_repair or (cpe.output @@ -176,18 +267,43 @@ def run_ffx_command(cmd: Iterable[str], # If the original command failed but a repair command was found and # succeeded, try one more time with the original command. - return run_ffx_command(cmd, target_id, check, True, **kwargs) + return run_ffx_command(suppress_repair=True, + check=check, + capture_output=capture_output, + timeout=timeout, + **kwargs) def run_continuous_ffx_command(cmd: Iterable[str], target_id: Optional[str] = None, + configs: Optional[List[str]] = None, + json_out: bool = False, encoding: Optional[str] = 'utf-8', **kwargs) -> subprocess.Popen: - """Runs an ffx command asynchronously.""" + """Runs `ffx` with the given arguments, returning immediately. + + Args: + cmd: A sequence of arguments to ffx. + target_id: Whether to execute the command for a specific target. The + target_id could be in the form of a nodename or an address. + configs: A list of configs to be applied to the current command. + json_out: Have command output returned as JSON. Must be parsed by + caller. + encoding: Optional, desired encoding for output/stderr pipes. + Returns: + A subprocess.Popen instance + """ + ffx_cmd = [_FFX_TOOL] + if json_out: + ffx_cmd.extend(('--machine', 'json')) if target_id: ffx_cmd.extend(('--target', target_id)) + if configs: + for config in configs: + ffx_cmd.extend(('--config', config)) ffx_cmd.extend(cmd) + return subprocess.Popen(ffx_cmd, encoding=encoding, **kwargs) @@ -240,6 +356,9 @@ def register_log_args(parser: ArgumentParser) -> None: def get_component_uri(package: str) -> str: """Retrieve the uri for a package.""" + # If the input is a full package already, do nothing + if package.startswith('fuchsia-pkg://'): + return package return f'fuchsia-pkg://{REPO_ALIAS}/{package}#meta/{package}.cm' @@ -249,31 +368,115 @@ def resolve_packages(packages: List[str], target_id: Optional[str]) -> None: ssh_prefix = get_ssh_prefix(get_ssh_address(target_id)) subprocess.run(ssh_prefix + ['--', 'pkgctl', 'gc'], check=False) + def _retry_command(cmd: List[str], + retries: int = 2, + **kwargs) -> Optional[subprocess.CompletedProcess]: + """Helper function for retrying a subprocess.run command.""" + + for i in range(retries): + if i == retries - 1: + proc = subprocess.run(cmd, **kwargs, check=True) + return proc + proc = subprocess.run(cmd, **kwargs, check=False) + if proc.returncode == 0: + return proc + time.sleep(3) + return None + for package in packages: resolve_cmd = [ '--', 'pkgctl', 'resolve', 'fuchsia-pkg://%s/%s' % (REPO_ALIAS, package) ] - retry_command(ssh_prefix + resolve_cmd) + _retry_command(ssh_prefix + resolve_cmd) + + +def get_ssh_address(target_id: Optional[str]) -> str: + """Determines SSH address for given target.""" + return run_ffx_command(cmd=('target', 'get-ssh-address'), + target_id=target_id, + capture_output=True).stdout.strip() + + +def find_in_dir(target_name: str, parent_dir: str) -> Optional[str]: + """Finds path in SDK. + Args: + target_name: Name of target to find, as a string. + parent_dir: Directory to start search in. -def retry_command(cmd: List[str], retries: int = 2, - **kwargs) -> Optional[subprocess.CompletedProcess]: - """Helper function for retrying a subprocess.run command.""" + Returns: + Full path to the target, None if not found. + """ + # Doesn't make sense to look for a full path. Only extract the basename. + target_name = os.path.basename(target_name) + for root, dirs, _ in os.walk(parent_dir): + if target_name in dirs: + return os.path.abspath(os.path.join(root, target_name)) - for i in range(retries): - if i == retries - 1: - proc = subprocess.run(cmd, **kwargs, check=True) - return proc - proc = subprocess.run(cmd, **kwargs, check=False) - if proc.returncode == 0: - return proc - time.sleep(3) return None -def get_ssh_address(target_id: Optional[str]) -> str: - """Determines SSH address for given target.""" - return run_ffx_command(('target', 'get-ssh-address'), - target_id, - capture_output=True).stdout.strip() +def find_image_in_sdk(product_name: str) -> Optional[str]: + """Finds image dir in SDK for product given. + + Args: + product_name: Name of product's image directory to find. + + Returns: + Full path to the target, None if not found. + """ + top_image_dir = os.path.join(SDK_ROOT, os.pardir, 'images') + path = find_in_dir(product_name, parent_dir=top_image_dir) + if path: + return find_in_dir('images', parent_dir=path) + return path + + +def catch_sigterm() -> None: + """Catches the kill signal and allows the process to exit cleanly.""" + def _sigterm_handler(*_): + sys.exit(0) + + signal.signal(signal.SIGTERM, _sigterm_handler) + + +def wait_for_sigterm(extra_msg: str = '') -> None: + """ + Spin-wait for either ctrl+c or sigterm. Caller can use try-finally + statement to perform extra cleanup. + + Args: + extra_msg: The extra message to be logged. + """ + try: + while True: + # We do expect receiving either ctrl+c or sigterm, so this line + # literally means sleep forever. + time.sleep(10000) + except KeyboardInterrupt: + logging.info('Ctrl-C received; %s', extra_msg) + except SystemExit: + logging.info('SIGTERM received; %s', extra_msg) + + +def get_system_info(target: Optional[str] = None) -> Tuple[str, str]: + """Retrieves installed OS version frm device. + + Returns: + Tuple of strings, containing {product, version number), or a pair of + empty strings to indicate an error. + """ + info_cmd = run_ffx_command(cmd=('target', 'show', '--json'), + target_id=target, + capture_output=True, + check=False) + if info_cmd.returncode == 0: + info_json = json.loads(info_cmd.stdout.strip()) + for info in info_json: + if info['title'] == 'Build': + return (info['child'][1]['value'], info['child'][0]['value']) + + # If the information was not retrieved, return empty strings to indicate + # unknown system info. + return ('', '') diff --git a/build/fuchsia/test/common_unittests.py b/build/fuchsia/test/common_unittests.py new file mode 100755 index 0000000..abab1a9 --- /dev/null +++ b/build/fuchsia/test/common_unittests.py @@ -0,0 +1,62 @@ +#!/usr/bin/env vpython3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""File for testing common.py.""" + +import os +import tempfile +import unittest +import unittest.mock as mock + +import common + + +@unittest.skipIf(os.name == 'nt', 'Fuchsia tests not supported on Windows') +class CommonTest(unittest.TestCase): + """Test common.py methods.""" + def test_find_in_dir_returns_file_or_dir_if_searching(self) -> None: + """Test |find_in_dir| returns files if searching for file, or None.""" + # Make the directory structure. + with tempfile.TemporaryDirectory() as tmp_dir: + with tempfile.NamedTemporaryFile(dir=tmp_dir) as tmp_file, \ + tempfile.TemporaryDirectory(dir=tmp_dir) as inner_tmp_dir: + + # Structure is now: + # temp_dir/ + # temp_dir/inner_dir1 + # temp_dir/tempfile1 + # File is not a dir, so returns None. + self.assertIsNone( + common.find_in_dir(os.path.basename(tmp_file.name), + parent_dir=tmp_dir)) + + # Repeat for directory. + self.assertEqual( + common.find_in_dir(inner_tmp_dir, parent_dir=tmp_dir), + inner_tmp_dir) + + def test_find_image_in_sdk_searches_images_in_product_bundle(self): + """Test |find_image_in_sdk| searches for 'images' if product-bundle.""" + with tempfile.TemporaryDirectory() as tmp_dir: + os.makedirs(os.path.join(tmp_dir, 'sdk'), exist_ok=True) + os.makedirs(os.path.join(tmp_dir, 'images', 'workstation-product', + 'images'), + exist_ok=True) + with mock.patch('common.SDK_ROOT', os.path.join(tmp_dir, 'sdk')): + self.assertEqual( + common.find_image_in_sdk('workstation-product'), + os.path.join(tmp_dir, 'images', 'workstation-product', + 'images')) + + def test_images_root_should_not_end_with_path_sep(self): + """INTERNAL_IMAGES_ROOT appends -internal at the end of the IMAGES_ROOT, + so the later one should not end with a /, otherwise the folder name will + become 'images/-internal'.""" + # Avoid the logic being bypassed. + self.assertIsNone(os.environ.get('FUCHSIA_INTERNAL_IMAGES_ROOT')) + self.assertFalse(common.IMAGES_ROOT.endswith(os.path.sep)) + + +if __name__ == '__main__': + unittest.main() diff --git a/build/fuchsia/test/compatible_utils.py b/build/fuchsia/test/compatible_utils.py index a865e15..b59fbbd 100644 --- a/build/fuchsia/test/compatible_utils.py +++ b/build/fuchsia/test/compatible_utils.py @@ -3,19 +3,14 @@ # found in the LICENSE file. """Functions used in both v1 and v2 scripts.""" +import json import os import platform -import re import stat -import subprocess -from typing import Iterable, List, Optional, Tuple +from typing import Iterable, List, Tuple -# File indicating version of an image downloaded to the host -_BUILD_ARGS = "buildargs.gn" -_ARGS_FILE = 'args.gn' - _FILTER_DIR = 'testing/buildbot/filters' _SSH_KEYS = os.path.expanduser('~/.ssh/fuchsia_authorized_keys') @@ -61,40 +56,6 @@ def add_exec_to_file(file: str) -> None: os.chmod(file, file_stat.st_mode | stat.S_IXUSR) -def _add_exec_to_pave_binaries(system_image_dir: str): - """Add exec to required pave files. - - The pave files may vary depending if a product-bundle or a prebuilt images - directory is being used. - Args: - system_image_dir: string path to the directory containing the pave files. - """ - pb_files = [ - 'pave.sh', - os.path.join(f'host_{get_host_arch()}', 'bootserver') - ] - image_files = [ - 'pave.sh', - os.path.join(f'bootserver.exe.linux-{get_host_arch()}') - ] - use_pb_files = os.path.exists(os.path.join(system_image_dir, pb_files[1])) - for f in pb_files if use_pb_files else image_files: - add_exec_to_file(os.path.join(system_image_dir, f)) - - -def pave(image_dir: str, target_id: Optional[str])\ - -> subprocess.CompletedProcess: - """"Pave a device using the pave script inside |image_dir|.""" - _add_exec_to_pave_binaries(image_dir) - pave_command = [ - os.path.join(image_dir, 'pave.sh'), '--authorized-keys', - get_ssh_keys(), '-1' - ] - if target_id: - pave_command.extend(['-n', target_id]) - return subprocess.run(pave_command, check=True, text=True, timeout=300) - - def parse_host_port(host_port_pair: str) -> Tuple[str, int]: """Parses a host name or IP address and a port number from a string of any of the following forms: @@ -122,11 +83,8 @@ def get_ssh_prefix(host_port_pair: str) -> List[str]: """Get the prefix of a barebone ssh command.""" ssh_addr, ssh_port = parse_host_port(host_port_pair) - return [ - 'ssh', '-F', - os.path.expanduser('~/.fuchsia/sshconfig'), ssh_addr, '-p', - str(ssh_port) - ] + sshconfig = os.path.join(os.path.dirname(__file__), 'sshconfig') + return ['ssh', '-F', sshconfig, ssh_addr, '-p', str(ssh_port)] def install_symbols(package_paths: Iterable[str], @@ -167,99 +125,16 @@ def map_filter_file_to_package_file(filter_file: str) -> str: return '/pkg/' + filter_file[filter_file.index(_FILTER_DIR):] +# TODO(crbug.com/1496426): Rename to get_product_version. def get_sdk_hash(system_image_dir: str) -> Tuple[str, str]: """Read version of hash in pre-installed package directory. Returns: Tuple of (product, version) of image to be installed. - Raises: - VersionNotFoundError: if contents of buildargs.gn cannot be found or the - version number cannot be extracted. - """ - - # TODO(crbug.com/1261961): Stop processing buildargs.gn directly. - args_file = os.path.join(system_image_dir, _BUILD_ARGS) - if not os.path.exists(args_file): - args_file = os.path.join(system_image_dir, _ARGS_FILE) - - if not os.path.exists(args_file): - raise VersionNotFoundError( - f'Dir {system_image_dir} did not contain {_BUILD_ARGS} or ' - f'{_ARGS_FILE}') - - with open(args_file) as f: - contents = f.readlines() - if not contents: - raise VersionNotFoundError('Could not retrieve %s' % args_file) - version_key = 'build_info_version' - product_key = 'build_info_product' - info_keys = [product_key, version_key] - version_info = {} - for line in contents: - for key in info_keys: - match = re.match(r'%s = "(.*)"' % key, line) - if match: - version_info[key] = match.group(1) - if not (version_key in version_info and product_key in version_info): - raise VersionNotFoundError( - 'Could not extract version info from %s. Contents: %s' % - (args_file, contents)) - - return (version_info[product_key], version_info[version_key]) - - -def find_in_dir(target_name: str, - parent_dir: str, - search_for_dir: bool = False) -> Optional[str]: - """Finds path in SDK. - - Args: - target_name: Name of target to find, as a string. - parent_dir: Directory to start search in. - search_for_dir: boolean, whether to search for a directory or file. - - Returns: - Optional full path to the target, if found. None if not found. """ - # Doesn't make sense to look for a full path. Only extract the basename. - target_name = os.path.basename(target_name) - for root, dirs, files in os.walk(parent_dir): - # Removing these parens causes the following equivalent operation order: - # if (target_name in dirs) if search_for_dir else files, which is - # incorrect. - #pylint: disable=superfluous-parens - if target_name in (dirs if search_for_dir else files): - return os.path.abspath(os.path.join(root, target_name)) - #pylint: enable=superfluous-parens - - return None - -def find_image_in_sdk(product_name: str, product_bundle: bool, - sdk_root: str) -> Optional[str]: - """Finds image dir in SDK for product given. - - Args: - product_name: Name of product's image directory to find. - product_bundle: boolean, whether image will be in a product-bundle or not. - Product bundle images use a different directory format. - sdk_root: String path to root of SDK (third_party/fuchsia-sdk). - - Returns: - Optional full path to the target, if found. None if not found. - """ - if product_bundle: - top_image_dir = os.path.join(sdk_root, 'images') - path = find_in_dir(product_name, - parent_dir=top_image_dir, - search_for_dir=True) - return find_in_dir('images', parent_dir=path, search_for_dir=True) - - # Non-product-bundle directories take some massaging. - top_image_dir = os.path.join(sdk_root, 'images-internal') - product, board = product_name.split('.') - board_dir = find_in_dir(board, - parent_dir=top_image_dir, - search_for_dir=True) - - # The board dir IS the images dir - return find_in_dir(product, parent_dir=board_dir, search_for_dir=True) + with open(os.path.join(system_image_dir, + 'product_bundle.json')) as product: + # The product_name in the json file does not match the name of the image + # flashed to the device. + return (os.path.basename(os.path.normpath(system_image_dir)), + json.load(product)['product_version']) diff --git a/build/fuchsia/test/compatible_utils_unittests.py b/build/fuchsia/test/compatible_utils_unittests.py index e6a03cb..e06287b 100755 --- a/build/fuchsia/test/compatible_utils_unittests.py +++ b/build/fuchsia/test/compatible_utils_unittests.py @@ -5,6 +5,7 @@ """File for testing compatible_utils.py.""" import io +import json import os import stat import tempfile @@ -50,60 +51,6 @@ def test_add_exec_to_file(self) -> None: new_stat = os.stat(f.name).st_mode self.assertTrue(new_stat & stat.S_IXUSR) - # pylint: disable=no-self-use - def test_pave_adds_exec_to_binary_files(self) -> None: - """Test |pave| calls |add_exec_to_file| on necessary files.""" - with mock.patch('os.path.exists', return_value=True), \ - mock.patch('compatible_utils.add_exec_to_file') as mock_exec, \ - mock.patch('platform.machine', return_value='x86_64'), \ - mock.patch('subprocess.run'): - compatible_utils.pave('some/path/to/dir', 'some-target') - - mock_exec.assert_has_calls([ - mock.call('some/path/to/dir/pave.sh'), - mock.call('some/path/to/dir/host_x64/bootserver') - ], - any_order=True) - - def test_pave_adds_exec_to_binary_files_if_pb_set_not_found(self) -> None: - """Test |pave| calls |add_exec_to_file| on necessary files. - - Checks if current product-bundle files exist. If not, defaults to - prebuilt-images set. - """ - with mock.patch('os.path.exists', return_value=False), \ - mock.patch('compatible_utils.add_exec_to_file') as mock_exec, \ - mock.patch('platform.machine', return_value='x86_64'), \ - mock.patch('subprocess.run'): - compatible_utils.pave('some/path/to/dir', 'some-target') - - mock_exec.assert_has_calls([ - mock.call('some/path/to/dir/pave.sh'), - mock.call('some/path/to/dir/bootserver.exe.linux-x64') - ], - any_order=True) - - def test_pave_adds_target_id_if_given(self) -> None: - """Test |pave| adds target-id to the arguments.""" - with mock.patch('os.path.exists', return_value=False), \ - mock.patch('compatible_utils.add_exec_to_file'), \ - mock.patch('platform.machine', return_value='x86_64'), \ - mock.patch('compatible_utils.get_ssh_keys', - return_value='authorized-keys-file'), \ - mock.patch('subprocess.run') as mock_subproc: - mock_subproc.reset_mock() - compatible_utils.pave('some/path/to/dir', 'some-target') - - mock_subproc.assert_called_once_with([ - 'some/path/to/dir/pave.sh', '--authorized-keys', - 'authorized-keys-file', '-1', '-n', 'some-target' - ], - check=True, - text=True, - timeout=300) - - # pylint: disable=no-self-use - def test_parse_host_port_splits_address_and_strips_brackets(self) -> None: """Test |parse_host_port| splits ipv4 and ipv6 addresses correctly.""" self.assertEqual(compatible_utils.parse_host_port('hostname:55'), @@ -139,146 +86,48 @@ def test_map_filter_filter_replaces_filter_dir_with_pkg_path(self) -> None: compatible_utils.map_filter_file_to_package_file( 'foo/testing/buildbot/filters/some.filter')) - def test_get_sdk_hash_fallsback_to_args_file_if_buildargs_dne(self - ) -> None: - """Test |get_sdk_hash| checks if buildargs.gn exists. - - If it does not, fallsback to args.gn. This should raise an exception - as it does not exist. - """ - with mock.patch('os.path.exists', return_value=False) as mock_exists, \ - self.assertRaises(compatible_utils.VersionNotFoundError): - compatible_utils.get_sdk_hash('some/image/dir') - mock_exists.assert_has_calls([ - mock.call('some/image/dir/buildargs.gn'), - mock.call('some/image/dir/args.gn') - ]) - - def test_get_sdk_hash_parse_contents_of_args_file(self) -> None: - """Test |get_sdk_hash| parses buildargs contents correctly.""" - build_args_test_contents = """ -build_info_board = "chromebook-x64" -build_info_product = "workstation_eng" -build_info_version = "10.20221114.2.1" -universe_package_labels += [] -""" - with mock.patch('os.path.exists', return_value=True), \ - mock.patch('builtins.open', - return_value=io.StringIO(build_args_test_contents)): - self.assertEqual(compatible_utils.get_sdk_hash('some/dir'), - ('workstation_eng', '10.20221114.2.1')) - - def test_get_sdk_hash_raises_error_if_keys_missing(self) -> None: - """Test |get_sdk_hash| raises VersionNotFoundError if missing keys""" - build_args_test_contents = """ -import("//boards/chromebook-x64.gni") -import("//products/workstation_eng.gni") -cxx_rbe_enable = true -host_labels += [ "//bundles/infra/build" ] -universe_package_labels += [] -""" - with mock.patch('os.path.exists', return_value=True), \ - mock.patch( - 'builtins.open', - return_value=io.StringIO(build_args_test_contents)), \ - self.assertRaises(compatible_utils.VersionNotFoundError): - compatible_utils.get_sdk_hash('some/dir') - - def test_get_sdk_hash_raises_error_if_contents_empty(self) -> None: - """Test |get_sdk_hash| raises VersionNotFoundError if no contents.""" - with mock.patch('os.path.exists', return_value=True), \ - mock.patch('builtins.open', return_value=io.StringIO("")), \ - self.assertRaises(compatible_utils.VersionNotFoundError): - compatible_utils.get_sdk_hash('some/dir') - - def test_find_in_dir_returns_file_or_dir_if_searching(self) -> None: - """Test |find_in_dir| returns files if searching for file, or None.""" - # Make the directory structure. - with tempfile.TemporaryDirectory() as tmp_dir: - with tempfile.NamedTemporaryFile(dir=tmp_dir) as tmp_file, \ - tempfile.TemporaryDirectory(dir=tmp_dir) as inner_tmp_dir: - - # Structure is now: - # temp_dir/ - # temp_dir/inner_dir1 - # temp_dir/tempfile1 - self.assertEqual( - compatible_utils.find_in_dir( - os.path.basename(tmp_file.name), - parent_dir=tmp_dir, - search_for_dir=False), tmp_file.name) - # File is not a dir, so returns None. - self.assertIsNone( - compatible_utils.find_in_dir(os.path.basename( - tmp_file.name), - parent_dir=tmp_dir, - search_for_dir=True)) - - # Repeat for directory. - self.assertEqual( - compatible_utils.find_in_dir(inner_tmp_dir, - parent_dir=tmp_dir, - search_for_dir=True), - inner_tmp_dir) - self.assertIsNone( - compatible_utils.find_in_dir(inner_tmp_dir, - parent_dir=tmp_dir, - search_for_dir=False)) - with tempfile.NamedTemporaryFile( - dir=inner_tmp_dir) as inner_tmp_file: - self.assertEqual( - compatible_utils.find_in_dir( - os.path.basename(inner_tmp_file.name), - parent_dir=tmp_dir, - search_for_dir=False), inner_tmp_file.name) - self.assertEqual( - compatible_utils.find_in_dir( - os.path.basename(inner_tmp_file.name), - parent_dir=inner_tmp_dir, - search_for_dir=False), inner_tmp_file.name) - - def test_find_image_in_sdk_searches_images_in_product_bundle(self): - """Test |find_image_in_sdk| searches for 'images' if product-bundle.""" - with tempfile.TemporaryDirectory() as tmp_dir: - os.makedirs(os.path.join(tmp_dir, 'images', 'workstation-product', - 'images'), - exist_ok=True) + def test_get_sdk_hash_success(self) -> None: + """Test |get_sdk_hash| reads product_bundle.json.""" + with mock.patch('builtins.open', + return_value=io.StringIO( + json.dumps({'product_version': '12345'}))): self.assertEqual( - compatible_utils.find_image_in_sdk('workstation-product', - product_bundle=True, - sdk_root=tmp_dir), - os.path.join(tmp_dir, 'images', 'workstation-product', - 'images')) - - def test_find_image_in_sdk_searches_images_in_prebuilt(self): - """Test |find_image_in_sdk| searches dir if not product-bundle.""" - with tempfile.TemporaryDirectory() as tmp_dir: - os.makedirs(os.path.join(tmp_dir, 'images-internal', - 'chromebook-x64', 'workstation_eng'), - exist_ok=True) + compatible_utils.get_sdk_hash( + 'third_party/fuchsia-sdk/images-internal/sherlock-release/' + 'smart_display_max_eng_arrested/'), + ('smart_display_max_eng_arrested', '12345')) + + def test_get_sdk_hash_normalize_path(self) -> None: + """Test |get_sdk_hash| uses path as product.""" + with mock.patch('builtins.open', + return_value=io.StringIO( + json.dumps({'product_version': '23456'}))): self.assertEqual( - compatible_utils.find_image_in_sdk( - 'workstation_eng.chromebook-x64', - product_bundle=False, - sdk_root=tmp_dir), - os.path.join(tmp_dir, 'images-internal', 'chromebook-x64', - 'workstation_eng')) + compatible_utils.get_sdk_hash( + 'third_party/fuchsia-sdk/images-internal/sherlock-release/' + 'smart_display_max_eng_arrested'), + ('smart_display_max_eng_arrested', '23456')) - def trim_noop_prefixes(self, path): - """Helper function to trim no-op path name prefixes that are - introduced by os.path.realpath on some platforms. These break - the unit tests, but have no actual effect on behavior.""" - # These must all end in the path separator character for the - # string length computation to be correct on all platforms. - noop_prefixes = ['/private/'] - for prefix in noop_prefixes: - if path.startswith(prefix): - return path[len(prefix) - 1:] - return path + def test_get_sdk_hash_not_found(self) -> None: + """Test |get_sdk_hash| fails if the product_bundle.json does not exist. + """ + with mock.patch('builtins.open', side_effect=IOError()): + self.assertRaises(IOError, compatible_utils.get_sdk_hash, + 'some/image/dir') def test_install_symbols(self): - """Test |install_symbols|.""" + def trim_noop_prefixes(path): + """Helper function to trim no-op path name prefixes that are + introduced by os.path.realpath on some platforms. These break + the unit tests, but have no actual effect on behavior.""" + # These must all end in the path separator character for the + # string length computation to be correct on all platforms. + noop_prefixes = ['/private/'] + for prefix in noop_prefixes: + if path.startswith(prefix): + return path[len(prefix) - 1:] + return path with tempfile.TemporaryDirectory() as fuchsia_out_dir: build_id = 'test_build_id' @@ -292,7 +141,7 @@ def test_install_symbols(self): compatible_utils.install_symbols([id_path], fuchsia_out_dir) self.assertTrue(os.path.islink(symbol_file)) self.assertEqual( - self.trim_noop_prefixes(os.path.realpath(symbol_file)), + trim_noop_prefixes(os.path.realpath(symbol_file)), os.path.join(fuchsia_out_dir, binary_relpath)) new_binary_relpath = 'path/to/new/binary' @@ -301,11 +150,16 @@ def test_install_symbols(self): compatible_utils.install_symbols([id_path], fuchsia_out_dir) self.assertTrue(os.path.islink(symbol_file)) self.assertEqual( - self.trim_noop_prefixes(os.path.realpath(symbol_file)), + trim_noop_prefixes(os.path.realpath(symbol_file)), os.path.join(fuchsia_out_dir, new_binary_relpath)) finally: os.remove(id_path) + def test_ssh_keys(self): + """Ensures the get_ssh_keys won't return a None.""" + self.assertIsNotNone(compatible_utils.get_ssh_keys()) + + if __name__ == '__main__': unittest.main() diff --git a/build/fuchsia/test/coveragetest.py b/build/fuchsia/test/coveragetest.py index 11e8d11..9d45fa3 100755 --- a/build/fuchsia/test/coveragetest.py +++ b/build/fuchsia/test/coveragetest.py @@ -12,11 +12,15 @@ import coverage # pylint: disable=import-error +# The files need to have sufficient coverages. COVERED_FILES = [ 'compatible_utils.py', 'deploy_to_fuchsia.py', 'flash_device.py', 'log_manager.py', 'publish_package.py', 'serve_repo.py', 'test_server.py' ] +# The files will be tested without coverage requirements. +TESTED_FILES = ['common.py', 'ffx_emulator.py', 'serial_boot_device.py'] + def main(): """Gather coverage data, ensure included files are 100% covered.""" @@ -30,7 +34,8 @@ def main(): config_file=True) cov.start() - for file in COVERED_FILES: + for file in COVERED_FILES + TESTED_FILES: + print('Testing ' + file + ' ...') # pylint: disable=import-outside-toplevel # import tests after coverage start to also cover definition lines. module = importlib.import_module(file.replace('.py', '_unittests')) diff --git a/build/fuchsia/test/ermine_ctl.py b/build/fuchsia/test/ermine_ctl.py deleted file mode 100644 index 6625389..0000000 --- a/build/fuchsia/test/ermine_ctl.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2022 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Defines erminctl interface compatible with modern scripts.""" - -import subprocess -from typing import List - -from compatible_utils import get_ssh_prefix -from common import get_ssh_address -import base_ermine_ctl - - -class ErmineCtl(base_ermine_ctl.BaseErmineCtl): - """ErmineCtl adaptation for modern scripts.""" - - def __init__(self, target_id: str): - super().__init__() - self._ssh_prefix = get_ssh_prefix(get_ssh_address(target_id)) - - def execute_command_async(self, args: List[str]) -> subprocess.Popen: - return subprocess.Popen(self._ssh_prefix + args, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - encoding='utf-8') diff --git a/build/fuchsia/test/ffx_emulator.py b/build/fuchsia/test/ffx_emulator.py new file mode 100644 index 0000000..d07e852 --- /dev/null +++ b/build/fuchsia/test/ffx_emulator.py @@ -0,0 +1,139 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Provide helpers for running Fuchsia's `ffx emu`.""" + +import argparse +import ast +import logging +import os +import json +import random + +from contextlib import AbstractContextManager + +from common import run_ffx_command, IMAGES_ROOT, INTERNAL_IMAGES_ROOT, SDK_ROOT +from compatible_utils import get_host_arch + + +class FfxEmulator(AbstractContextManager): + """A helper for managing emulators.""" + # pylint: disable=too-many-branches + def __init__(self, args: argparse.Namespace) -> None: + if args.product: + self._product = args.product + else: + if get_host_arch() == 'x64': + self._product = 'terminal.x64' + else: + self._product = 'terminal.qemu-arm64' + + self._enable_graphics = args.enable_graphics + self._hardware_gpu = args.hardware_gpu + self._logs_dir = args.logs_dir + self._with_network = args.with_network + if args.everlasting: + # Do not change the name, it will break the logic. + # ffx has a prefix-matching logic, so 'fuchsia-emulator' is not + # usable to avoid breaking local development workflow. I.e. + # developers can create an everlasting emulator and an ephemeral one + # without interfering each other. + self._node_name = 'fuchsia-everlasting-emulator' + assert self._everlasting() + else: + self._node_name = 'fuchsia-emulator-' + str(random.randint( + 1, 9999)) + self._device_spec = args.device_spec + + def _everlasting(self) -> bool: + return self._node_name == 'fuchsia-everlasting-emulator' + + def __enter__(self) -> str: + """Start the emulator. + + Returns: + The node name of the emulator. + """ + logging.info('Starting emulator %s', self._node_name) + prod, board = self._product.split('.', 1) + image_dir = os.path.join(IMAGES_ROOT, prod, board) + if not os.path.isdir(image_dir): + image_dir = os.path.join(INTERNAL_IMAGES_ROOT, prod, board) + emu_command = ['emu', 'start', image_dir, '--name', self._node_name] + if not self._enable_graphics: + emu_command.append('-H') + if self._hardware_gpu: + emu_command.append('--gpu') + if self._logs_dir: + emu_command.extend( + ('-l', os.path.join(self._logs_dir, 'emulator_log'))) + if self._with_network: + emu_command.extend(['--net', 'tap']) + else: + emu_command.extend(['--net', 'user']) + if self._everlasting(): + emu_command.extend(['--reuse-with-check']) + if self._device_spec: + emu_command.extend(['--device', self._device_spec]) + + # TODO(https://fxbug.dev/99321): remove when ffx has native support + # for starting emulator on arm64 host. + if get_host_arch() == 'arm64': + + arm64_qemu_dir = os.path.join(SDK_ROOT, 'tools', 'arm64', + 'qemu_internal') + + # The arm64 emulator binaries are downloaded separately, so add + # a symlink to the expected location inside the SDK. + if not os.path.isdir(arm64_qemu_dir): + os.symlink( + os.path.join(SDK_ROOT, '..', '..', 'qemu-linux-arm64'), + arm64_qemu_dir) + + # Add the arm64 emulator binaries to the SDK's manifest.json file. + sdk_manifest = os.path.join(SDK_ROOT, 'meta', 'manifest.json') + with open(sdk_manifest, 'r+') as f: + data = json.load(f) + for part in data['parts']: + if part['meta'] == 'tools/x64/qemu_internal-meta.json': + part['meta'] = 'tools/arm64/qemu_internal-meta.json' + break + f.seek(0) + json.dump(data, f) + f.truncate() + + # Generate a meta file for the arm64 emulator binaries using its + # x64 counterpart. + qemu_arm64_meta_file = os.path.join(SDK_ROOT, 'tools', 'arm64', + 'qemu_internal-meta.json') + qemu_x64_meta_file = os.path.join(SDK_ROOT, 'tools', 'x64', + 'qemu_internal-meta.json') + with open(qemu_x64_meta_file) as f: + data = str(json.load(f)) + qemu_arm64_meta = data.replace(r'tools/x64', 'tools/arm64') + with open(qemu_arm64_meta_file, "w+") as f: + json.dump(ast.literal_eval(qemu_arm64_meta), f) + + # Always use qemu for arm64 images, no matter it runs on arm64 hosts or + # x64 hosts with simulation. + if self._product.endswith('arm64'): + emu_command.extend(['--engine', 'qemu']) + + run_ffx_command(cmd=emu_command, + timeout=310, + configs=['emu.start.timeout=300']) + + return self._node_name + + def __exit__(self, exc_type, exc_value, traceback) -> bool: + """Shutdown the emulator.""" + + logging.info('Stopping the emulator %s', self._node_name) + cmd = ['emu', 'stop', self._node_name] + if self._everlasting(): + cmd.extend(['--persist']) + # The emulator might have shut down unexpectedly, so this command + # might fail. + run_ffx_command(cmd=cmd, check=False) + # Do not suppress exceptions. + return False diff --git a/build/fuchsia/test/ffx_emulator_unittests.py b/build/fuchsia/test/ffx_emulator_unittests.py new file mode 100755 index 0000000..3c641ee --- /dev/null +++ b/build/fuchsia/test/ffx_emulator_unittests.py @@ -0,0 +1,105 @@ +#!/usr/bin/env vpython3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""File for testing ffx_emulator.py.""" + +import argparse +import unittest +import unittest.mock as mock + +from ffx_emulator import FfxEmulator + + +class FfxEmulatorTest(unittest.TestCase): + """Unittests for ffx_emulator.py""" + def test_use_fixed_node_name(self) -> None: + """FfxEmulator should use a fixed node name.""" + # Allowing the test case to access FfxEmulator._node_name directly. + # pylint: disable=protected-access + self.assertEqual( + FfxEmulator( + argparse.Namespace( + **{ + 'product': None, + 'enable_graphics': False, + 'hardware_gpu': False, + 'logs_dir': '.', + 'with_network': False, + 'everlasting': True, + 'device_spec': '' + }))._node_name, 'fuchsia-everlasting-emulator') + + def test_use_random_node_name(self) -> None: + """FfxEmulator should not use a fixed node name.""" + # Allowing the test case to access FfxEmulator._node_name directly. + # pylint: disable=protected-access + self.assertNotEqual( + FfxEmulator( + argparse.Namespace( + **{ + 'product': None, + 'enable_graphics': False, + 'hardware_gpu': False, + 'logs_dir': '.', + 'with_network': False, + 'everlasting': False, + 'device_spec': '' + }))._node_name, 'fuchsia-everlasting-emulator') + + @mock.patch('ffx_emulator.run_ffx_command') + def test_use_none_device_spec(self, mock_ffx) -> None: + """FfxEmulator should use the default device spec if spec is None.""" + FfxEmulator( + argparse.Namespace( + **{ + 'product': None, + 'enable_graphics': False, + 'hardware_gpu': False, + 'logs_dir': '.', + 'with_network': False, + 'everlasting': False, + 'device_spec': None + })).__enter__() + self.assertIn(' '.join(['--net', 'user']), + ' '.join(mock_ffx.call_args.kwargs['cmd'])) + self.assertNotIn('--device', mock_ffx.call_args.kwargs['cmd']) + + @mock.patch('ffx_emulator.run_ffx_command') + def test_use_empty_device_spec(self, mock_ffx) -> None: + """FfxEmulator should use the default device spec if spec is empty.""" + FfxEmulator( + argparse.Namespace( + **{ + 'product': None, + 'enable_graphics': False, + 'hardware_gpu': False, + 'logs_dir': '.', + 'with_network': False, + 'everlasting': False, + 'device_spec': '' + })).__enter__() + self.assertIn(' '.join(['--net', 'user']), + ' '.join(mock_ffx.call_args.kwargs['cmd'])) + self.assertNotIn('--device', mock_ffx.call_args.kwargs['cmd']) + + @mock.patch('ffx_emulator.run_ffx_command') + def test_use_large_device_spec(self, mock_ffx) -> None: + """FfxEmulator should use large device spec.""" + FfxEmulator( + argparse.Namespace( + **{ + 'product': None, + 'enable_graphics': False, + 'hardware_gpu': False, + 'logs_dir': '.', + 'with_network': False, + 'everlasting': False, + 'device_spec': 'large' + })).__enter__() + self.assertIn(' '.join(['--device', 'large']), + ' '.join(mock_ffx.call_args.kwargs['cmd'])) + + +if __name__ == '__main__': + unittest.main() diff --git a/build/fuchsia/test/ffx_integration.py b/build/fuchsia/test/ffx_integration.py index 2c0960e..ca7961c 100644 --- a/build/fuchsia/test/ffx_integration.py +++ b/build/fuchsia/test/ffx_integration.py @@ -3,11 +3,9 @@ # found in the LICENSE file. """Provide helpers for running Fuchsia's `ffx`.""" -import ast import logging import os import json -import random import subprocess import sys import tempfile @@ -15,11 +13,8 @@ from contextlib import AbstractContextManager from typing import IO, Iterable, List, Optional -from common import check_ssh_config_file, run_ffx_command, \ - run_continuous_ffx_command, SDK_ROOT -from compatible_utils import get_host_arch +from common import run_continuous_ffx_command, run_ffx_command, SDK_ROOT -_EMU_COMMAND_RETRIES = 3 RUN_SUMMARY_SCHEMA = \ 'https://fuchsia.dev/schema/ffx_test/run_summary-8d1dd964.json' @@ -28,7 +23,7 @@ def get_config(name: str) -> Optional[str]: """Run a ffx config get command to retrieve the config value.""" try: - return run_ffx_command(['config', 'get', name], + return run_ffx_command(cmd=['config', 'get', name], capture_output=True).stdout.strip() except subprocess.CalledProcessError as cpe: # A return code of 2 indicates no previous value set. @@ -57,161 +52,24 @@ def __enter__(self): # Cache the old value. self._old_value = get_config(self._name) if self._new_value != self._old_value: - run_ffx_command(['config', 'set', self._name, self._new_value]) + run_ffx_command(cmd=['config', 'set', self._name, self._new_value]) return self def __exit__(self, exc_type, exc_val, exc_tb) -> bool: - if self._new_value != self._old_value: - - # Allow removal of config to fail. - remove_cmd = run_ffx_command(['config', 'remove', self._name], - check=False) - if remove_cmd.returncode != 0: - logging.warning('Error when removing ffx config %s', - self._name) - - if self._old_value is not None: - # Explicitly set the value back only if removing the new value - # doesn't already restore the old value. - if self._old_value != \ - run_ffx_command(['config', 'get', self._name], - capture_output=True).stdout.strip(): - run_ffx_command( - ['config', 'set', self._name, self._old_value]) - - # Do not suppress exceptions. - return False - - -def test_connection(target_id: Optional[str]) -> None: - """Run an echo test to verify that the device can be connected to.""" - - run_ffx_command(('target', 'echo'), target_id) + if self._new_value == self._old_value: + return False + # Allow removal of config to fail. + remove_cmd = run_ffx_command(cmd=['config', 'remove', self._name], + check=False) + if remove_cmd.returncode != 0: + logging.warning('Error when removing ffx config %s', self._name) -class FfxEmulator(AbstractContextManager): - """A helper for managing emulators.""" - - def __init__(self, - enable_graphics: bool, - hardware_gpu: bool, - product_bundle: Optional[str], - with_network: bool, - logs_dir: Optional[str] = None) -> None: - if product_bundle: - self._product_bundle = product_bundle - else: - target_cpu = get_host_arch() - self._product_bundle = f'terminal.qemu-{target_cpu}' - - self._enable_graphics = enable_graphics - self._hardware_gpu = hardware_gpu - self._logs_dir = logs_dir - self._with_network = with_network - node_name_suffix = random.randint(1, 9999) - self._node_name = f'fuchsia-emulator-{node_name_suffix}' - - # Set the download path parallel to Fuchsia SDK directory - # permanently so that scripts can always find the product bundles. - run_ffx_command(('config', 'set', 'pbms.storage.path', - os.path.join(SDK_ROOT, os.pardir, 'images'))) - - override_file = os.path.join(os.path.dirname(__file__), os.pardir, - 'sdk_override.txt') - self._scoped_pb_metadata = None - if os.path.exists(override_file): - with open(override_file) as f: - pb_metadata = f.read().split('\n') - pb_metadata.append('{sdk.root}/*.json') - self._scoped_pb_metadata = ScopedFfxConfig( - 'pbms.metadata', json.dumps((pb_metadata))) - - def __enter__(self) -> str: - """Start the emulator. - - Returns: - The node name of the emulator. - """ - - if self._scoped_pb_metadata: - self._scoped_pb_metadata.__enter__() - check_ssh_config_file() - emu_command = [ - 'emu', 'start', self._product_bundle, '--name', self._node_name - ] - if not self._enable_graphics: - emu_command.append('-H') - if self._hardware_gpu: - emu_command.append('--gpu') - if self._logs_dir: - emu_command.extend( - ('-l', os.path.join(self._logs_dir, 'emulator_log'))) - if self._with_network: - emu_command.extend(('--net', 'tap')) - - # TODO(https://crbug.com/1336776): remove when ffx has native support - # for starting emulator on arm64 host. - if get_host_arch() == 'arm64': - - arm64_qemu_dir = os.path.join(SDK_ROOT, 'tools', 'arm64', - 'qemu_internal') - - # The arm64 emulator binaries are downloaded separately, so add - # a symlink to the expected location inside the SDK. - if not os.path.isdir(arm64_qemu_dir): - os.symlink( - os.path.join(SDK_ROOT, '..', '..', 'qemu-linux-arm64'), - arm64_qemu_dir) - - # Add the arm64 emulator binaries to the SDK's manifest.json file. - sdk_manifest = os.path.join(SDK_ROOT, 'meta', 'manifest.json') - with open(sdk_manifest, 'r+') as f: - data = json.load(f) - for part in data['parts']: - if part['meta'] == 'tools/x64/qemu_internal-meta.json': - part['meta'] = 'tools/arm64/qemu_internal-meta.json' - break - f.seek(0) - json.dump(data, f) - f.truncate() - - # Generate a meta file for the arm64 emulator binaries using its - # x64 counterpart. - qemu_arm64_meta_file = os.path.join(SDK_ROOT, 'tools', 'arm64', - 'qemu_internal-meta.json') - qemu_x64_meta_file = os.path.join(SDK_ROOT, 'tools', 'x64', - 'qemu_internal-meta.json') - with open(qemu_x64_meta_file) as f: - data = str(json.load(f)) - qemu_arm64_meta = data.replace(r'tools/x64', 'tools/arm64') - with open(qemu_arm64_meta_file, "w+") as f: - json.dump(ast.literal_eval(qemu_arm64_meta), f) - emu_command.extend(['--engine', 'qemu']) - - with ScopedFfxConfig('emu.start.timeout', '90'): - for _ in range(_EMU_COMMAND_RETRIES): - - # If the ffx daemon fails to establish a connection with - # the emulator after 85 seconds, that means the emulator - # failed to be brought up and a retry is needed. - # TODO(fxb/103540): Remove retry when start up issue is fixed. - try: - run_ffx_command(emu_command, timeout=85) - break - except (subprocess.TimeoutExpired, - subprocess.CalledProcessError): - run_ffx_command(('emu', 'stop')) - return self._node_name - - def __exit__(self, exc_type, exc_value, traceback) -> bool: - """Shutdown the emulator.""" - - # The emulator might have shut down unexpectedly, so this command - # might fail. - run_ffx_command(('emu', 'stop', self._node_name), check=False) - - if self._scoped_pb_metadata: - self._scoped_pb_metadata.__exit__(exc_type, exc_value, traceback) + # Explicitly set the value back only if removing the new value doesn't + # already restore the old value. + if self._old_value is not None and \ + self._old_value != get_config(self._name): + run_ffx_command(cmd=['config', 'set', self._name, self._old_value]) # Do not suppress exceptions. return False @@ -257,7 +115,8 @@ def __exit__(self, exc_type, exc_val, exc_tb) -> bool: def run_test(self, component_uri: str, test_args: Optional[Iterable[str]] = None, - node_name: Optional[str] = None) -> subprocess.Popen: + node_name: Optional[str] = None, + test_realm: Optional[str] = None) -> subprocess.Popen: """Starts a subprocess to run a test on a target. Args: component_uri: The test component URI. @@ -268,8 +127,11 @@ def run_test(self, """ command = [ 'test', 'run', '--output-directory', self._results_dir, - component_uri ] + if test_realm: + command.append("--realm") + command.append(test_realm) + command.append(component_uri) if test_args: command.append('--') command.extend(test_args) diff --git a/build/fuchsia/test/flash_device.py b/build/fuchsia/test/flash_device.py index 60e01c6..c4fd13b 100755 --- a/build/fuchsia/test/flash_device.py +++ b/build/fuchsia/test/flash_device.py @@ -5,57 +5,53 @@ """Implements commands for flashing a Fuchsia device.""" import argparse -import json import logging import os import subprocess import sys -import time from typing import Optional, Tuple -from common import check_ssh_config_file, register_device_args, \ - run_ffx_command, SDK_ROOT -from compatible_utils import get_sdk_hash, get_ssh_keys, pave, \ - running_unattended, add_exec_to_file, get_host_arch, find_image_in_sdk -from ffx_integration import ScopedFfxConfig +import common +from boot_device import BootMode, StateTransitionError, boot_device +from common import get_system_info, find_image_in_sdk, \ + register_device_args +from compatible_utils import get_sdk_hash, running_unattended +from lockfile import lock +# Flash-file lock. Used to restrict number of flash operations per host. +# File lock should be marked as stale after 15 mins. +_FF_LOCK = os.path.join('/tmp', 'flash.lock') +_FF_LOCK_STALE_SECS = 60 * 15 +_FF_LOCK_ACQ_TIMEOUT = _FF_LOCK_STALE_SECS -def _get_system_info(target: Optional[str]) -> Tuple[str, str]: + +def _get_system_info(target: Optional[str], + serial_num: Optional[str]) -> Tuple[str, str]: """Retrieves installed OS version from device. + Args: + target: Target to get system info of. + serial_num: Serial number of device to get system info of. Returns: Tuple of strings, containing (product, version number). """ - # TODO(b/242191374): Remove when devices in swarming are no longer booted - # into zedboot. if running_unattended(): - with ScopedFfxConfig('discovery.zedboot.enabled', 'true'): - run_ffx_command(('target', 'reboot'), target_id=target) - wait_cmd = run_ffx_command(('target', 'wait', '-t', '180'), - target, - check=False) - if wait_cmd.returncode != 0: + try: + boot_device(target, BootMode.REGULAR, serial_num) + except (subprocess.CalledProcessError, StateTransitionError): + logging.warning('Could not boot device. Assuming in fastboot') return ('', '') - info_cmd = run_ffx_command(('target', 'show', '--json'), - target_id=target, - capture_output=True, - check=False) - if info_cmd.returncode == 0: - info_json = json.loads(info_cmd.stdout.strip()) - for info in info_json: - if info['title'] == 'Build': - return (info['child'][1]['value'], info['child'][0]['value']) + return get_system_info(target) - # If the information was not retrieved, return empty strings to indicate - # unknown system info. - return ('', '') - -def update_required(os_check, system_image_dir: Optional[str], - target: Optional[str]) -> Tuple[bool, Optional[str]]: +def _update_required( + os_check, + system_image_dir: Optional[str], + target: Optional[str], + serial_num: Optional[str] = None) -> Tuple[bool, Optional[str]]: """Returns True if a system update is required and path to image dir.""" if os_check == 'ignore': @@ -67,92 +63,43 @@ def update_required(os_check, system_image_dir: Optional[str], 'System image directory does not exist. Assuming it\'s ' 'a product-bundle name and dynamically searching for ' 'image directory') - # SDK_ROOT points to third_party/fuchsia-sdk/sdk, but we want the root - # of the overall fuchsia-sdk package. - sdk_root_parent = os.path.split(SDK_ROOT)[0] - path = find_image_in_sdk(system_image_dir, - product_bundle=True, - sdk_root=sdk_root_parent) + path = find_image_in_sdk(system_image_dir) if not path: raise FileNotFoundError( f'System image directory {system_image_dir} could not' 'be found') system_image_dir = path if (os_check == 'check' - and get_sdk_hash(system_image_dir) == _get_system_info(target)): + and get_sdk_hash(system_image_dir) == _get_system_info( + target, serial_num)): return False, system_image_dir return True, system_image_dir -def _add_exec_to_flash_binaries(system_image_dir: str) -> None: - """Add exec to required flash files. - - The flash files may vary depending if a product-bundle or a prebuilt images - directory is being used. - Args: - system_image_dir: string path to the directory containing the flash files. - """ - pb_files = [ - 'flash.sh', - os.path.join(f'host_{get_host_arch()}', 'fastboot') - ] - image_files = ['flash.sh', f'fastboot.exe.linux-{get_host_arch()}'] - use_pb_files = os.path.exists(os.path.join(system_image_dir, pb_files[1])) - for f in pb_files if use_pb_files else image_files: - add_exec_to_file(os.path.join(system_image_dir, f)) - - def _run_flash_command(system_image_dir: str, target_id: Optional[str]): """Helper function for running `ffx target flash`.""" - - _add_exec_to_flash_binaries(system_image_dir) - # TODO(fxb/91843): Remove workaround when ffx has stable support for - # multiple hardware devices connected via USB. - if running_unattended(): - flash_cmd = [ - os.path.join(system_image_dir, 'flash.sh'), - '--ssh-key=%s' % get_ssh_keys(), - ] - if target_id: - flash_cmd.extend(('-s', target_id)) - subprocess.run(flash_cmd, check=True, timeout=240) - return - - manifest = os.path.join(system_image_dir, 'flash-manifest.manifest') - run_ffx_command(('target', 'flash', manifest, '--no-bootloader-reboot'), - target_id=target_id, - configs=[ - 'fastboot.usb.disabled=true', - 'ffx.fastboot.inline_target=true' - ]) - - -def flash(system_image_dir: str, - target: Optional[str], - serial_num: Optional[str] = None) -> None: - """Flash the device.""" - with ScopedFfxConfig('fastboot.reboot.reconnect_timeout', '120'): - if serial_num: - with ScopedFfxConfig('discovery.zedboot.enabled', 'true'): - run_ffx_command(('target', 'reboot', '-b'), - target, - check=False) - for _ in range(10): - time.sleep(10) - if run_ffx_command(('target', 'list', serial_num), - check=False).returncode == 0: - break - _run_flash_command(system_image_dir, serial_num) - else: - _run_flash_command(system_image_dir, target) - run_ffx_command(('target', 'wait'), target) + logging.info('Flashing %s to %s', system_image_dir, target_id) + # Flash only with a file lock acquired. + # This prevents multiple fastboot binaries from flashing concurrently, + # which should increase the odds of flashing success. + with lock(_FF_LOCK, timeout=_FF_LOCK_ACQ_TIMEOUT): + # The ffx.fastboot.inline_target has negative impact when ffx + # discovering devices in fastboot, so it's inlined here to limit its + # scope. See the discussion in https://fxbug.dev/issues/317228141. + logging.info( + 'Flash result %s', + common.run_ffx_command(cmd=('target', 'flash', '-b', + system_image_dir, + '--no-bootloader-reboot'), + target_id=target_id, + configs=['ffx.fastboot.inline_target=true'], + capture_output=True).stdout) def update(system_image_dir: str, os_check: str, target: Optional[str], - serial_num: Optional[str] = None, - should_pave: Optional[bool] = True) -> None: + serial_num: Optional[str] = None) -> None: """Conditionally updates target given. Args: @@ -160,39 +107,29 @@ def update(system_image_dir: str, os_check: , which decides how to update the device. target: Node-name string indicating device that should be updated. serial_num: String of serial number of device that should be updated. - should_pave: Optional bool on whether or not to pave or flash. """ - needs_update, actual_image_dir = update_required(os_check, - system_image_dir, target) - - system_image_dir = actual_image_dir - if needs_update: - check_ssh_config_file() - if should_pave: - if running_unattended(): - assert target, ('Target ID must be specified on swarming when' - ' paving.') - # TODO(crbug.com/1405525): We should check the device state - # before and after rebooting it to avoid unnecessary reboot or - # undesired state. - run_ffx_command(('target', 'reboot', '-r'), - target, - check=False) - pave(system_image_dir, target) - time.sleep(180) - else: - flash(system_image_dir, target, serial_num) + needs_update, actual_image_dir = _update_required(os_check, + system_image_dir, target, + serial_num) + logging.info('update_required %s, actual_image_dir %s', needs_update, + actual_image_dir) + if not needs_update: + return + if serial_num: + boot_device(target, BootMode.BOOTLOADER, serial_num) + _run_flash_command(system_image_dir, serial_num) + else: + _run_flash_command(system_image_dir, target) def register_update_args(arg_parser: argparse.ArgumentParser, - default_os_check: Optional[str] = 'check', - default_pave: Optional[bool] = True) -> None: + default_os_check: Optional[str] = 'check') -> None: """Register common arguments for device updating.""" serve_args = arg_parser.add_argument_group('update', 'device updating arguments') serve_args.add_argument('--system-image-dir', help='Specify the directory that contains the ' - 'Fuchsia image used to pave the device. Only ' + 'Fuchsia image used to flash the device. Only ' 'needs to be specified if "os_check" is not ' '"ignore".') serve_args.add_argument('--serial-num', @@ -209,26 +146,16 @@ def register_update_args(arg_parser: argparse.ArgumentParser, '"update", then the target device will ' 'be reflashed. If "ignore", then the OS version ' 'will not be checked.') - serve_args.add_argument('--pave', - action='store_true', - help='Performs a pave instead of a flash. ' - 'Device must already be in Zedboot') - serve_args.add_argument('--no-pave', - action='store_false', - dest='pave', - help='Performs a flash instead of a pave ' - '(experimental).') - serve_args.set_defaults(pave=default_pave) def main(): """Stand-alone function for flashing a device.""" parser = argparse.ArgumentParser() register_device_args(parser) - register_update_args(parser, default_os_check='update', default_pave=False) + register_update_args(parser, default_os_check='update') args = parser.parse_args() update(args.system_image_dir, args.os_check, args.target_id, - args.serial_num, args.pave) + args.serial_num) if __name__ == '__main__': diff --git a/build/fuchsia/test/flash_device_unittests.py b/build/fuchsia/test/flash_device_unittests.py index c11f681..df0203e 100755 --- a/build/fuchsia/test/flash_device_unittests.py +++ b/build/fuchsia/test/flash_device_unittests.py @@ -8,6 +8,7 @@ import unittest import unittest.mock as mock +import boot_device import flash_device _TEST_IMAGE_DIR = 'test/image/dir' @@ -15,6 +16,7 @@ _TEST_VERSION = 'test.version' +# pylint: disable=too-many-public-methods,protected-access class FlashDeviceTest(unittest.TestCase): """Unittests for flash_device.py.""" @@ -22,32 +24,28 @@ def setUp(self) -> None: context_mock = mock.Mock() context_mock.__enter__ = mock.Mock(return_value=None) context_mock.__exit__ = mock.Mock(return_value=None) - self._config_patcher = mock.patch('flash_device.ScopedFfxConfig', - return_value=context_mock) ffx_mock = mock.Mock() ffx_mock.returncode = 0 - self._ffx_patcher = mock.patch('flash_device.run_ffx_command', - return_value=ffx_mock) - self._sdk_hash_patcher = mock.patch('flash_device.get_sdk_hash', - return_value=(_TEST_PRODUCT, - _TEST_VERSION)) - self._swarming_patcher = mock.patch('flash_device.running_unattended', - return_value=False) - self._check_patcher = mock.patch('flash_device.check_ssh_config_file') - self._config_mock = self._config_patcher.start() - self._ffx_mock = self._ffx_patcher.start() - self._sdk_hash_mock = self._sdk_hash_patcher.start() - self._check_patcher_mock = self._check_patcher.start() - self._swarming_mock = self._swarming_patcher.start() - self.addCleanup(self._config_mock.stop) + ffx_patcher = mock.patch('common.run_ffx_command', + return_value=ffx_mock) + sdk_hash_patcher = mock.patch('flash_device.get_sdk_hash', + return_value=(_TEST_PRODUCT, + _TEST_VERSION)) + swarming_patcher = mock.patch('flash_device.running_unattended', + return_value=False) + time_sleep = mock.patch('time.sleep') + self._ffx_mock = ffx_patcher.start() + self._sdk_hash_mock = sdk_hash_patcher.start() + self._swarming_mock = swarming_patcher.start() + self._time_sleep = time_sleep.start() self.addCleanup(self._ffx_mock.stop) self.addCleanup(self._sdk_hash_mock.stop) - self.addCleanup(self._check_patcher_mock.stop) self.addCleanup(self._swarming_mock.stop) + self.addCleanup(self._time_sleep.stop) def test_update_required_on_ignore_returns_immediately(self) -> None: """Test |os_check|='ignore' skips all checks.""" - result, new_image_dir = flash_device.update_required( + result, new_image_dir = flash_device._update_required( 'ignore', 'some-image-dir', None) self.assertFalse(result) @@ -56,7 +54,7 @@ def test_update_required_on_ignore_returns_immediately(self) -> None: def test_update_required_raises_value_error_if_no_image_dir(self) -> None: """Test |os_check|!='ignore' checks that image dir is non-Falsey.""" with self.assertRaises(ValueError): - flash_device.update_required('update', None, None) + flash_device._update_required('update', None, None) def test_update_required_logs_missing_image_dir(self) -> None: """Test |os_check|!='ignore' warns if image dir does not exist.""" @@ -64,7 +62,7 @@ def test_update_required_logs_missing_image_dir(self) -> None: mock.patch('flash_device.find_image_in_sdk'), \ mock.patch('flash_device._get_system_info'), \ self.assertLogs() as logger: - flash_device.update_required('update', 'some/image/dir', None) + flash_device._update_required('update', 'some/image/dir', None) self.assertIn('image directory does not exist', logger.output[0]) def test_update_required_searches_and_returns_sdk_if_image_found(self @@ -73,26 +71,24 @@ def test_update_required_searches_and_returns_sdk_if_image_found(self with mock.patch('os.path.exists', return_value=False), \ mock.patch('flash_device.find_image_in_sdk') as mock_find, \ mock.patch('flash_device._get_system_info'), \ - mock.patch('flash_device.SDK_ROOT', 'path/to/sdk/dir'), \ + mock.patch('common.SDK_ROOT', 'path/to/sdk/dir'), \ self.assertLogs(): mock_find.return_value = 'path/to/image/dir' - update_required, new_image_dir = flash_device.update_required( - 'update', 'product-bundle', None) + update_required, new_image_dir = flash_device._update_required( + 'update', 'product-bundle', None, None) self.assertTrue(update_required) self.assertEqual(new_image_dir, 'path/to/image/dir') - mock_find.assert_called_once_with('product-bundle', - product_bundle=True, - sdk_root='path/to/sdk') + mock_find.assert_called_once_with('product-bundle') def test_update_required_raises_file_not_found_error(self) -> None: """Test |os_check|!='ignore' raises FileNotFoundError if no path.""" with mock.patch('os.path.exists', return_value=False), \ mock.patch('flash_device.find_image_in_sdk', return_value=None), \ - mock.patch('flash_device.SDK_ROOT', 'path/to/sdk/dir'), \ + mock.patch('common.SDK_ROOT', 'path/to/sdk/dir'), \ self.assertLogs(), \ self.assertRaises(FileNotFoundError): - flash_device.update_required('update', 'product-bundle', None) + flash_device._update_required('update', 'product-bundle', None) def test_update_ignore(self) -> None: """Test setting |os_check| to 'ignore'.""" @@ -118,137 +114,74 @@ def test_update_system_info_match(self) -> None: self.assertEqual(self._ffx_mock.call_count, 1) self.assertEqual(self._sdk_hash_mock.call_count, 1) - def test_update_system_info_mismatch(self) -> None: - """Test update when |os_check| is 'check' and system info does not - match.""" + def test_update_system_info_catches_boot_failure(self) -> None: + """Test update when |os_check=check| catches boot_device exceptions.""" self._swarming_mock.return_value = True with mock.patch('os.path.exists', return_value=True), \ - mock.patch('flash_device._add_exec_to_flash_binaries'), \ + mock.patch('flash_device.boot_device') as mock_boot, \ + mock.patch('flash_device.get_system_info') as mock_sys_info, \ mock.patch('flash_device.subprocess.run'): + mock_boot.side_effect = boot_device.StateTransitionError( + 'Incorrect state') self._ffx_mock.return_value.stdout = \ '[{"title": "Build", "child": [{"value": "wrong.version"}, ' \ '{"value": "wrong_product"}]}]' - flash_device.update(_TEST_IMAGE_DIR, - 'check', - None, - should_pave=False) - self.assertEqual(self._ffx_mock.call_count, 4) + flash_device.update(_TEST_IMAGE_DIR, 'check', None) + mock_boot.assert_called_with(mock.ANY, + boot_device.BootMode.REGULAR, None) + self.assertEqual(self._ffx_mock.call_count, 1) - def test_update_system_info_mismatch_adds_exec_to_flash_binaries(self - ) -> None: - """Test update adds exec bit to flash binaries if flashing.""" + # get_system_info should not even be called due to early exit. + mock_sys_info.assert_not_called() + def test_update_system_info_mismatch(self) -> None: + """Test update when |os_check| is 'check' and system info does not + match.""" + + self._swarming_mock.return_value = True with mock.patch('os.path.exists', return_value=True), \ - mock.patch('flash_device.get_host_arch', - return_value='foo_arch'), \ - mock.patch('flash_device.add_exec_to_file') as add_exec: - self._ffx_mock.return_value.stdout = \ - '[{"title": "Build", "child": [{"value": "wrong.version"}, ' \ - '{"value": "wrong_product"}]}]' - flash_device.update(_TEST_IMAGE_DIR, - 'check', - None, - should_pave=False) - add_exec.assert_has_calls([ - mock.call(os.path.join(_TEST_IMAGE_DIR, 'flash.sh')), - mock.call( - os.path.join(_TEST_IMAGE_DIR, 'host_foo_arch', 'fastboot')) - ], - any_order=True) - - def test_update_adds_exec_to_flash_binaries_depending_on_location( - self) -> None: - """Test update adds exec bit to flash binaries if flashing.""" - - # First exists is for image dir, second is for fastboot binary. - # Missing this fastboot binary means that the test will default to a - # different path. - with mock.patch('os.path.exists', side_effect=[True, False]), \ - mock.patch('flash_device.get_host_arch', - return_value='foo_arch'), \ - mock.patch('flash_device.add_exec_to_file') as add_exec: + mock.patch('flash_device.boot_device') as mock_boot, \ + mock.patch('flash_device.subprocess.run'): self._ffx_mock.return_value.stdout = \ '[{"title": "Build", "child": [{"value": "wrong.version"}, ' \ '{"value": "wrong_product"}]}]' - flash_device.update(_TEST_IMAGE_DIR, - 'check', - None, - should_pave=False) - add_exec.assert_has_calls([ - mock.call(os.path.join(_TEST_IMAGE_DIR, 'flash.sh')), - mock.call( - os.path.join(_TEST_IMAGE_DIR, - 'fastboot.exe.linux-foo_arch')) - ], - any_order=True) + flash_device.update(_TEST_IMAGE_DIR, 'check', None) + mock_boot.assert_called_with(mock.ANY, + boot_device.BootMode.REGULAR, None) + self.assertEqual(self._ffx_mock.call_count, 2) def test_incorrect_target_info(self) -> None: """Test update when |os_check| is 'check' and system info was not retrieved.""" - with mock.patch('os.path.exists', return_value=True), \ - mock.patch('flash_device._add_exec_to_flash_binaries'): + with mock.patch('os.path.exists', return_value=True): self._ffx_mock.return_value.stdout = '[{"title": "badtitle"}]' - flash_device.update(_TEST_IMAGE_DIR, - 'check', - None, - should_pave=False) - self.assertEqual(self._ffx_mock.call_count, 3) + flash_device.update(_TEST_IMAGE_DIR, 'check', None) + self.assertEqual(self._ffx_mock.call_count, 2) def test_update_with_serial_num(self) -> None: """Test update when |serial_num| is specified.""" with mock.patch('time.sleep'), \ mock.patch('os.path.exists', return_value=True), \ - mock.patch('flash_device._add_exec_to_flash_binaries'): - flash_device.update(_TEST_IMAGE_DIR, - 'update', - None, - 'test_serial', - should_pave=False) - self.assertEqual(self._ffx_mock.call_count, 4) + mock.patch('flash_device.boot_device') as mock_boot: + flash_device.update(_TEST_IMAGE_DIR, 'update', None, 'test_serial') + mock_boot.assert_called_with(mock.ANY, + boot_device.BootMode.BOOTLOADER, + 'test_serial') + self.assertEqual(self._ffx_mock.call_count, 1) def test_reboot_failure(self) -> None: """Test update when |serial_num| is specified.""" self._ffx_mock.return_value.returncode = 1 - with mock.patch('time.sleep'), \ - mock.patch('os.path.exists', return_value=True), \ - mock.patch('flash_device.running_unattended', - return_value=True): - required, _ = flash_device.update_required('check', - _TEST_IMAGE_DIR, None) - self.assertEqual(required, True) - - # pylint: disable=no-self-use - def test_update_calls_paving_if_specified(self) -> None: - """Test update calls pave if specified.""" with mock.patch('time.sleep'), \ mock.patch('os.path.exists', return_value=True), \ mock.patch('flash_device.running_unattended', return_value=True), \ - mock.patch('flash_device.pave') as mock_pave: - flash_device.update(_TEST_IMAGE_DIR, - 'update', - 'some-target-id', - should_pave=True) - mock_pave.assert_called_once_with(_TEST_IMAGE_DIR, - 'some-target-id') - - # pylint: enable=no-self-use - - def test_update_raises_error_if_unattended_with_no_target(self) -> None: - """Test update calls pave if specified.""" - - self._swarming_mock.return_value = True - with mock.patch('time.sleep'), \ - mock.patch('flash_device.pave'), \ - mock.patch('os.path.exists', return_value=True): - self.assertRaises(AssertionError, - flash_device.update, - _TEST_IMAGE_DIR, - 'update', - None, - should_pave=True) + mock.patch('flash_device.boot_device'): + required, _ = flash_device._update_required( + 'check', _TEST_IMAGE_DIR, None) + self.assertEqual(required, True) def test_update_on_swarming(self) -> None: """Test update on swarming bots.""" @@ -256,24 +189,23 @@ def test_update_on_swarming(self) -> None: self._swarming_mock.return_value = True with mock.patch('time.sleep'), \ mock.patch('os.path.exists', return_value=True), \ - mock.patch('flash_device._add_exec_to_flash_binaries'), \ + mock.patch('flash_device.boot_device') as mock_boot, \ mock.patch('subprocess.run'): - flash_device.update(_TEST_IMAGE_DIR, - 'update', - None, - 'test_serial', - should_pave=False) - self.assertEqual(self._ffx_mock.call_count, 3) + flash_device.update(_TEST_IMAGE_DIR, 'update', None, 'test_serial') + mock_boot.assert_called_with(mock.ANY, + boot_device.BootMode.BOOTLOADER, + 'test_serial') + self.assertEqual(self._ffx_mock.call_count, 1) def test_main(self) -> None: """Tests |main| function.""" - with mock.patch( - 'sys.argv', - ['flash_device.py', '--os-check', 'ignore', '--no-pave']): + with mock.patch('sys.argv', + ['flash_device.py', '--os-check', 'ignore']): with mock.patch.dict(os.environ, {}): flash_device.main() self.assertEqual(self._ffx_mock.call_count, 0) +# pylint: enable=too-many-public-methods,protected-access if __name__ == '__main__': diff --git a/build/fuchsia/test/isolate_daemon.py b/build/fuchsia/test/isolate_daemon.py new file mode 100755 index 0000000..154819e --- /dev/null +++ b/build/fuchsia/test/isolate_daemon.py @@ -0,0 +1,86 @@ +#!/usr/bin/env vpython3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Sets up the isolate daemon environment to run test on the bots.""" + +import os +import sys +import tempfile + +from contextlib import AbstractContextManager +from typing import List + +from common import catch_sigterm, set_ffx_isolate_dir, start_ffx_daemon, \ + stop_ffx_daemon, wait_for_sigterm +from ffx_integration import ScopedFfxConfig + + +class IsolateDaemon(AbstractContextManager): + """Sets up the environment of an isolate ffx daemon.""" + class IsolateDir(AbstractContextManager): + """Sets up the ffx isolate dir to a temporary folder.""" + def __init__(self): + self._temp_dir = tempfile.TemporaryDirectory() + + def __enter__(self): + set_ffx_isolate_dir(self._temp_dir.__enter__()) + return self + + def __exit__(self, exc_type, exc_value, traceback): + return self._temp_dir.__exit__(exc_type, exc_value, traceback) + + def name(self): + """Returns the location of the isolate dir.""" + return self._temp_dir.name + + def __init__(self, extra_inits: List[AbstractContextManager] = None): + # Keep the alphabetical order. + self._extra_inits = [ + self.IsolateDir(), + ScopedFfxConfig('ffx.isolated', 'true'), + ScopedFfxConfig('daemon.autostart', 'false'), + # fxb/126212: The timeout rate determines the timeout for each file + # transfer based on the size of the file / this rate (in MB). + # Decreasing the rate to 1 (from 5) increases the timeout in + # swarming, where large files can take longer to transfer. + ScopedFfxConfig('fastboot.flash.timeout_rate', '1'), + ScopedFfxConfig('fastboot.reboot.reconnect_timeout', '120'), + ScopedFfxConfig('fastboot.usb.disabled', 'true'), + ScopedFfxConfig('log.level', 'debug'), + ScopedFfxConfig('repository.server.listen', '"[::]:0"'), + ] + (extra_inits or []) + + # Updating configurations to meet the requirement of isolate. + def __enter__(self): + # This environment variable needs to be set before stopping ffx daemon + # to avoid sending unnecessary analytics. + os.environ['FUCHSIA_ANALYTICS_DISABLED'] = '1' + stop_ffx_daemon() + for extra_init in self._extra_inits: + extra_init.__enter__() + start_ffx_daemon() + return self + + def __exit__(self, exc_type, exc_value, traceback): + for extra_init in self._extra_inits: + extra_init.__exit__(exc_type, exc_value, traceback) + stop_ffx_daemon() + + def isolate_dir(self): + """Returns the location of the isolate dir.""" + return self._extra_inits[0].name() + + +def main(): + """Executes the IsolateDaemon and waits for the sigterm.""" + catch_sigterm() + with IsolateDaemon() as daemon: + # Clients can assume the daemon is up and running when the output is + # captured. Note, the client may rely on the printed isolate_dir. + print(daemon.isolate_dir(), flush=True) + wait_for_sigterm('shutting down the daemon.') + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/build/fuchsia/test/lockfile.py b/build/fuchsia/test/lockfile.py new file mode 100644 index 0000000..422cfe4 --- /dev/null +++ b/build/fuchsia/test/lockfile.py @@ -0,0 +1,79 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Exclusive filelocking for all supported platforms. + +Copied from third_party/depot_tools/lockfile.py. +""" + +import contextlib +import fcntl +import logging +import os +import time + + +class LockError(Exception): + """Error raised if timeout or lock (without timeout) fails.""" + + +def _open_file(lockfile): + open_flags = (os.O_CREAT | os.O_WRONLY) + return os.open(lockfile, open_flags, 0o644) + + +def _close_file(file_descriptor): + os.close(file_descriptor) + + +def _lock_file(file_descriptor): + fcntl.flock(file_descriptor, fcntl.LOCK_EX | fcntl.LOCK_NB) + + +def _try_lock(lockfile): + f = _open_file(lockfile) + try: + _lock_file(f) + except Exception: + _close_file(f) + raise + return lambda: _close_file(f) + + +def _lock(path, timeout=0): + """_lock returns function to release the lock if locking was successful. + + _lock also implements simple retry logic.""" + elapsed = 0 + while True: + try: + return _try_lock(path + '.locked') + except (OSError, IOError) as error: + if elapsed < timeout: + sleep_time = min(10, timeout - elapsed) + logging.info( + 'Could not create lockfile; will retry after sleep(%d).', + sleep_time) + elapsed += sleep_time + time.sleep(sleep_time) + continue + raise LockError("Error locking %s (err: %s)" % + (path, str(error))) from error + + +@contextlib.contextmanager +def lock(path, timeout=0): + """Get exclusive lock to path. + + Usage: + import lockfile + with lockfile.lock(path, timeout): + # Do something + pass + + """ + release_fn = _lock(path, timeout) + try: + yield + finally: + release_fn() diff --git a/build/fuchsia/test/log_manager.py b/build/fuchsia/test/log_manager.py index e447603..320f24b 100755 --- a/build/fuchsia/test/log_manager.py +++ b/build/fuchsia/test/log_manager.py @@ -8,14 +8,14 @@ import os import subprocess import sys -import time from contextlib import AbstractContextManager from typing import Iterable, Optional, TextIO -from common import read_package_paths, register_common_args, \ +from common import catch_sigterm, read_package_paths, register_common_args, \ register_device_args, run_continuous_ffx_command, \ - run_ffx_command + stop_ffx_daemon, wait_for_sigterm +from compatible_utils import running_unattended from ffx_integration import ScopedFfxConfig, run_symbolizer @@ -37,7 +37,14 @@ def __init__(self, logs_dir: Optional[str]) -> None: def __enter__(self): if self._scoped_ffx_log: self._scoped_ffx_log.__enter__() - run_ffx_command(('daemon', 'stop'), check=False) + # log.dir change always requires the restarting of the daemon. + # In the test fleet with running_unattended being true, we + # explicitly disallow the daemon from automatically starting, and + # do all the configuration before starting the daemon. + # But in local development workflow, we help the developers to + # restart the daemon to ensure the change of log.dir taking effect. + if not running_unattended(): + stop_ffx_daemon() return self @@ -74,9 +81,8 @@ def __exit__(self, exc_type, exc_value, traceback): self.stop() if self._scoped_ffx_log: self._scoped_ffx_log.__exit__(exc_type, exc_value, traceback) - - # Allow command to fail while ffx team investigates the issue. - run_ffx_command(('daemon', 'stop'), check=False) + if not running_unattended(): + stop_ffx_daemon() def start_system_log(log_manager: LogManager, @@ -111,7 +117,7 @@ def start_system_log(log_manager: LogManager, system_log = sys.stdout else: system_log = log_manager.open_log_file('system_log') - log_cmd = ['log', '--raw'] + log_cmd = ['log', '--raw', '--no-color'] if log_args: log_cmd.extend(log_args) if symbol_paths: @@ -131,6 +137,7 @@ def main(): Runs until the process is killed or interrupted (i.e. user presses CTRL-C). """ + catch_sigterm() parser = argparse.ArgumentParser() register_common_args(parser) register_device_args(parser) @@ -146,13 +153,9 @@ def main(): package_paths.extend( read_package_paths(manager_args.out_dir, package)) with LogManager(None) as log_manager: - try: - start_system_log(log_manager, True, package_paths, system_log_args, - manager_args.target_id) - while True: - time.sleep(10000) - except (KeyboardInterrupt, SystemExit): - pass + start_system_log(log_manager, True, package_paths, system_log_args, + manager_args.target_id) + wait_for_sigterm() if __name__ == '__main__': diff --git a/build/fuchsia/test/log_manager_unittests.py b/build/fuchsia/test/log_manager_unittests.py index 66830a8..8d6c709 100755 --- a/build/fuchsia/test/log_manager_unittests.py +++ b/build/fuchsia/test/log_manager_unittests.py @@ -51,7 +51,7 @@ def test_log_with_log_args(self, mock_ffx) -> None: log = log_manager.LogManager(None) log_manager.start_system_log(log, True, log_args=['test_log_args']) self.assertEqual(mock_ffx.call_args_list[0][0][0], - ['log', '--raw', 'test_log_args']) + ['log', '--raw', '--no-color', 'test_log_args']) self.assertEqual(mock_ffx.call_count, 1) @mock.patch('log_manager.run_continuous_ffx_command') @@ -65,7 +65,8 @@ def test_log_with_symbols(self, mock_ffx) -> None: log_manager.start_system_log(log, False, pkg_paths=['test_pkg']) log.stop() self.assertEqual(mock_ffx.call_count, 1) - self.assertEqual(mock_ffx.call_args_list[0][0][0], ['log', '--raw']) + self.assertEqual(mock_ffx.call_args_list[0][0][0], + ['log', '--raw', '--no-color']) def test_no_logging_dir_exception(self) -> None: """Tests empty LogManager throws an exception on |open_log_file|.""" @@ -75,17 +76,40 @@ def test_no_logging_dir_exception(self) -> None: log.open_log_file('test_log_file') @mock.patch('log_manager.ScopedFfxConfig') - @mock.patch('log_manager.run_ffx_command') - def test_log_manager(self, mock_ffx, mock_scoped_config) -> None: + @mock.patch('log_manager.stop_ffx_daemon') + def test_log_manager(self, mock_stop_ffx_daemon, + mock_scoped_config) -> None: """Tests LogManager as a context manager.""" - context_mock = mock.Mock() - mock_scoped_config.return_value = context_mock - context_mock.__enter__ = mock.Mock(return_value=None) - context_mock.__exit__ = mock.Mock(return_value=None) - with log_manager.LogManager(_LOGS_DIR): - pass - self.assertEqual(mock_ffx.call_count, 2) + with mock.patch('log_manager.running_unattended', return_value=False): + context_mock = mock.Mock() + mock_scoped_config.return_value = context_mock + context_mock.__enter__ = mock.Mock(return_value=None) + context_mock.__exit__ = mock.Mock(return_value=None) + with log_manager.LogManager(_LOGS_DIR): + pass + self.assertEqual(mock_scoped_config.call_count, 1) + self.assertEqual(context_mock.__enter__.call_count, 1) + self.assertEqual(context_mock.__exit__.call_count, 1) + self.assertEqual(mock_stop_ffx_daemon.call_count, 2) + + @mock.patch('log_manager.ScopedFfxConfig') + @mock.patch('log_manager.stop_ffx_daemon') + def test_log_manager_unattended_no_daemon_stop(self, mock_stop_ffx_daemon, + mock_scoped_config) -> None: + """Tests LogManager as a context manager in unattended mode.""" + + with mock.patch('log_manager.running_unattended', return_value=True): + context_mock = mock.Mock() + mock_scoped_config.return_value = context_mock + context_mock.__enter__ = mock.Mock(return_value=None) + context_mock.__exit__ = mock.Mock(return_value=None) + with log_manager.LogManager(_LOGS_DIR): + pass + self.assertEqual(mock_scoped_config.call_count, 1) + self.assertEqual(context_mock.__enter__.call_count, 1) + self.assertEqual(context_mock.__exit__.call_count, 1) + self.assertEqual(mock_stop_ffx_daemon.call_count, 0) def test_main_exception(self) -> None: """Tests |main| function to throw exception on incompatible flags.""" @@ -104,7 +128,7 @@ def test_main(self, mock_system_log, mock_read_paths) -> None: 'log_manager.py', '--packages', 'test_package', '--out-dir', 'test_out_dir' ]): - with mock.patch('log_manager.time.sleep', + with mock.patch('common.time.sleep', side_effect=KeyboardInterrupt): log_manager.main() self.assertEqual(mock_system_log.call_count, 1) diff --git a/build/fuchsia/test/pkg_resolve.py b/build/fuchsia/test/pkg_resolve.py new file mode 100755 index 0000000..b4e8cf3 --- /dev/null +++ b/build/fuchsia/test/pkg_resolve.py @@ -0,0 +1,24 @@ +#!/usr/bin/env vpython3 + +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""A standalone tool to resolve a list of packages.""" + +# Note, this is a temporary tool and should be removed in favor of a better way +# to expose the functionality or merge with other use cases of resolve_packages. + +import sys + +from common import resolve_packages + + +def main(): + """Resolve a list of packages on a target.""" + if len(sys.argv) < 3: + raise ValueError('pkg_resolve.py target [list of packages]') + resolve_packages(sys.argv[2:], sys.argv[1]) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/build/fuchsia/test/publish_package.py b/build/fuchsia/test/publish_package.py index 5c56654..8f4340e 100755 --- a/build/fuchsia/test/publish_package.py +++ b/build/fuchsia/test/publish_package.py @@ -2,18 +2,15 @@ # Copyright 2022 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -"""Implements commands for managing Fuchsia repos via the pm tool.""" +"""Implements commands for managing Fuchsia repos via the ffx tool.""" import argparse -import os -import subprocess import sys from typing import Iterable -from common import SDK_TOOLS_DIR, read_package_paths, register_common_args - -_pm_tool = os.path.join(SDK_TOOLS_DIR, 'pm') +from common import make_clean_directory, read_package_paths, \ + register_common_args, run_ffx_command def publish_packages(packages: Iterable[str], @@ -21,10 +18,13 @@ def publish_packages(packages: Iterable[str], new_repo: bool = False) -> None: """Publish packages to a repo directory, initializing it if necessary.""" if new_repo: - subprocess.run([_pm_tool, 'newrepo', '-repo', repo], check=True) + run_ffx_command(cmd=['repository', 'create', repo], check=True) + + args = ['repository', 'publish'] for package in packages: - subprocess.run([_pm_tool, 'publish', '-a', '-r', repo, '-f', package], - check=True) + args += ['--package-archive', package] + args += [repo] + run_ffx_command(cmd=args, check=True) def register_package_args(parser: argparse.ArgumentParser, @@ -37,6 +37,9 @@ def register_package_args(parser: argparse.ArgumentParser, help='Paths of the package archives to install') package_args.add_argument('--repo', help='Directory packages will be published to.') + package_args.add_argument('--purge-repo', + action='store_true', + help='If clear the content in the repo.') if allow_temp_repo: package_args.add_argument( '--no-repo-init', @@ -61,7 +64,9 @@ def main(): package_paths.extend(read_package_paths(args.out_dir, package)) else: package_paths = args.packages - publish_packages(package_paths, args.repo) + if args.purge_repo: + make_clean_directory(args.repo) + publish_packages(package_paths, args.repo, args.purge_repo) if __name__ == '__main__': diff --git a/build/fuchsia/test/publish_package_unittests.py b/build/fuchsia/test/publish_package_unittests.py index 2bb22da..8b65101 100755 --- a/build/fuchsia/test/publish_package_unittests.py +++ b/build/fuchsia/test/publish_package_unittests.py @@ -20,26 +20,27 @@ class PublishPackageTest(unittest.TestCase): """Unittests for publish_package.py.""" def setUp(self) -> None: - self._subprocess_patcher = mock.patch('publish_package.subprocess.run') - self._subprocess_mock = self._subprocess_patcher.start() - self.addCleanup(self._subprocess_mock.stop) + self._ffx_patcher = mock.patch('publish_package.run_ffx_command') + self._ffx_mock = self._ffx_patcher.start() + self.addCleanup(self._ffx_mock.stop) def test_new_repo(self) -> None: """Test setting |new_repo| to True in |publish_packages|.""" publish_package.publish_packages(_PACKAGES, _REPO, True) - self.assertEqual(self._subprocess_mock.call_count, 2) - first_call = self._subprocess_mock.call_args_list[0] - self.assertEqual(['newrepo', '-repo', _REPO], first_call[0][0][1:]) - second_call = self._subprocess_mock.call_args_list[1] - self.assertEqual(['publish', '-a', '-r', _REPO, '-f', _PACKAGES[0]], - second_call[0][0][1:]) + self.assertEqual(self._ffx_mock.call_count, 2) + first_call, second_call = self._ffx_mock.call_args_list + self.assertEqual(['repository', 'create', _REPO], + first_call.kwargs['cmd']) + self.assertEqual([ + 'repository', 'publish', '--package-archive', _PACKAGES[0], _REPO + ], second_call.kwargs['cmd']) def test_no_new_repo(self) -> None: """Test setting |new_repo| to False in |publish_packages|.""" publish_package.publish_packages(['test_package'], 'test_repo', False) - self.assertEqual(self._subprocess_mock.call_count, 1) + self.assertEqual(self._ffx_mock.call_count, 1) def test_allow_temp_repo(self) -> None: @@ -84,7 +85,7 @@ def test_main_no_out_dir_flag(self) -> None: _REPO ]): publish_package.main() - self.assertEqual(self._subprocess_mock.call_count, 1) + self.assertEqual(self._ffx_mock.call_count, 1) @mock.patch('publish_package.read_package_paths') def test_main(self, read_mock) -> None: @@ -96,7 +97,21 @@ def test_main(self, read_mock) -> None: _REPO, '--out-dir', 'out/test' ]): publish_package.main() - self.assertEqual(self._subprocess_mock.call_count, 1) + self.assertEqual(self._ffx_mock.call_count, 1) + + @mock.patch('publish_package.read_package_paths') + @mock.patch('publish_package.make_clean_directory') + def test_purge_repo(self, read_mock, make_clean_directory_mock) -> None: + """Tests purge_repo flag.""" + + read_mock.return_value = ['out/test/package/path'] + with mock.patch('sys.argv', [ + 'publish_package.py', '--packages', _PACKAGES[0], '--repo', + _REPO, '--out-dir', 'out/test', '--purge-repo' + ]): + publish_package.main() + self.assertEqual(self._ffx_mock.call_count, 2) + self.assertEqual(make_clean_directory_mock.call_count, 1) if __name__ == '__main__': diff --git a/build/fuchsia/test/pylintrc b/build/fuchsia/test/pylintrc index a144b80..264ebc4 100644 --- a/build/fuchsia/test/pylintrc +++ b/build/fuchsia/test/pylintrc @@ -24,3 +24,8 @@ max-attributes=10 [FORMAT] max-line-length=80 + +[SIMILARITIES] +ignore-comments=yes +ignore-docstrings=yes +ignore-imports=yes diff --git a/build/fuchsia/test/run_executable_test.py b/build/fuchsia/test/run_executable_test.py index 7c6772b..7cc10d0 100755 --- a/build/fuchsia/test/run_executable_test.py +++ b/build/fuchsia/test/run_executable_test.py @@ -19,7 +19,6 @@ from compatible_utils import map_filter_file_to_package_file from ffx_integration import FfxTestRunner, run_symbolizer from test_runner import TestRunner -from test_server import setup_test_server DEFAULT_TEST_SERVER_CONCURRENCY = 4 @@ -71,24 +70,23 @@ class ExecutableTestRunner(TestRunner): """Test runner for running standalone test executables.""" def __init__( # pylint: disable=too-many-arguments - self, - out_dir: str, - test_args: List[str], - test_name: str, - target_id: Optional[str], - code_coverage_dir: str, - logs_dir: Optional[str] = None) -> None: - super().__init__(out_dir, test_args, [test_name], target_id) + self, out_dir: str, test_args: List[str], test_name: str, + target_id: Optional[str], code_coverage_dir: str, + logs_dir: Optional[str], package_deps: List[str], + test_realm: Optional[str]) -> None: + super().__init__(out_dir, test_args, [test_name], target_id, + package_deps) if not self._test_args: self._test_args = [] self._test_name = test_name - self._code_coverage_dir = os.path.basename(code_coverage_dir) + self._code_coverage_dir = code_coverage_dir self._custom_artifact_directory = None self._isolated_script_test_output = None self._isolated_script_test_perf_output = None self._logs_dir = logs_dir self._test_launcher_summary_output = None self._test_server = None + self._test_realm = test_realm def _get_args(self) -> List[str]: parser = argparse.ArgumentParser() @@ -165,6 +163,13 @@ def _get_args(self) -> List[str]: else: test_concurrency = DEFAULT_TEST_SERVER_CONCURRENCY if args.enable_test_server: + # Repos other than chromium may not have chrome_test_server_spawner, + # and they may not run server at all, so only import the test_server + # when it's really necessary. + + # pylint: disable=import-outside-toplevel + from test_server import setup_test_server + # pylint: enable=import-outside-toplevel self._test_server, spawner_url_base = setup_test_server( self._target_id, test_concurrency) child_args.append('--remote-test-server-spawner-url-base=%s' % @@ -192,16 +197,19 @@ def _postprocess(self, test_runner: FfxTestRunner) -> None: test_runner, os.path.basename(self._isolated_script_test_perf_output), self._isolated_script_test_perf_output) - _copy_coverage_files(test_runner, self._code_coverage_dir) + if self._code_coverage_dir: + _copy_coverage_files(test_runner, + os.path.basename(self._code_coverage_dir)) def run_test(self) -> subprocess.Popen: test_args = self._get_args() with FfxTestRunner(self._logs_dir) as test_runner: test_proc = test_runner.run_test( - get_component_uri(self._test_name), test_args, self._target_id) + get_component_uri(self._test_name), test_args, self._target_id, + self._test_realm) symbol_paths = [] - for pkg_path in self._package_deps.values(): + for pkg_path in self.package_deps.values(): symbol_paths.append( os.path.join(os.path.dirname(pkg_path), 'ids.txt')) # Symbolize output from test process and print to terminal. @@ -227,7 +235,8 @@ def create_executable_test_runner(runner_args: argparse.Namespace, return ExecutableTestRunner(runner_args.out_dir, test_args, runner_args.test_type, runner_args.target_id, runner_args.code_coverage_dir, - runner_args.logs_dir) + runner_args.logs_dir, runner_args.package_deps, + runner_args.test_realm) def register_executable_test_args(parser: argparse.ArgumentParser) -> None: @@ -235,15 +244,25 @@ def register_executable_test_args(parser: argparse.ArgumentParser) -> None: test_args = parser.add_argument_group('test', 'arguments for test running') test_args.add_argument('--code-coverage-dir', - default=os.getcwd(), + default=None, help='Directory to place code coverage ' 'information. Only relevant when the target was ' - 'built with |fuchsia_code_coverage| set to true. ' - 'Defaults to current directory.') + 'built with |fuchsia_code_coverage| set to true.') test_args.add_argument('--test-name', dest='test_type', help='Name of the test package (e.g. ' 'unit_tests).') + test_args.add_argument( + '--test-realm', + default=None, + help='The realm to run the test in. This field is optional and takes ' + 'the form: /path/to/realm:test_collection. See ' + 'https://fuchsia.dev/go/components/non-hermetic-tests') + test_args.add_argument('--package-deps', + action='append', + help='A list of the full path of the dependencies ' + 'to retrieve the symbol ids. Keeping it empty to ' + 'automatically generates from package_metadata.') def main(): diff --git a/build/fuchsia/test/run_test.py b/build/fuchsia/test/run_test.py index 680fc6b..ce47e1d 100755 --- a/build/fuchsia/test/run_test.py +++ b/build/fuchsia/test/run_test.py @@ -5,6 +5,8 @@ """Implements commands for running tests E2E on a Fuchsia device.""" import argparse +import logging +import os import sys import tempfile @@ -12,11 +14,11 @@ from typing import List from common import register_common_args, register_device_args, \ - register_log_args, resolve_packages, \ - set_ffx_isolate_dir + register_log_args, resolve_packages from compatible_utils import running_unattended -from ffx_integration import ScopedFfxConfig, test_connection +from ffx_integration import ScopedFfxConfig from flash_device import register_update_args, update +from isolate_daemon import IsolateDaemon from log_manager import LogManager, start_system_log from publish_package import publish_packages, register_package_args from run_blink_test import BlinkTestRunner @@ -26,8 +28,8 @@ from run_webpage_test import WebpageTestRunner from serve_repo import register_serve_args, serve_repository from start_emulator import create_emulator_from_args, register_emulator_args +from test_connection import test_connection, test_device_connection from test_runner import TestRunner -from ermine_ctl import ErmineCtl def _get_test_runner(runner_args: argparse.Namespace, @@ -46,8 +48,12 @@ def _get_test_runner(runner_args: argparse.Namespace, return create_executable_test_runner(runner_args, test_args) +# pylint: disable=too-many-statements def main(): """E2E method for installing packages and running a test.""" + # Always add time stamps to the logs. + logging.basicConfig(format='%(levelname)s %(asctime)s %(message)s') + parser = argparse.ArgumentParser() parser.add_argument( 'test_type', @@ -58,13 +64,16 @@ def main(): action='store_true', default=False, help='Use an existing device.') + parser.add_argument('--extra-path', + action='append', + help='Extra paths to append to the PATH environment') # Register arguments register_common_args(parser) register_device_args(parser) register_emulator_args(parser) register_executable_test_args(parser) - register_update_args(parser, default_os_check='ignore', default_pave=True) + register_update_args(parser, default_os_check='ignore') register_log_args(parser) register_package_args(parser, allow_temp_repo=True) register_serve_args(parser) @@ -79,21 +88,42 @@ def main(): runner_args.device = True with ExitStack() as stack: + log_manager = LogManager(runner_args.logs_dir) if running_unattended(): - set_ffx_isolate_dir( - stack.enter_context(tempfile.TemporaryDirectory())) - stack.enter_context( - ScopedFfxConfig('repository.server.listen', '"[::]:0"')) - log_manager = stack.enter_context(LogManager(runner_args.logs_dir)) + if runner_args.extra_path: + os.environ['PATH'] += os.pathsep + os.pathsep.join( + runner_args.extra_path) + + extra_inits = [log_manager] + if runner_args.everlasting: + # Setting the emu.instance_dir to match the named cache, so + # we can keep these files across multiple runs. + extra_inits.append( + ScopedFfxConfig( + 'emu.instance_dir', + os.path.join(os.environ['HOME'], + '.fuchsia_emulator/'))) + stack.enter_context(IsolateDaemon(extra_inits)) + else: + if runner_args.logs_dir: + logging.warning( + 'You are using a --logs-dir, ensure the ffx ' + 'daemon is started with the logs.dir config ' + 'updated. We won\'t restart the daemon randomly' + ' anymore.') + stack.enter_context(log_manager) + if runner_args.device: update(runner_args.system_image_dir, runner_args.os_check, - runner_args.target_id, runner_args.serial_num, - runner_args.pave) + runner_args.target_id, runner_args.serial_num) + # Try to reboot the device if necessary since the ffx may ignore the + # device state after the flash. See + # https://cs.opensource.google/fuchsia/fuchsia/+/main:src/developer/ffx/lib/fastboot/src/common/fastboot.rs;drc=cfba0bdd4f8857adb6409f8ae9e35af52c0da93e;l=454 + test_device_connection(runner_args.target_id) else: runner_args.target_id = stack.enter_context( create_emulator_from_args(runner_args)) - - test_connection(runner_args.target_id) + test_connection(runner_args.target_id) test_runner = _get_test_runner(runner_args, test_args) package_deps = test_runner.package_deps @@ -113,10 +143,6 @@ def main(): start_system_log(log_manager, False, package_deps.values(), ('--since', 'now'), runner_args.target_id) - ermine = ErmineCtl(runner_args.target_id) - if ermine.exists: - ermine.take_to_shell() - resolve_packages(package_deps.keys(), runner_args.target_id) return test_runner.run_test().returncode diff --git a/build/fuchsia/test/run_webpage_test.py b/build/fuchsia/test/run_webpage_test.py index e89282f..26c1f69 100644 --- a/build/fuchsia/test/run_webpage_test.py +++ b/build/fuchsia/test/run_webpage_test.py @@ -5,11 +5,10 @@ import argparse import logging -import time from typing import List, Optional -from common import run_continuous_ffx_command +from common import catch_sigterm, run_continuous_ffx_command, wait_for_sigterm from test_runner import TestRunner @@ -33,6 +32,7 @@ def __init__(self, out_dir: str, test_args: List[str], super().__init__(out_dir, test_args, packages, target_id) def run_test(self): + catch_sigterm() browser_cmd = [ 'test', 'run', @@ -41,21 +41,13 @@ def run_test(self): f'fuchsia-pkg://fuchsia.com/{self._packages[0]}#meta/' f'{self._packages[0]}.cm' ] - browser_cmd.extend([ - '--', '--web-engine-package-name=web_engine_with_webui', - '--use-web-instance', '--enable-web-instance-tmp', '--with-webui' - ]) + browser_cmd.extend( + ['--', '--web-engine-package-name=web_engine_with_webui']) if self._test_args: browser_cmd.extend(self._test_args) logging.info('Starting %s', self._packages[0]) + browser_proc = run_continuous_ffx_command(browser_cmd) try: - browser_proc = run_continuous_ffx_command(browser_cmd) - while True: - time.sleep(10000) - except KeyboardInterrupt: - logging.info('Ctrl-C received; shutting down the webpage.') + wait_for_sigterm('shutting down the webpage.') + finally: browser_proc.kill() - except SystemExit: - logging.info('SIGTERM received; shutting down the webpage.') - browser_proc.kill() - return browser_proc diff --git a/build/fuchsia/test/serial_boot_device.py b/build/fuchsia/test/serial_boot_device.py new file mode 100755 index 0000000..b4e04c7 --- /dev/null +++ b/build/fuchsia/test/serial_boot_device.py @@ -0,0 +1,306 @@ +#!/usr/bin/env python3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Helpers to reliably reboot the device via serial and fastboot. + +Note, this file will be executed in docker instance without vpython3, so we use +python3 instead. The docker instance runs this file as a symbolic link of dmc +via the "main" function. +""" + +import json +import logging +import os +import shutil +import signal +import subprocess +import sys +import time + +from typing import List +from boot_device import BootMode +from compatible_utils import running_unattended + +# pylint: disable=too-many-return-statements, too-many-branches + + +def _env_ready() -> bool: + """Checks if the required environment is ready to support the functions in + this file.""" + if shutil.which('fastboot') is None: + logging.warning('fastboot is not accessible') + return False + if shutil.which('serialio') is None: + logging.warning('serialio is not accessible') + return False + return True + + +def boot_device(node_id: str, + serial_num: str, + mode: BootMode, + must_boot: bool = False) -> bool: + """Boots device into desired mode via serial and fastboot. + This function waits for at most 10 minutes for the transition. + + Args: + node_id: The fuchsia node id of the device. + serial_num: The fastboot serial number of the device. + mode: Desired boot mode. + must_boot: Forces device to reboot regardless the current state. + + Returns: + a boolean value to indicate if the operation succeeded; missing + dependencies like serialio (for serial access) and fastboot, or the + device cannot be found may also introduce the error. + """ + #TODO(crbug.com/1490434): Remove the default values once the use in + # flash_device has been migrated. + if node_id is None: + node_id = os.getenv('FUCHSIA_NODENAME') + if serial_num is None: + serial_num = os.getenv('FUCHSIA_FASTBOOT_SERNUM') + assert node_id is not None + assert serial_num is not None + + assert mode in [BootMode.REGULAR, BootMode.BOOTLOADER + ], 'Unsupported BootMode %s for serial_boot_device.' % mode + assert _env_ready() + + if is_in_fuchsia(node_id): + if not must_boot and mode == BootMode.REGULAR: + return True + # pylint: disable=subprocess-run-check + if subprocess.run([ + 'serialio', node_id, 'send', 'dm', 'reboot' + + ('' if mode == BootMode.REGULAR else '-bootloader') + ]).returncode != 0: + logging.error('Failed to send dm reboot[-bootloader] via serialio') + return False + elif is_in_fastboot(serial_num): + # fastboot is stateless and there isn't a reason to reboot the device + # again to go to the fastboot. + if mode == BootMode.BOOTLOADER: + return True + if not _run_fastboot(['reboot'], serial_num): + # Shouldn't return None here, unless the device was rebooting. In + # the case, it would be safer to return false. + return False + else: + logging.error('Cannot find node id %s or fastboot serial number %s', + node_id, serial_num) + return False + + start_sec = time.time() + while time.time() - start_sec < 600: + assert mode in [BootMode.REGULAR, BootMode.BOOTLOADER] + if mode == BootMode.REGULAR and is_in_fuchsia(node_id): + return True + if mode == BootMode.BOOTLOADER and is_in_fastboot(serial_num): + return True + logging.error( + 'Failed to transite node id %s or fastboot serial number %s ' + 'to expected state %s', node_id, serial_num, mode) + return False + + +def _serialio_send_and_wait(node_id: str, command: List[str], + waitfor: str) -> bool: + """Continously sends the command to the device and waits for the waitfor + string via serialio. + This function asserts the existence of serialio and waits at most ~30 + seconds.""" + assert shutil.which('serialio') is not None + start_sec = time.time() + with subprocess.Popen(['serialio', node_id, 'wait', waitfor], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) as proc: + while time.time() - start_sec < 28: + send_command = ['serialio', node_id, 'send'] + send_command.extend(command) + # pylint: disable=subprocess-run-check + if subprocess.run(send_command).returncode != 0: + logging.error('Failed to send %s via serialio to %s', command, + node_id) + return False + result = proc.poll() + if result is not None: + if result == 0: + return True + logging.error( + 'Failed to wait %s via serial to %s, ' + 'return code %s', waitfor, node_id, result) + return False + time.sleep(2) + proc.kill() + logging.error('Have not found %s via serialio to %s', waitfor, node_id) + return False + + +def is_in_fuchsia(node_id: str) -> bool: + """Checks if the device is running in fuchsia through serial. + Note, this check goes through serial and does not guarantee the fuchsia os + has a workable network or ssh connection. + This function asserts the existence of serialio and waits at most ~60 + seconds.""" + if not _serialio_send_and_wait( + node_id, ['echo', 'yes-i-am-healthy', '|', 'sha1sum'], + '89d517b7db104aada669a83bc3c3a906e00671f7'): + logging.error( + 'Device %s did not respond echo, ' + 'it may not be running fuchsia', node_id) + return False + if not _serialio_send_and_wait(node_id, ['ps'], 'sshd'): + logging.warning( + 'Cannot find sshd from ps on %s, the ssh ' + 'connection may not be available.', node_id) + return True + + +def is_in_fastboot(serial_num: str) -> bool: + """Checks if the device is running in fastboot through fastboot command. + Note, the fastboot may be impacted by the usb congestion and causes this + function to return false. + This function asserts the existence of fastboot and waits at most ~30 + seconds.""" + start_sec = time.time() + while time.time() - start_sec < 28: + result = _run_fastboot(['getvar', 'product'], serial_num) + if result is None: + return False + if result: + return True + time.sleep(2) + logging.error('Failed to wait for fastboot state of %s', serial_num) + return False + + +def _run_fastboot(args: List[str], serial_num: str) -> bool: + """Executes the fastboot command and kills the hanging process. + The fastboot may be impacted by the usb congestion and causes the process to + hang forever. So this command waits for 30 seconds before killing the + process, and it's not good for flashing. + Note, if this function detects the fastboot is waiting for the device, i.e. + the device is not in the fastboot, it returns None instead, e.g. unknown. + This function asserts the existence of fastboot.""" + assert shutil.which('fastboot') is not None + args.insert(0, 'fastboot') + args.extend(('-s', serial_num)) + try: + # Capture output to ensure we can get '< waiting for serial-num >' + # output. + # pylint: disable=subprocess-run-check + if subprocess.run(args, capture_output=True, + timeout=30).returncode == 0: + return True + except subprocess.TimeoutExpired as timeout: + if timeout.stderr is not None and serial_num.lower( + ) in timeout.stderr.decode().lower(): + logging.warning('fastboot is still waiting for %s', serial_num) + return None + logging.error('Failed to run %s against fastboot %s', args, serial_num) + return False + + +def _shutdown_if_serial_is_unavailable(node_id: str) -> None: + if not running_unattended(): + return + # pylint: disable=subprocess-run-check + if subprocess.run(['serialio', node_id, 'poll']).returncode != 0: + logging.warning('shutting down the docker by killing the pid 1') + # Before killing the process itself, force shutting down the logging to + # flush everything. + logging.shutdown() + # In docker instance, killing root process will cause the instance to be + # shut down and restarted by swarm_docker. So the updated tty can be + # attached to the new docker instance. + os.kill(1, signal.SIGTERM) + + +def main(action: str) -> int: + """Main entry of serial_boot_device.""" + node_id = os.getenv('FUCHSIA_NODENAME') + serial_num = os.getenv('FUCHSIA_FASTBOOT_SERNUM') + assert node_id is not None + assert serial_num is not None + + handlers = [logging.StreamHandler()] + if os.path.isdir('/home/swarming/'): + handlers.append( + logging.FileHandler('/home/swarming/dmc.%s.log' % node_id)) + logging.basicConfig(format='%(levelname)s %(asctime)s %(message)s', + handlers=handlers, + level=logging.INFO) + logging.info('Running command %s against %s %s', sys.argv, node_id, + serial_num) + + # Checks the environment after initializing the logging. + if not _env_ready(): + logging.error('Missing environment setup, unable to perform action.') + return 2 + + if action == 'health-check': + _shutdown_if_serial_is_unavailable(node_id) + if is_in_fuchsia(node_id) or is_in_fastboot(serial_num): + # Print out the json result without using logging to avoid any + # potential formatting issue. + print( + json.dumps([{ + 'nodename': node_id, + 'state': 'healthy', + 'status_message': '', + 'dms_state': '' + }])) + return 0 + logging.error('Cannot find node id %s or fastboot serial number %s', + node_id, serial_num) + return 1 + if action in ['reboot', 'after-task']: + if action == 'after-task': + _shutdown_if_serial_is_unavailable(node_id) + if boot_device(node_id, serial_num, BootMode.REGULAR, must_boot=True): + return 0 + logging.error( + 'Cannot reboot the device with node id %s and fastboot ' + 'serial number %s', node_id, serial_num) + return 1 + if action == 'reboot-fastboot': + if boot_device(node_id, + serial_num, + BootMode.BOOTLOADER, + must_boot=True): + return 0 + logging.error( + 'Cannot reboot the device with node id %s and fastboot ' + 'serial number %s into fastboot', node_id, serial_num) + return 1 + if action == 'is-in-fuchsia': + if is_in_fuchsia(node_id): + return 0 + logging.error('Cannot find node id %s', node_id) + return 1 + if action == 'is-in-fastboot': + if is_in_fastboot(serial_num): + return 0 + logging.error('Cannot find fastboot serial number %s', serial_num) + return 1 + if action == 'server-version': + # TODO(crbug.com/1490434): Implement the server-version. + print('chromium') + return 0 + if action == 'before-task': + # TODO(crbug.com/1490434): fuchsia.py requires IMAGE_MANIFEST_PATH and + # BOOTSERVER_PATH to support before-task call. So the following + # statement does not work as it should be. + _shutdown_if_serial_is_unavailable(node_id) + return 0 + if action == 'set-power-state': + # Do nothing. The device is always restarted during after-task. + return 0 + logging.error('Unknown command %s', action) + return 2 + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1])) diff --git a/build/fuchsia/test/serial_boot_device_unittests.py b/build/fuchsia/test/serial_boot_device_unittests.py new file mode 100755 index 0000000..c863a4a --- /dev/null +++ b/build/fuchsia/test/serial_boot_device_unittests.py @@ -0,0 +1,111 @@ +#!/usr/bin/env vpython3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""File for testing serial_boot_device.py.""" + +import json +import os +import unittest +import unittest.mock as mock + +from subprocess import CompletedProcess + +import serial_boot_device + +from boot_device import BootMode + + +# pylint: disable=too-many-public-methods, missing-function-docstring +@mock.patch('shutil.which', return_value='/bin') +class SerialBootDeviceTest(unittest.TestCase): + """Unittests for serial_boot_device.py.""" + def setUp(self) -> None: + os.environ['FUCHSIA_NODENAME'] = 'fuchsia-node-id' + os.environ['FUCHSIA_FASTBOOT_SERNUM'] = 'fuchsia-serial-num' + + def test_does_not_boot_without_binaries(self, *_) -> None: + with mock.patch('shutil.which', return_value=None): + self.assertNotEqual(serial_boot_device.main('reboot'), 0) + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[True]) + @mock.patch('builtins.print') + def test_check_health_in_fuchsia(self, mock_print, *_) -> None: + self.assertEqual(serial_boot_device.main('health-check'), 0) + result = json.loads(mock_print.call_args.args[0]) + self.assertEqual(result[0]['nodename'], 'fuchsia-node-id') + self.assertEqual(result[0]['state'], 'healthy') + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[False]) + @mock.patch('serial_boot_device.is_in_fastboot', side_effect=[True]) + @mock.patch('builtins.print') + def test_check_health_in_fastboot(self, mock_print, *_) -> None: + self.assertEqual(serial_boot_device.main('health-check'), 0) + result = json.loads(mock_print.call_args.args[0]) + self.assertEqual(result[0]['nodename'], 'fuchsia-node-id') + self.assertEqual(result[0]['state'], 'healthy') + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[False]) + @mock.patch('serial_boot_device.is_in_fastboot', side_effect=[False]) + def test_check_health_undetectable(self, *_) -> None: + self.assertNotEqual(serial_boot_device.main('health-check'), 0) + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[False]) + @mock.patch('serial_boot_device.is_in_fastboot', side_effect=[False]) + @mock.patch('subprocess.run', + return_value=CompletedProcess(args=['/bin'], returncode=0)) + def test_boot_undetectable(self, mock_run, *_) -> None: + self.assertNotEqual(serial_boot_device.main('reboot'), 0) + mock_run.assert_not_called() + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[True, True]) + @mock.patch('subprocess.run', + return_value=CompletedProcess(args=['/bin'], returncode=0)) + def test_boot_from_fuchsia_to_fuchsia(self, mock_run, *_) -> None: + self.assertEqual(serial_boot_device.main('reboot'), 0) + mock_run.assert_called_once_with( + ['serialio', 'fuchsia-node-id', 'send', 'dm', 'reboot']) + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[True]) + @mock.patch('subprocess.run', + return_value=CompletedProcess(args=['/bin'], returncode=0)) + def test_boot_from_fuchsia_to_fuchsia_not_must_boot(self, mock_run, + *_) -> None: + self.assertTrue( + serial_boot_device.boot_device('fuchsia-node-id', + 'fuchsia-serial-num', + BootMode.REGULAR, + must_boot=False)) + mock_run.assert_not_called() + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[False, True]) + @mock.patch('serial_boot_device.is_in_fastboot', side_effect=[True]) + @mock.patch('subprocess.run', + return_value=CompletedProcess(args=['/bin'], returncode=0)) + def test_boot_from_fastboot_to_fuchsia(self, mock_run, *_) -> None: + self.assertEqual(serial_boot_device.main('reboot'), 0) + mock_run.assert_called_once_with( + ['fastboot', 'reboot', '-s', 'fuchsia-serial-num'], + capture_output=True, + timeout=30) + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[True]) + @mock.patch('serial_boot_device.is_in_fastboot', side_effect=[True]) + @mock.patch('subprocess.run', + return_value=CompletedProcess(args=['/bin'], returncode=0)) + def test_boot_from_fuchsia_to_fastboot(self, mock_run, *_) -> None: + self.assertEqual(serial_boot_device.main('reboot-fastboot'), 0) + mock_run.assert_called_once_with( + ['serialio', 'fuchsia-node-id', 'send', 'dm', 'reboot-bootloader']) + + @mock.patch('serial_boot_device.is_in_fuchsia', side_effect=[False]) + @mock.patch('serial_boot_device.is_in_fastboot', side_effect=[True]) + @mock.patch('subprocess.run', + return_value=CompletedProcess(args=['/bin'], returncode=0)) + def test_boot_from_fastboot_to_fastboot(self, mock_run, *_) -> None: + self.assertEqual(serial_boot_device.main('reboot-fastboot'), 0) + mock_run.assert_not_called() + + +if __name__ == '__main__': + unittest.main() diff --git a/build/fuchsia/test/serve_repo.py b/build/fuchsia/test/serve_repo.py index 7270bb9..dd916cd 100755 --- a/build/fuchsia/test/serve_repo.py +++ b/build/fuchsia/test/serve_repo.py @@ -10,7 +10,8 @@ from typing import Iterator, Optional -from common import REPO_ALIAS, register_device_args, run_ffx_command +from common import REPO_ALIAS, catch_sigterm, register_device_args, \ + run_ffx_command, wait_for_sigterm _REPO_NAME = 'chromium-test-package-server' @@ -19,11 +20,12 @@ def _stop_serving(repo_name: str, target: Optional[str]) -> None: """Stop serving a repository.""" # Attempt to clean up. - run_ffx_command(['target', 'repository', 'deregister', '-r', repo_name], - target, - check=False) - run_ffx_command(['repository', 'remove', repo_name], check=False) - run_ffx_command(['repository', 'server', 'stop'], check=False) + run_ffx_command( + cmd=['target', 'repository', 'deregister', '-r', repo_name], + target_id=target, + check=False) + run_ffx_command(cmd=['repository', 'remove', repo_name], check=False) + run_ffx_command(cmd=['repository', 'server', 'stop'], check=False) def _start_serving(repo_dir: str, repo_name: str, @@ -36,14 +38,16 @@ def _start_serving(repo_dir: str, repo_name: str, target: Fuchsia device the repository is served to. """ - run_ffx_command(('config', 'set', 'repository.server.mode', '\"ffx\"')) + run_ffx_command(cmd=('config', 'set', 'repository.server.mode', '\"ffx\"')) - run_ffx_command(['repository', 'server', 'start']) - run_ffx_command(['repository', 'add-from-pm', repo_dir, '-r', repo_name]) - run_ffx_command([ + run_ffx_command(cmd=['repository', 'server', 'start']) + run_ffx_command( + cmd=['repository', 'add-from-pm', repo_dir, '-r', repo_name]) + run_ffx_command(cmd=[ 'target', 'repository', 'register', '-r', repo_name, '--alias', REPO_ALIAS - ], target) + ], + target_id=target) def register_serve_args(arg_parser: argparse.ArgumentParser) -> None: @@ -64,8 +68,16 @@ def run_serve_cmd(cmd: str, args: argparse.Namespace) -> None: if cmd == 'start': _start_serving(args.repo, args.repo_name, args.target_id) - else: + elif cmd == 'stop': _stop_serving(args.repo_name, args.target_id) + else: + assert cmd == 'run' + catch_sigterm() + with serve_repository(args): + # Clients can assume the repo is up and running once the repo-name + # is printed out. + print(args.repo_name, flush=True) + wait_for_sigterm('shutting down the repo server.') @contextlib.contextmanager @@ -83,14 +95,18 @@ def main(): parser = argparse.ArgumentParser() parser.add_argument('cmd', - choices=['start', 'stop'], - help='Choose to start|stop repository serving.') + choices=['start', 'stop', 'run'], + help='Choose to start|stop|run repository serving. ' \ + '"start" command will start the repo and exit; ' \ + '"run" command will start the repo and wait ' \ + 'until ctrl-c or sigterm.') register_device_args(parser) register_serve_args(parser) args = parser.parse_args() - if args.cmd == 'start' and not args.repo: + if (args.cmd == 'start' or args.cmd == 'run') and not args.repo: raise ValueError('Directory the repository is serving from needs ' 'to be specified.') + run_serve_cmd(args.cmd, args) diff --git a/build/fuchsia/test/serve_repo_unittests.py b/build/fuchsia/test/serve_repo_unittests.py index de3fa62..c16a691 100755 --- a/build/fuchsia/test/serve_repo_unittests.py +++ b/build/fuchsia/test/serve_repo_unittests.py @@ -32,17 +32,20 @@ def test_run_serve_cmd_start(self, mock_ffx) -> None: serve_repo.run_serve_cmd('start', self._namespace) self.assertEqual(mock_ffx.call_count, 4) second_call = mock_ffx.call_args_list[1] - self.assertEqual(['repository', 'server', 'start'], second_call[0][0]) + self.assertEqual(mock.call(cmd=['repository', 'server', 'start']), + second_call) third_call = mock_ffx.call_args_list[2] self.assertEqual( - ['repository', 'add-from-pm', _REPO_DIR, '-r', _REPO_NAME], - third_call[0][0]) + mock.call( + cmd=['repository', 'add-from-pm', _REPO_DIR, '-r', _REPO_NAME + ]), third_call) fourth_call = mock_ffx.call_args_list[3] - self.assertEqual([ - 'target', 'repository', 'register', '-r', _REPO_NAME, '--alias', - REPO_ALIAS - ], fourth_call[0][0]) - self.assertEqual(_TARGET, fourth_call[0][1]) + self.assertEqual( + mock.call(cmd=[ + 'target', 'repository', 'register', '-r', _REPO_NAME, + '--alias', REPO_ALIAS + ], + target_id=_TARGET), fourth_call) @mock.patch('serve_repo.run_ffx_command') def test_run_serve_cmd_stop(self, mock_ffx) -> None: @@ -52,14 +55,26 @@ def test_run_serve_cmd_stop(self, mock_ffx) -> None: self.assertEqual(mock_ffx.call_count, 3) first_call = mock_ffx.call_args_list[0] self.assertEqual( - ['target', 'repository', 'deregister', '-r', _REPO_NAME], - first_call[0][0]) - self.assertEqual(_TARGET, first_call[0][1]) + mock.call( + cmd=['target', 'repository', 'deregister', '-r', _REPO_NAME], + target_id=_TARGET, + check=False), first_call) second_call = mock_ffx.call_args_list[1] - self.assertEqual(['repository', 'remove', _REPO_NAME], - second_call[0][0]) + self.assertEqual( + mock.call(cmd=['repository', 'remove', _REPO_NAME], check=False), + second_call) third_call = mock_ffx.call_args_list[2] - self.assertEqual(['repository', 'server', 'stop'], third_call[0][0]) + self.assertEqual( + mock.call(cmd=['repository', 'server', 'stop'], check=False), + third_call) + + @mock.patch('serve_repo.serve_repository') + def test_run_serve_cmd_run(self, mock_serve) -> None: + """Test |run_serve_cmd| function for run.""" + + with mock.patch('common.time.sleep', side_effect=KeyboardInterrupt): + serve_repo.run_serve_cmd('run', self._namespace) + self.assertEqual(mock_serve.call_count, 1) @mock.patch('serve_repo.run_serve_cmd') def test_serve_repository(self, mock_serve) -> None: @@ -84,6 +99,17 @@ def test_main_stop(self, mock_serve) -> None: serve_repo.main() self.assertEqual(mock_serve.call_count, 1) + @mock.patch('serve_repo.run_serve_cmd') + def test_main_run(self, mock_serve) -> None: + """Tests |main| function.""" + + with mock.patch('sys.argv', [ + 'serve_repo.py', 'run', '--serve-repo', _REPO_NAME + ]), \ + mock.patch('common.time.sleep', side_effect=KeyboardInterrupt): + serve_repo.main() + self.assertEqual(mock_serve.call_count, 1) + if __name__ == '__main__': unittest.main() diff --git a/build/fuchsia/test/sshconfig b/build/fuchsia/test/sshconfig new file mode 100644 index 0000000..1bdc2e9 --- /dev/null +++ b/build/fuchsia/test/sshconfig @@ -0,0 +1,39 @@ +# Configure port 8022 for connecting to a device with the local address. +# This makes it possible to forward 8022 to a device connected remotely. +# The fuchsia private key is used for the identity. +Host 127.0.0.1 + Port 8022 +Host ::1 + Port 8022 +Host * +# Turn off refusing to connect to hosts whose key has changed +StrictHostKeyChecking no +CheckHostIP no +# Disable recording the known hosts +UserKnownHostsFile=/dev/null +# Do not forward auth agent connection to remote, no X11 +ForwardAgent no +ForwardX11 no +# Connection timeout in seconds +ConnectTimeout=10 +# Check for server alive in seconds, max count before disconnecting +ServerAliveInterval 1 +ServerAliveCountMax 10 +# Try to keep the master connection open to speed reconnecting. +ControlMaster auto +ControlPersist yes +# When expanded, the ControlPath below cannot have more than 90 characters +# (total of 108 minus 18 used by a random suffix added by ssh). +# '%C' expands to 40 chars and there are 9 fixed chars, so '~' can expand to +# up to 41 chars, which is a reasonable limit for a user's home in most +# situations. If '~' expands to more than 41 chars, the ssh connection +# will fail with an error like: +# unix_listener: path "..." too long for Unix domain socket +# A possible solution is to use /tmp instead of ~, but it has +# its own security concerns. +ControlPath=~/.ssh/fx-%C +# Connect with user, use the identity specified. +User fuchsia +IdentitiesOnly yes +IdentityFile ~/.ssh/fuchsia_ed25519 +GSSAPIDelegateCredentials no diff --git a/build/fuchsia/test/start_emulator.py b/build/fuchsia/test/start_emulator.py index 4cbb577..a0adf47 100755 --- a/build/fuchsia/test/start_emulator.py +++ b/build/fuchsia/test/start_emulator.py @@ -7,10 +7,11 @@ import argparse import logging import sys -import time -from common import register_log_args -from ffx_integration import FfxEmulator +from contextlib import AbstractContextManager + +from common import catch_sigterm, register_log_args, wait_for_sigterm +from ffx_emulator import FfxEmulator def register_emulator_args(parser: argparse.ArgumentParser, @@ -36,41 +37,53 @@ def register_emulator_args(parser: argparse.ArgumentParser, action='store_true', help='Use host GPU hardware instead of Swiftshader.') femu_args.add_argument( - '--product-bundle', + '--product', help='Specify a product bundle used for booting the ' 'emulator. Defaults to the terminal product.') femu_args.add_argument('--with-network', action='store_true', help='Run emulator with emulated nic via tun/tap.') + femu_args.add_argument('--everlasting', + action='store_true', + help='If the emulator should be long-living.') + femu_args.add_argument( + '--device-spec', + help='Configure the virtual device to use. They are usually defined in ' + 'the product-bundle/virtual_devices/manifest.json. If this flag is not ' + 'provided or is an empty string, ffx emu will decide the recommended ' + 'spec.') -def create_emulator_from_args(args: argparse.Namespace) -> FfxEmulator: +def create_emulator_from_args( + args: argparse.Namespace) -> AbstractContextManager: """Helper method for initializing an FfxEmulator class with parsed arguments.""" - return FfxEmulator(args.enable_graphics, args.hardware_gpu, - args.product_bundle, args.with_network, args.logs_dir) + return FfxEmulator(args) def main(): """Stand-alone function for starting an emulator.""" + catch_sigterm() logging.basicConfig(level=logging.INFO) parser = argparse.ArgumentParser() register_emulator_args(parser, True) register_log_args(parser) + parser.add_argument('--target-id-only', + action='store_true', + help='Write only the target emulator id to the ' \ + 'stdout. It is usually useful in the unattended ' \ + 'environment.') args = parser.parse_args() with create_emulator_from_args(args) as target_id: - logging.info( - 'Emulator successfully started. You can now run Chrome ' - 'Fuchsia tests with --target-id=%s to target this emulator.', - target_id) - try: - while True: - time.sleep(10000) - except KeyboardInterrupt: - logging.info('Ctrl-C received; shutting down the emulator.') - except SystemExit: - logging.info('SIGTERM received; shutting down the emulator.') + if args.target_id_only: + print(target_id, flush=True) + else: + logging.info( + 'Emulator successfully started. You can now run Chrome ' + 'Fuchsia tests with --target-id=%s to target this emulator.', + target_id) + wait_for_sigterm('shutting down the emulator.') if __name__ == '__main__': diff --git a/build/fuchsia/test/test_connection.py b/build/fuchsia/test/test_connection.py new file mode 100755 index 0000000..2ea4ff0 --- /dev/null +++ b/build/fuchsia/test/test_connection.py @@ -0,0 +1,71 @@ +#!/usr/bin/env vpython3 + +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Tests the connection of a target.""" + +# Note, this is a temporary tool and should be removed in favor of a better way +# to expose the functionality or merge with other use cases of get_ssh_address. + +import logging +import sys +import time + +from typing import Optional + +from boot_device import boot_device, BootMode +from common import run_ffx_command + + +def test_connection(target_id: Optional[str], wait_sec: int = 60) -> None: + """Runs echo tests to verify that the device can be connected to. + + Devices may not be connectable right after being discovered by ffx, e.g. + after a `ffx target wait`, so this function retries up to |wait_sec| before + throwing an exception. + """ + start_sec = time.time() + while time.time() - start_sec < wait_sec: + if run_ffx_command(cmd=('target', 'echo'), + target_id=target_id, + check=False).returncode == 0: + return + time.sleep(10) + + run_ffx_command(cmd=('target', 'echo'), target_id=target_id) + + +def test_device_connection(target_id: Optional[str]) -> None: + """Runs test_connection against the target_id and restarts the device if + it cannot be connected.""" + start_sec = time.time() + while time.time() - start_sec < 1800: + # pylint: disable=bare-except + # First, test_connection with ffx target echo. + try: + test_connection(target_id=target_id, wait_sec=600) + return + except: + # If anything wrong, reboot the device and try again. + try: + boot_device(target_id, BootMode.REGULAR, must_boot=True) + except: + # If unfortunately, the reboot failed, it's still worth + # continuing the test rather than failing here. + pass + logging.warning( + run_ffx_command(cmd=('target', 'wait'), + target_id=target_id, + check=False, + capture_output=True).stdout) + +def main(): + """Test a connection against a fuchsia target via ffx.""" + if len(sys.argv) < 2: + raise ValueError('test_connection.py target') + test_connection(sys.argv[1]) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/build/fuchsia/test/test_runner.py b/build/fuchsia/test/test_runner.py index a4a2f5b..72675c1 100644 --- a/build/fuchsia/test/test_runner.py +++ b/build/fuchsia/test/test_runner.py @@ -20,12 +20,15 @@ def __init__(self, out_dir: str, test_args: Namespace, packages: List[str], - target_id: Optional[str] = None) -> None: + target_id: Optional[str], + package_deps: Optional[List[str]] = None) -> None: self._target_id = target_id self._out_dir = out_dir self._test_args = test_args self._packages = packages self._package_deps = None + if package_deps: + self._package_deps = TestRunner._build_package_deps(package_deps) # TODO(crbug.com/1256503): Remove when all tests are converted to CFv2. @staticmethod @@ -49,22 +52,26 @@ def package_deps(self) -> Dict[str, str]: self._populate_package_deps() return self._package_deps + @staticmethod + def _build_package_deps(package_paths: List[str]) -> Dict[str, str]: + """Retrieve information for all packages listed in |package_paths|.""" + package_deps = {} + for path in package_paths: + package_name = os.path.basename(path).replace('.far', '') + if package_name in package_deps: + assert path == package_deps[package_name] + package_deps[package_name] = path + return package_deps + def _populate_package_deps(self) -> None: """Retrieve information for all packages |self._packages| depend on. """ - package_deps = {} - package_paths = [] for package in self._packages: package_paths.extend(read_package_paths(self._out_dir, package)) - for path in package_paths: - package_name = os.path.basename(path).replace('.far', '') - if package_name in package_deps: - assert path == package_deps[package_name] - package_deps[package_name] = path - self._package_deps = package_deps + self._package_deps = TestRunner._build_package_deps(package_paths) @abstractmethod def run_test(self) -> subprocess.Popen: diff --git a/build/fuchsia/test/test_server.py b/build/fuchsia/test/test_server.py index c2ed3d2..e3af0c5 100644 --- a/build/fuchsia/test/test_server.py +++ b/build/fuchsia/test/test_server.py @@ -110,8 +110,8 @@ def setup_test_server(target_id: Optional[str], test_concurrency: int)\ logging.debug('Starting test server.') - host_port_pair = run_ffx_command(('target', 'get-ssh-address'), - target_id, + host_port_pair = run_ffx_command(cmd=('target', 'get-ssh-address'), + target_id=target_id, capture_output=True).stdout.strip() # The TestLauncher can launch more jobs than the limit specified with diff --git a/build/fuchsia/test_runner.py b/build/fuchsia/test_runner.py deleted file mode 100755 index b6f6794..0000000 --- a/build/fuchsia/test_runner.py +++ /dev/null @@ -1,311 +0,0 @@ -#!/usr/bin/env vpython3 -# -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Deploys and runs a test package on a Fuchsia target.""" - -import argparse -import logging -import os -import shutil -import sys - -import ffx_session -from common_args import AddCommonArgs, AddTargetSpecificArgs, \ - ConfigureLogging, GetDeploymentTargetForArgs -from net_test_server import SetupTestServer -from run_test_package import RunTestPackage -from runner_exceptions import HandleExceptionAndReturnExitCode - -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), - 'test'))) -from compatible_utils import map_filter_file_to_package_file - -DEFAULT_TEST_SERVER_CONCURRENCY = 4 - -TEST_LLVM_PROFILE_DIR = 'llvm-profile' -TEST_PERF_RESULT_FILE = 'test_perf_summary.json' -TEST_RESULT_FILE = 'test_summary.json' - - -class CustomArtifactsTestOutputs(): - """A TestOutputs implementation for CFv2 tests, where tests emit files into - /custom_artifacts that are retrieved from the device automatically via ffx.""" - - def __init__(self, target): - super(CustomArtifactsTestOutputs, self).__init__() - self._target = target - self._ffx_session_context = ffx_session.FfxSession(target._log_manager) - self._ffx_session = None - - def __enter__(self): - self._ffx_session = self._ffx_session_context.__enter__() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self._ffx_session = None - self._ffx_session_context.__exit__(exc_type, exc_val, exc_tb) - return False - - def GetFfxSession(self): - assert self._ffx_session - return self._ffx_session - - def GetDevicePath(self, path): - return '/custom_artifacts/' + path - - def GetOutputDirectory(self): - return self._ffx_session.get_output_dir() - - def GetFile(self, glob, destination): - """Places all files/directories matched by a glob into a destination.""" - directory = self._ffx_session.get_custom_artifact_directory() - if not directory: - logging.error( - 'Failed to parse custom artifact directory from test summary output ' - 'files. Not copying %s from the device', glob) - return - shutil.copy(os.path.join(directory, glob), destination) - - def GetCoverageProfiles(self, destination): - directory = self._ffx_session.get_debug_data_directory() - if not directory: - logging.error( - 'Failed to parse debug data directory from test summary output ' - 'files. Not copying coverage profiles from the device') - return - coverage_dir = os.path.join(directory, TEST_LLVM_PROFILE_DIR) - shutil.copytree(coverage_dir, destination, dirs_exist_ok=True) - - -def AddTestExecutionArgs(arg_parser): - test_args = arg_parser.add_argument_group('testing', - 'Test execution arguments') - test_args.add_argument('--gtest_filter', - help='GTest filter to use in place of any default.') - test_args.add_argument( - '--gtest_repeat', - help='GTest repeat value to use. This also disables the ' - 'test launcher timeout.') - test_args.add_argument( - '--test-launcher-retry-limit', - help='Number of times that test suite will retry failing ' - 'tests. This is multiplicative with --gtest_repeat.') - test_args.add_argument('--test-launcher-print-test-stdio', - choices=['auto', 'always', 'never'], - help='Controls when full test output is printed.' - 'auto means to print it when the test failed.') - test_args.add_argument('--test-launcher-shard-index', - type=int, - default=os.environ.get('GTEST_SHARD_INDEX'), - help='Index of this instance amongst swarming shards.') - test_args.add_argument('--test-launcher-total-shards', - type=int, - default=os.environ.get('GTEST_TOTAL_SHARDS'), - help='Total number of swarming shards of this suite.') - test_args.add_argument('--gtest_break_on_failure', - action='store_true', - default=False, - help='Should GTest break on failure; useful with ' - '--gtest_repeat.') - test_args.add_argument('--single-process-tests', - action='store_true', - default=False, - help='Runs the tests and the launcher in the same ' - 'process. Useful for debugging.') - test_args.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 --out-dir, - # so specifying type=os.path.* will break it. - test_args.add_argument( - '--test-launcher-filter-file', - default=None, - help='Filter file(s) passed to target test process. Use ";" to separate ' - 'multiple filter files ') - test_args.add_argument('--test-launcher-jobs', - type=int, - help='Sets the number of parallel test jobs.') - test_args.add_argument('--test-launcher-summary-output', - help='Where the test launcher will output its json.') - test_args.add_argument('--enable-test-server', - action='store_true', - default=False, - help='Enable Chrome test server spawner.') - test_args.add_argument( - '--test-launcher-bot-mode', - action='store_true', - default=False, - help='Informs the TestLauncher to that it should enable ' - 'special allowances for running on a test bot.') - test_args.add_argument('--isolated-script-test-output', - help='If present, store test results on this path.') - test_args.add_argument( - '--isolated-script-test-perf-output', - help='If present, store chartjson results on this path.') - test_args.add_argument( - '--code-coverage', - default=False, - action='store_true', - help='Gather code coverage information and place it in ' - 'the output directory.') - test_args.add_argument('--code-coverage-dir', - default=os.getcwd(), - help='Directory to place code coverage information. ' - 'Only relevant when --code-coverage set to true. ' - 'Defaults to current directory.') - test_args.add_argument('--gtest_also_run_disabled_tests', - default=False, - action='store_true', - help='Run tests prefixed with DISABLED_') - test_args.add_argument('--test-arg', - dest='test_args', - action='append', - help='Argument for the test process.') - test_args.add_argument('child_args', - nargs='*', - help='Arguments for the test process.') - test_args.add_argument('--use-vulkan', - help='\'native\', \'swiftshader\' or \'none\'.') - - -def main(): - parser = argparse.ArgumentParser() - AddTestExecutionArgs(parser) - AddCommonArgs(parser) - AddTargetSpecificArgs(parser) - args = parser.parse_args() - - # Flag out_dir is required for tests launched with this script. - if not args.out_dir: - raise ValueError("out-dir must be specified.") - - ConfigureLogging(args) - - child_args = [] - if args.test_launcher_shard_index != None: - child_args.append( - '--test-launcher-shard-index=%d' % args.test_launcher_shard_index) - if args.test_launcher_total_shards != None: - child_args.append( - '--test-launcher-total-shards=%d' % args.test_launcher_total_shards) - if args.single_process_tests: - child_args.append('--single-process-tests') - if args.test_launcher_bot_mode: - child_args.append('--test-launcher-bot-mode') - if args.test_launcher_batch_limit: - child_args.append('--test-launcher-batch-limit=%d' % - args.test_launcher_batch_limit) - - # Only set --test-launcher-jobs if the caller specifies it, in general. - # If the caller enables the test-server then we need to launch the right - # number of instances to match the maximum number of parallel test jobs, so - # in that case we set --test-launcher-jobs based on the number of CPU cores - # specified for the emulator to use. - test_concurrency = None - if args.test_launcher_jobs: - test_concurrency = args.test_launcher_jobs - elif args.enable_test_server: - if args.device == 'device': - test_concurrency = DEFAULT_TEST_SERVER_CONCURRENCY - else: - test_concurrency = args.cpu_cores - if test_concurrency: - child_args.append('--test-launcher-jobs=%d' % test_concurrency) - if args.test_launcher_print_test_stdio: - child_args.append('--test-launcher-print-test-stdio=%s' % - args.test_launcher_print_test_stdio) - - if args.gtest_filter: - child_args.append('--gtest_filter=' + args.gtest_filter) - if args.gtest_repeat: - child_args.append('--gtest_repeat=' + args.gtest_repeat) - child_args.append('--test-launcher-timeout=-1') - if args.test_launcher_retry_limit: - child_args.append( - '--test-launcher-retry-limit=' + args.test_launcher_retry_limit) - if args.gtest_break_on_failure: - child_args.append('--gtest_break_on_failure') - if args.gtest_also_run_disabled_tests: - child_args.append('--gtest_also_run_disabled_tests') - if args.test_args: - child_args.extend(args.test_args) - - if args.child_args: - child_args.extend(args.child_args) - - if args.use_vulkan: - child_args.append('--use-vulkan=' + args.use_vulkan) - elif args.target_cpu == 'x64': - # TODO(crbug.com/1261646) Remove once Vulkan is enabled by default. - child_args.append('--use-vulkan=native') - else: - # Use swiftshader on arm64 by default because most arm64 bots currently - # don't support Vulkan emulation. - child_args.append('--use-vulkan=swiftshader') - child_args.append('--ozone-platform=headless') - - try: - with GetDeploymentTargetForArgs(args) as target, \ - CustomArtifactsTestOutputs(target) as test_outputs: - if args.test_launcher_summary_output: - child_args.append('--test-launcher-summary-output=' + - test_outputs.GetDevicePath(TEST_RESULT_FILE)) - if args.isolated_script_test_output: - child_args.append('--isolated-script-test-output=' + - test_outputs.GetDevicePath(TEST_RESULT_FILE)) - if args.isolated_script_test_perf_output: - child_args.append('--isolated-script-test-perf-output=' + - test_outputs.GetDevicePath(TEST_PERF_RESULT_FILE)) - - target.Start() - target.StartSystemLog(args.package) - - if args.test_launcher_filter_file: - # TODO(crbug.com/1279803): Until one can send file to the device when - # running a test, filter files must be read from the test package. - test_launcher_filter_files = map( - map_filter_file_to_package_file, - args.test_launcher_filter_file.split(';')) - child_args.append('--test-launcher-filter-file=' + - ';'.join(test_launcher_filter_files)) - - test_server = None - if args.enable_test_server: - assert test_concurrency - (test_server, - spawner_url_base) = SetupTestServer(target, test_concurrency) - child_args.append('--remote-test-server-spawner-url-base=' + - spawner_url_base) - - returncode = RunTestPackage(target, test_outputs.GetFfxSession(), - args.package, args.package_name, child_args) - - if test_server: - test_server.Stop() - - if args.code_coverage: - test_outputs.GetCoverageProfiles(args.code_coverage_dir) - - if args.test_launcher_summary_output: - test_outputs.GetFile(TEST_RESULT_FILE, - args.test_launcher_summary_output) - - if args.isolated_script_test_output: - test_outputs.GetFile(TEST_RESULT_FILE, args.isolated_script_test_output) - - if args.isolated_script_test_perf_output: - test_outputs.GetFile(TEST_PERF_RESULT_FILE, - args.isolated_script_test_perf_output) - - return returncode - - except: - return HandleExceptionAndReturnExitCode() - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/build/fuchsia/update_images.py b/build/fuchsia/update_images.py index 45168c0..b606b97 100755 --- a/build/fuchsia/update_images.py +++ b/build/fuchsia/update_images.py @@ -4,7 +4,11 @@ # found in the LICENSE file. """Updates the Fuchsia images to the given revision. Should be used in a 'hooks_os' entry so that it only runs when .gclient's target_os includes -'fuchsia'.""" +'fuchsia'. Note, for a smooth transition, this file automatically adds +'-release' at the end of the image gcs file name to eliminate the difference +between product bundle v2 and gce files.""" + +# TODO(crbug.com/1496426): Remove this file. import argparse import itertools @@ -15,10 +19,11 @@ import sys from typing import Dict, Optional -from common import DIR_SOURCE_ROOT -from common import GetHostOsFromPlatform -from common import IMAGES_ROOT -from common import MakeCleanDirectory +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), + 'test'))) + +from common import DIR_SRC_ROOT, IMAGES_ROOT, get_host_os, \ + make_clean_directory from gcs_download import DownloadAndUnpackFromCloudStorage @@ -51,7 +56,7 @@ def VarLookup(local_scope): def GetImageHashList(bucket): """Read filename entries from sdk-hash-files.list (one per line), substitute {platform} in each entry if present, and read from each filename.""" - assert (GetHostOsFromPlatform() == 'linux') + assert (get_host_os() == 'linux') filenames = [ line.strip() for line in ReadFile('sdk-hash-files.list').replace( '{platform}', 'linux_internal').splitlines() @@ -82,7 +87,7 @@ def GetImageHash(bucket): if bucket == 'fuchsia-sdk': hashes = GetImageHashList(bucket) return max(hashes) - deps_file = os.path.join(DIR_SOURCE_ROOT, 'DEPS') + deps_file = os.path.join(DIR_SRC_ROOT, 'DEPS') return ParseDepsFile(deps_file)['vars']['fuchsia_version'].split(':')[1] @@ -160,22 +165,25 @@ def _GetImageOverrideInfo() -> Optional[Dict[str, str]]: } -def GetImageLocationInfo(default_bucket: str) -> Dict[str, str]: +def GetImageLocationInfo(default_bucket: str, + allow_override: bool = True) -> Dict[str, str]: """Figures out where to pull the image from. Defaults to the provided default bucket and generates the hash from defaults. - If sdk_override.txt exists, it uses that bucket instead. + If sdk_override.txt exists (and is allowed) it uses that bucket instead. Args: default_bucket: a given default for what bucket to use + allow_override: allow SDK override to be used. Returns: A dictionary containing the bucket and image_hash """ - # if sdk_override.txt exists, use the image from that bucket - override = _GetImageOverrideInfo() - if override: - return override + # if sdk_override.txt exists (and is allowed) use the image from that bucket. + if allow_override: + override = _GetImageOverrideInfo() + if override: + return override # Use the bucket in sdk-bucket.txt if an entry exists. # Otherwise use the default bucket. @@ -208,6 +216,11 @@ def main(): '--image-root-dir', default=IMAGES_ROOT, help='Specify the root directory of the downloaded images. Optional') + parser.add_argument( + '--allow-override', + action='store_true', + help='Whether sdk_override.txt can be used for fetching the image, if ' + 'it exists.') args = parser.parse_args() logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO) @@ -216,10 +229,16 @@ def main(): if not args.boot_images: return 0 - # Check whether there's Fuchsia support for this platform. - GetHostOsFromPlatform() + for index, item in enumerate(args.boot_images): + # The gclient configuration is in the src-internal and cannot be changed + # atomically with the test script in src. So the update_images.py needs to + # support both scenarios before being fully deprecated for older milestones. + if not item.endswith('-release'): + args.boot_images[index] = item + '-release' - image_info = GetImageLocationInfo(args.default_bucket) + # Check whether there's Fuchsia support for this platform. + get_host_os() + image_info = GetImageLocationInfo(args.default_bucket, args.allow_override) bucket = image_info['bucket'] image_hash = image_info['image_hash'] @@ -234,7 +253,7 @@ def main(): if current_signature != new_signature: logging.info('Downloading Fuchsia images %s from bucket %s...', image_hash, bucket) - MakeCleanDirectory(args.image_root_dir) + make_clean_directory(args.image_root_dir) try: DownloadBootImages(bucket, image_hash, args.boot_images, diff --git a/build/fuchsia/update_images_test.py b/build/fuchsia/update_images_test.py index 49d7f2f..430c4bc 100755 --- a/build/fuchsia/update_images_test.py +++ b/build/fuchsia/update_images_test.py @@ -3,6 +3,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +# TODO(crbug.com/1496426): Remove this file. + import unittest from unittest import mock @@ -76,6 +78,22 @@ def testOverride(self, mock_image_override, mock_override_bucket, actual = GetImageLocationInfo('my-bucket') self.assertEqual(actual, override_info) + def testNoAllowOverride(self, mock_image_override, mock_override_bucket, + mock_image_hash): + override_info = { + 'bucket': 'override-bucket', + 'image_hash': 'override-hash', + } + mock_image_override.return_value = override_info + mock_override_bucket.return_value = None + mock_image_hash.return_value = 'image-hash' + + actual = GetImageLocationInfo('my-bucket', allow_override=False) + self.assertEqual(actual, { + 'bucket': 'my-bucket', + 'image_hash': 'image-hash', + }) + if __name__ == '__main__': unittest.main() diff --git a/build/fuchsia/update_product_bundles.py b/build/fuchsia/update_product_bundles.py index d9790a3..5c24fdc 100755 --- a/build/fuchsia/update_product_bundles.py +++ b/build/fuchsia/update_product_bundles.py @@ -10,47 +10,27 @@ import json import logging import os -import re -import subprocess import sys -from contextlib import ExitStack +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), + 'test'))) + import common -import ffx_session -import log_manager +import update_sdk +from compatible_utils import running_unattended -_PRODUCT_BUNDLES = [ - 'core.x64-dfv2', - 'terminal.qemu-arm64', - 'terminal.qemu-x64', - 'workstation_eng.chromebook-x64', - 'workstation_eng.chromebook-x64-dfv2', - 'workstation_eng.qemu-x64', - 'workstation_eng.x64', -] # TODO(crbug/1361089): Remove when the old scripts have been deprecated. _IMAGE_TO_PRODUCT_BUNDLE = { - 'core.x64-dfv2-release': 'core.x64-dfv2', - 'qemu.arm64': 'terminal.qemu-arm64', - 'qemu.x64': 'terminal.qemu-x64', - 'workstation_eng.chromebook-x64-dfv2-release': - 'workstation_eng.chromebook-x64-dfv2', - 'workstation_eng.chromebook-x64-release': 'workstation_eng.chromebook-x64', - 'workstation_eng.qemu-x64-release': 'workstation_eng.qemu-x64', + 'qemu.arm64': + 'terminal.qemu-arm64', + 'qemu.x64': + 'terminal.x64', } -_PRODUCT_BUNDLE_FIX_INSTRUCTIONS = ( - 'This could be because an earlier version of the product bundle was not ' - 'properly removed. Run |ffx product-bundle list| and |ffx repository list|,' - ' remove the available product bundles listed using ' - '|ffx product-bundle remove| and |ffx repository remove|, ' - f'remove the directory {common.IMAGES_ROOT} and rerun hooks/this script.') - - # TODO(crbug/1361089): Remove when the old scripts have been deprecated. -def convert_to_product_bundle(images_list): +def convert_to_products(images_list): """Convert image names in the SDK to product bundle names.""" product_bundle_list = [] @@ -58,42 +38,33 @@ def convert_to_product_bundle(images_list): if image in _IMAGE_TO_PRODUCT_BUNDLE: logging.warning(f'Image name {image} has been deprecated. Use ' f'{_IMAGE_TO_PRODUCT_BUNDLE.get(image)} instead.') - product_bundle_list.append(_IMAGE_TO_PRODUCT_BUNDLE.get(image, image)) + product_bundle_list.append(_IMAGE_TO_PRODUCT_BUNDLE[image]) + else: + if image.endswith('-release'): + image = image[:-len('-release')] + logging.warning(f'Image name {image}-release has been deprecated. Use ' + f'{image} instead.') + product_bundle_list.append(image) return product_bundle_list -def get_hash_from_sdk(): - """Retrieve version info from the SDK.""" - - version_file = os.path.join(common.SDK_ROOT, 'meta', 'manifest.json') - if not os.path.exists(version_file): - raise RuntimeError('Could not detect version file. Make sure the SDK has ' - 'been downloaded') - with open(version_file, 'r') as f: - return json.load(f)['id'] - - -def remove_repositories(repo_names_to_remove, ffx_runner): +def remove_repositories(repo_names_to_remove): """Removes given repos from repo list. Repo MUST be present in list to succeed. Args: repo_names_to_remove: List of repo names (as strings) to remove. - ffx_runner: ffx_session.FfxRunner instance to run the command. """ for repo_name in repo_names_to_remove: - ffx_runner.run_ffx(('repository', 'remove', repo_name), check=True) + common.run_ffx_command(cmd=('repository', 'remove', repo_name), check=True) -def get_repositories(ffx_runner): +def get_repositories(): """Lists repositories that are available on disk. Also prunes repositories that are listed, but do not have an actual packages directory. - Args: - ffx_runner: An FfxRunner instance. - Returns: List of dictionaries containing info about the repositories. They have the following structure: @@ -107,7 +78,9 @@ def get_repositories(ffx_runner): """ repos = json.loads( - ffx_runner.run_ffx(('--machine', 'json', 'repository', 'list')).strip()) + common.run_ffx_command(cmd=('--machine', 'json', 'repository', 'list'), + check=True, + capture_output=True).stdout.strip()) to_prune = set() sdk_root_abspath = os.path.abspath(os.path.dirname(common.SDK_ROOT)) for repo in repos: @@ -122,145 +95,30 @@ def get_repositories(ffx_runner): repos = [repo for repo in repos if repo['name'] not in to_prune] - remove_repositories(to_prune, ffx_runner) + remove_repositories(to_prune) return repos -def update_repositories_list(ffx_runner): - """Used to prune stale repositories.""" - get_repositories(ffx_runner) - - -def remove_product_bundle(product_bundle, ffx_runner): - """Removes product-bundle given.""" - ffx_runner.run_ffx(('product-bundle', 'remove', '-f', product_bundle)) - - -def get_product_bundle_urls(ffx_runner): - """Retrieves URLs of available product-bundles. - - Args: - ffx_runner: An FfxRunner instance. +def get_current_signature(image_dir): + """Determines the current version of the image, if it exists. Returns: - List of dictionaries of structure, indicating whether the product-bundle - has been downloaded. - { - 'url': , - 'downloaded': - } + The current version, or None if the image is non-existent. """ - # TODO(fxb/115328): Replaces with JSON API when available. - bundles = ffx_runner.run_ffx(('product-bundle', 'list'), check=True) - urls = [ - line.strip() for line in bundles.splitlines() if 'gs://fuchsia' in line - ] - structured_urls = [] - for url in urls: - downloaded = False - if '*' in url: - downloaded = True - url = url.split(' ')[1] - structured_urls.append({'downloaded': downloaded, 'url': url.strip()}) - return structured_urls + version_file = os.path.join(image_dir, 'product_bundle.json') + if os.path.exists(version_file): + with open(version_file) as f: + return json.load(f)['product_version'] + return None -def keep_product_bundles_by_sdk_version(sdk_version, ffx_runner): - """Prunes product bundles not containing the sdk_version given.""" - urls = get_product_bundle_urls(ffx_runner) - for url in urls: - if url['downloaded'] and sdk_version not in url['url']: - remove_product_bundle(url['url'], ffx_runner) - - -def get_product_bundles(ffx_runner): - """Lists all downloaded product-bundles for the given SDK. - - Cross-references the repositories with downloaded packages and the stated - downloaded product-bundles to validate whether or not a product-bundle is - present. Prunes invalid product-bundles with each call as well. - - Args: - ffx_runner: An FfxRunner instance. - - Returns: - List of strings of product-bundle names downloaded and that FFX is aware - of. - """ - downloaded_bundles = [] - - for url in get_product_bundle_urls(ffx_runner): - if url['downloaded']: - # The product is separated by a # - product = url['url'].split('#') - downloaded_bundles.append(product[1]) - - # For each downloaded bundle, need to verify whether ffx repository believes - # it exists. - to_prune_bundles_index = [] - repos = get_repositories(ffx_runner) - - # Some repo names do not match product-bundle names due to underscores. - # Normalize them both. - repo_names = set([repo['name'].replace('-', '_') for repo in repos]) - - def bundle_is_active(name): - # Returns True if the product-bundle named `name` is present in a package - # repository (assuming it is downloaded already); otherwise, removes the - # product-bundle and returns False. - if name.replace('-', '_') in repo_names: - return True - - remove_product_bundle(name, ffx_runner) - return False - - return list(filter(bundle_is_active, downloaded_bundles)) - - -def download_product_bundle(product_bundle, ffx_runner): - """Download product bundles using the SDK.""" - # This also updates the repository list, in case it is stale. - update_repositories_list(ffx_runner) - - try: - ffx_runner.run_ffx( - ('product-bundle', 'get', product_bundle, '--force-repo')) - except subprocess.CalledProcessError as cpe: - logging.error('Product bundle download has failed. ' + - _PRODUCT_BUNDLE_FIX_INSTRUCTIONS) - raise - - -def get_current_signature(ffx_runner): - """Determines the SDK version of the product-bundles associated with the SDK. - - Parses this information from the URLs of the product-bundle. - - Args: - ffx_runner: An FfxRunner instance. - - Returns: - An SDK version string, or None if no product-bundle versions are downloaded. - """ - product_bundles = get_product_bundles(ffx_runner) - if not product_bundles: - logging.info('No product bundles - signature will default to None') - return None - product_bundle_urls = get_product_bundle_urls(ffx_runner) - - # Get the numbers, hope they're the same. - signatures = set() - for bundle in product_bundle_urls: - m = re.search(r'/(\d+\.\d+\.\d+.\d+|\d+)/', bundle['url']) - assert m, 'Must have a signature in each URL' - signatures.add(m.group(1)) - - if len(signatures) > 1: - raise RuntimeError('Found more than one product signature. ' + - _PRODUCT_BUNDLE_FIX_INSTRUCTIONS) - - return next(iter(signatures)) if signatures else None +# VisibleForTesting +def internal_hash(): + hash_filename = os.path.join(os.path.dirname(__file__), + 'linux_internal.sdk.sha1') + return (open(hash_filename, 'r').read().strip() + if os.path.exists(hash_filename) else '') def main(): @@ -270,98 +128,86 @@ def main(): action='store_true', help='Enable debug-level logging.') parser.add_argument( - 'product_bundles', + 'products', type=str, help='List of product bundles to download, represented as a comma ' 'separated list.') + parser.add_argument( + '--internal', + action='store_true', + help='Whether the images are coming from internal, it impacts version ' + 'file, bucket and download location.') args = parser.parse_args() logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO) # Check whether there's Fuchsia support for this platform. - common.GetHostOsFromPlatform() - - new_product_bundles = convert_to_product_bundle( - args.product_bundles.split(',')) - logging.info('Searching for the following product bundles: %s', - str(new_product_bundles)) - for pb in new_product_bundles: - if pb not in _PRODUCT_BUNDLES: - raise ValueError(f'{pb} is not part of the Fuchsia product bundle.') - - if '*' in args.product_bundles: - raise ValueError('Wildcards are no longer supported, all product bundles ' - 'need to be explicitly listed. The full list can be ' - 'found in the DEPS file.') - - with ExitStack() as stack: - ffx_runner = ffx_session.FfxRunner(log_manager.LogManager(None)) - - # Re-set the directory to which product bundles are downloaded so that - # these bundles are located inside the Chromium codebase. - ffx_runner.run_ffx( - ('config', 'set', 'pbms.storage.path', common.IMAGES_ROOT)) - - logging.debug('Checking for override file') - - # TODO(crbug/1380807): Remove when product bundles can be downloaded - # for custom SDKs without editing metadata - override_file = os.path.join(os.path.dirname(__file__), 'sdk_override.txt') - if os.path.isfile(override_file): - with open(override_file) as f: - pb_metadata = f.read().strip().split('\n') - pb_metadata.append('{sdk.root}/*.json') - stack.enter_context( - ffx_runner.scoped_config('pbms.metadata', json.dumps((pb_metadata)))) - logging.debug('Applied overrides') - - logging.debug('Getting new SDK hash') - new_sdk_hash = get_hash_from_sdk() - keep_product_bundles_by_sdk_version(new_sdk_hash, ffx_runner) - logging.debug('Checking for current signature') - curr_signature = get_current_signature(ffx_runner) - - current_images = get_product_bundles(ffx_runner) - - # If SDK versions match, remove the product bundles that are no longer - # needed and download missing ones. - if curr_signature == new_sdk_hash: - logging.debug('Current images: %s, desired images %s', - str(current_images), str(new_product_bundles)) - for image in current_images: - if image not in new_product_bundles: - logging.debug('Removing no longer needed Fuchsia image %s' % image) - remove_product_bundle(image, ffx_runner) - - bundles_to_download = set(new_product_bundles) - \ - set(current_images) - for bundle in bundles_to_download: - logging.debug('Downloading image: %s', image) - download_product_bundle(bundle, ffx_runner) - - return 0 - - # If SDK versions do not match, remove all existing product bundles - # and download the ones required. - for pb in current_images: - remove_product_bundle(pb, ffx_runner) - - logging.debug('Make clean images root') - curr_subdir = [] - if os.path.exists(common.IMAGES_ROOT): - curr_subdir = os.listdir(common.IMAGES_ROOT) - common.MakeCleanDirectory(common.IMAGES_ROOT) - - for pb in new_product_bundles: - logging.debug('Downloading bundle: %s', pb) - download_product_bundle(pb, ffx_runner) - - current_pb = get_product_bundles(ffx_runner) - - diff = set(current_pb) - set(new_product_bundles) - assert set(current_pb) == set(new_product_bundles), ( - 'Failed to download expected set of product-bundles. ' - f'Expected {new_product_bundles}, got {current_pb}') + common.get_host_os() + + new_products = convert_to_products(args.products.split(',')) + logging.info('Searching for the following products: %s', str(new_products)) + + logging.debug('Getting new SDK hash') + if args.internal: + new_hash = internal_hash() + else: + new_hash = common.get_hash_from_sdk() + + auth_args = [ + '--auth', + os.path.join(os.path.dirname(__file__), 'get_auth_token.py') + ] if args.internal and running_unattended() else [] + if args.internal and not running_unattended(): + print('*** product bundle v2 requires authentication with your account and ' + 'it should already open a browser window to do it if you have not ' + 'granted the permission yet.') + for product in new_products: + prod, board = product.split('.', 1) + if prod.startswith('smart_display_') and board in [ + 'astro', 'sherlock', 'nelson' + ]: + # This is a hacky way of keeping the files into the folders matching + # the original image name, since the definition is unfortunately in + # src-internal. Likely we can download two copies for a smooth + # transition, but it would be easier to keep it as-is during the ffx + # product v2 migration. + # TODO(crbug.com/1496426): Migrate the image download folder away from the + # following hack. + prod, board = board + '-release', prod + if args.internal: + # sdk_override.txt does not work for internal images. + override_url = None + image_dir = os.path.join(common.INTERNAL_IMAGES_ROOT, prod, board) + else: + override_url = update_sdk.GetSDKOverrideGCSPath() + if override_url: + logging.debug('Using override file') + # TODO(zijiehe): Convert to removesuffix once python 3.9 is supported. + if override_url.endswith('/sdk'): + override_url = override_url[:-len('/sdk')] + image_dir = os.path.join(common.IMAGES_ROOT, prod, board) + curr_signature = get_current_signature(image_dir) + + if not override_url and curr_signature == new_hash: + continue + + common.make_clean_directory(image_dir) + base_url = 'gs://{bucket}/development/{new_hash}'.format( + bucket='fuchsia-sdk' if args.internal else 'fuchsia', new_hash=new_hash) + lookup_output = common.run_ffx_command(cmd=[ + '--machine', 'json', 'product', 'lookup', product, new_hash, + '--base-url', override_url or base_url + ] + auth_args, + check=True, + capture_output=True).stdout.strip() + download_url = json.loads(lookup_output)['transfer_manifest_url'] + # The download_url is purely a timestamp based gs location and is fairly + # meaningless, so we log the base_url instead which contains the sdk version + # if it's not coming from the sdk_override.txt file. + logging.info(f'Downloading {product} from {base_url} and {download_url}.') + common.run_ffx_command( + cmd=['product', 'download', download_url, image_dir] + auth_args, + check=True) return 0 diff --git a/build/fuchsia/update_product_bundles_test.py b/build/fuchsia/update_product_bundles_test.py index 524e8ac..f395b20 100755 --- a/build/fuchsia/update_product_bundles_test.py +++ b/build/fuchsia/update_product_bundles_test.py @@ -6,22 +6,39 @@ import io import json import os +import sys import unittest from unittest import mock -from parameterized import parameterized +import update_product_bundles + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), + 'test'))) import common -import ffx_session -import update_product_bundles class TestUpdateProductBundles(unittest.TestCase): + def setUp(self): + # By default, test in attended mode. + os.environ.pop('SWARMING_SERVER', None) + ffx_mock = mock.Mock() + ffx_mock.returncode = 0 + self._ffx_patcher = mock.patch('common.run_ffx_command', + return_value=ffx_mock) + self._ffx_mock = self._ffx_patcher.start() + self.addCleanup(self._ffx_mock.stop) + def testConvertToProductBundleDefaultsUnknownImage(self): self.assertEqual( - update_product_bundles.convert_to_product_bundle(['unknown-image']), + update_product_bundles.convert_to_products(['unknown-image']), ['unknown-image']) + def testConvertToProductBundleRemovesReleaseSuffix(self): + self.assertEqual( + update_product_bundles.convert_to_products( + ['smart_display_eng.astro-release']), ['smart_display_eng.astro']) + def testConvertToProductBundleWarnsDeprecated(self): with self.assertLogs(level='WARNING') as logs: deprecated_images = [ @@ -29,45 +46,24 @@ def testConvertToProductBundleWarnsDeprecated(self): 'workstation_eng.chromebook-x64-release' ] self.assertEqual( - update_product_bundles.convert_to_product_bundle(deprecated_images), [ - 'terminal.qemu-arm64', 'terminal.qemu-x64', 'core.x64-dfv2', + update_product_bundles.convert_to_products(deprecated_images), [ + 'terminal.qemu-arm64', 'terminal.x64', 'core.x64-dfv2', 'workstation_eng.chromebook-x64' ]) for i, deprecated_image in enumerate(deprecated_images): self.assertIn(f'Image name {deprecated_image} has been deprecated', logs.output[i]) - @mock.patch('builtins.open') - @mock.patch('os.path.exists') - def testGetHashFromSDK(self, mock_exists, mock_open): - mock_open.return_value = io.StringIO(json.dumps({'id': 'foo-bar'})) - mock_exists.return_value = True - - self.assertEqual(update_product_bundles.get_hash_from_sdk(), 'foo-bar') - - manifest_file = os.path.join(common.SDK_ROOT, 'meta', 'manifest.json') - mock_exists.assert_called_once_with(manifest_file) - mock_open.assert_called_once_with(manifest_file, 'r') - - @mock.patch('builtins.open') - @mock.patch('os.path.exists') - def testGetHashFromSDKRaisesErrorIfNoManifestExists(self, mock_exists, - mock_open): - mock_exists.return_value = False - self.assertRaises(RuntimeError, update_product_bundles.get_hash_from_sdk) + @mock.patch('common.run_ffx_command') + def testRemoveRepositoriesRunsRemoveOnGivenRepos(self, ffx_mock): + update_product_bundles.remove_repositories(['foo', 'bar', 'fizz', 'buzz']) - def testRemoveRepositoriesRunsRemoveOnGivenRepos(self): - ffx_runner = mock.create_autospec(ffx_session.FfxRunner, instance=True) - - update_product_bundles.remove_repositories(['foo', 'bar', 'fizz', 'buzz'], - ffx_runner) - - ffx_runner.run_ffx.assert_has_calls([ - mock.call(('repository', 'remove', 'foo'), check=True), - mock.call(('repository', 'remove', 'bar'), check=True), - mock.call(('repository', 'remove', 'fizz'), check=True), - mock.call(('repository', 'remove', 'buzz'), check=True), + ffx_mock.assert_has_calls([ + mock.call(cmd=('repository', 'remove', 'foo'), check=True), + mock.call(cmd=('repository', 'remove', 'bar'), check=True), + mock.call(cmd=('repository', 'remove', 'fizz'), check=True), + mock.call(cmd=('repository', 'remove', 'buzz'), check=True), ]) @mock.patch('os.path.exists') @@ -75,9 +71,8 @@ def testRemoveRepositoriesRunsRemoveOnGivenRepos(self): def testGetRepositoriesPrunesReposThatDoNotExist(self, mock_abspath, mock_exists): with mock.patch('common.SDK_ROOT', 'some/path'): - ffx_runner = mock.create_autospec(ffx_session.FfxRunner, instance=True) - ffx_runner.run_ffx.return_value = json.dumps([{ - "name": "terminal.qemu-x64", + self._ffx_mock.return_value.stdout = json.dumps([{ + "name": "terminal.x64", "spec": { "type": "pm", "path": "some/path/that/exists" @@ -92,194 +87,233 @@ def testGetRepositoriesPrunesReposThatDoNotExist(self, mock_abspath, mock_exists.side_effect = [True, False] mock_abspath.side_effect = lambda x: x - self.assertEqual(update_product_bundles.get_repositories(ffx_runner), - [{ - "name": "terminal.qemu-x64", - "spec": { - "type": "pm", - "path": "some/path/that/exists" - } - }]) + self.assertEqual(update_product_bundles.get_repositories(), [{ + "name": "terminal.x64", + "spec": { + "type": "pm", + "path": "some/path/that/exists" + } + }]) - ffx_runner.run_ffx.assert_has_calls([ - mock.call(('--machine', 'json', 'repository', 'list')), - mock.call(('repository', 'remove', 'workstation-eng.chromebook-x64'), + self._ffx_mock.assert_has_calls([ + mock.call(cmd=('--machine', 'json', 'repository', 'list'), + capture_output=True, + check=True), + mock.call(cmd=('repository', 'remove', + 'workstation-eng.chromebook-x64'), check=True) ]) - def testRemoveProductBundle(self): - ffx_runner = mock.create_autospec(ffx_session.FfxRunner, instance=True) - - update_product_bundles.remove_product_bundle('some-bundle-foo-bar', - ffx_runner) - - ffx_runner.run_ffx.assert_called_once_with( - ('product-bundle', 'remove', '-f', 'some-bundle-foo-bar')) - - def _InitFFXRunWithProductBundleList(self, sdk_version='10.20221114.2.1'): - ffx_runner = mock.create_autospec(ffx_session.FfxRunner, instance=True) - - ffx_runner.run_ffx.return_value = f""" - gs://fuchsia/{sdk_version}/bundles.json#workstation_eng.qemu-x64 - gs://fuchsia/{sdk_version}/bundles.json#workstation_eng.chromebook-x64-dfv2 -* gs://fuchsia/{sdk_version}/bundles.json#workstation_eng.chromebook-x64 -* gs://fuchsia/{sdk_version}/bundles.json#terminal.qemu-x64 - gs://fuchsia/{sdk_version}/bundles.json#terminal.qemu-arm64 -* gs://fuchsia/{sdk_version}/bundles.json#core.x64-dfv2 - -*No need to fetch with `ffx product-bundle get ...`. - """ - return ffx_runner - - def testGetProductBundleUrlsMarksDesiredAsDownloaded(self): - urls = update_product_bundles.get_product_bundle_urls( - self._InitFFXRunWithProductBundleList()) - expected_urls = [{ - 'url': - 'gs://fuchsia/10.20221114.2.1/bundles.json#workstation_eng.qemu-x64', - 'downloaded': False, - }, { - 'url': ('gs://fuchsia/10.20221114.2.1/bundles.json#workstation_eng.' - 'chromebook-x64-dfv2'), - 'downloaded': - False, - }, { - 'url': ('gs://fuchsia/10.20221114.2.1/bundles.json#workstation_eng.' - 'chromebook-x64'), - 'downloaded': - True, - }, { - 'url': 'gs://fuchsia/10.20221114.2.1/bundles.json#terminal.qemu-x64', - 'downloaded': True, - }, { - 'url': 'gs://fuchsia/10.20221114.2.1/bundles.json#terminal.qemu-arm64', - 'downloaded': False, - }, { - 'url': 'gs://fuchsia/10.20221114.2.1/bundles.json#core.x64-dfv2', - 'downloaded': True, - }] - - for i, url in enumerate(urls): - self.assertEqual(url, expected_urls[i]) - - @mock.patch('update_product_bundles.get_repositories') - def testGetProductBundlesExtractsProductBundlesFromURLs(self, mock_get_repos): - ffx_runner = self._InitFFXRunWithProductBundleList() - mock_get_repos.return_value = [{ - 'name': 'workstation-eng.chromebook-x64' - }, { - 'name': 'terminal.qemu-x64' - }, { - 'name': 'core.x64-dfv2' - }] - - self.assertEqual( - set(update_product_bundles.get_product_bundles(ffx_runner)), - set([ - 'workstation_eng.chromebook-x64', - 'terminal.qemu-x64', - 'core.x64-dfv2', - ])) - - @mock.patch('update_product_bundles.get_repositories') - def testGetProductBundlesExtractsProductBundlesFromURLsFiltersMissingRepos( - self, mock_get_repos): - ffx_runner = self._InitFFXRunWithProductBundleList() - - # This will be missing two repos from the bundle list: - # core and terminal.qemu-x64 - # Additionally, workstation-eng != workstation_eng, but they will be treated - # as the same product-bundle - mock_get_repos.return_value = [{ - 'name': 'workstation-eng.chromebook-x64' - }, { - 'name': 'terminal.qemu-arm64' - }] - - self.assertEqual(update_product_bundles.get_product_bundles(ffx_runner), - ['workstation_eng.chromebook-x64']) - ffx_runner.run_ffx.assert_has_calls([ - mock.call(('product-bundle', 'remove', '-f', 'terminal.qemu-x64')), - mock.call(('product-bundle', 'remove', '-f', 'core.x64-dfv2')), - ], - any_order=True) - - @mock.patch('update_product_bundles.update_repositories_list') - def testDownloadProductBundleUpdatesRepoListBeforeCall( - self, mock_update_repo): - ffx_runner = mock.create_autospec(ffx_session.FfxRunner, instance=True) - mock_sequence = mock.Mock() - mock_sequence.attach_mock(mock_update_repo, 'update_repo_list') - mock_sequence.attach_mock(ffx_runner.run_ffx, 'run_ffx') - - update_product_bundles.download_product_bundle('some-bundle', ffx_runner) - - mock_sequence.assert_has_calls([ - mock.call.update_repo_list(ffx_runner), - mock.call.run_ffx( - ('product-bundle', 'get', 'some-bundle', '--force-repo')) + @mock.patch('update_product_bundles.running_unattended', return_value=True) + # Disallow reading sdk_override. + @mock.patch('os.path.isfile', return_value=False) + @mock.patch('update_product_bundles.internal_hash', return_value='1.1.1') + def testLookupAndDownloadWithAuth(self, *_): + try: + common.get_host_os() + except: + # Ignore unsupported platforms. common.get_host_os used in + # update_product_bundles.main throws an unsupported exception. + return + auth_file = os.path.abspath( + os.path.join(os.path.dirname(__file__), 'get_auth_token.py')) + self._ffx_mock.return_value.stdout = json.dumps({ + "name": "core.x64", + "product_version": "17.20240106.2.1", + "transfer_manifest_url": "http://download-url" + }) + + with mock.patch( + 'sys.argv', + ['update_product_bundles.py', 'terminal.x64', '--internal']): + update_product_bundles.main() + self._ffx_mock.assert_has_calls([ + mock.call(cmd=[ + '--machine', 'json', 'product', 'lookup', 'terminal.x64', '1.1.1', + '--base-url', f'gs://fuchsia-sdk/development/1.1.1', '--auth', + auth_file + ], + check=True, + capture_output=True), + mock.call(cmd=[ + 'product', 'download', 'http://download-url', + os.path.join(common.INTERNAL_IMAGES_ROOT, 'terminal', 'x64'), + '--auth', auth_file + ], + check=True) ]) - @mock.patch('update_product_bundles.get_product_bundle_urls') - def testFilterProductBundleURLsRemovesBundlesWithoutGivenString( - self, mock_get_urls): - ffx_runner = mock.create_autospec(ffx_session.FfxRunner, instance=True) - mock_get_urls.return_value = [ - { - 'url': 'some-url-has-buzz', - 'downloaded': True, - }, - { - 'url': 'some-url-to-remove-has-foo', - 'downloaded': True, - }, - { - 'url': 'some-url-to-not-remove-has-foo', - 'downloaded': False, - }, - ] - update_product_bundles.keep_product_bundles_by_sdk_version( - 'buzz', ffx_runner) - ffx_runner.run_ffx.assert_called_once_with( - ('product-bundle', 'remove', '-f', 'some-url-to-remove-has-foo')) - - @mock.patch('update_product_bundles.get_repositories') - def testGetCurrentSignatureReturnsNoneIfNoProductBundles( - self, mock_get_repos): - ffx_runner = self._InitFFXRunWithProductBundleList() - - # Forces no product-bundles - mock_get_repos.return_value = [] - - # Mutes logs - with self.assertLogs(): - self.assertIsNone( - update_product_bundles.get_current_signature(ffx_runner)) - - @mock.patch('update_product_bundles.get_repositories') - def testGetCurrentSignatureParsesVersionCorrectly(self, mock_get_repos): - ffx_runner = self._InitFFXRunWithProductBundleList() - mock_get_repos.return_value = [{ - 'name': 'workstation-eng.chromebook-x64' - }, { - 'name': 'terminal.qemu-x64' - }] + @mock.patch('common.get_hash_from_sdk', return_value='2.2.2') + @mock.patch('update_product_bundles.get_current_signature', + return_value='2.2.2') + @mock.patch('update_sdk.GetSDKOverrideGCSPath', return_value=None) + def testIgnoreDownloadImagesWithSameHash(self, *_): + try: + common.get_host_os() + except: + # Ignore unsupported platforms. common.get_host_os used in + # update_product_bundles.main throws an unsupported exception. + return + with mock.patch('sys.argv', ['update_product_bundles.py', 'terminal.x64']): + update_product_bundles.main() + self.assertFalse(self._ffx_mock.called) + + @mock.patch('common.get_hash_from_sdk', return_value='2.2.2') + @mock.patch('update_product_bundles.get_current_signature', + return_value='0.0') + @mock.patch('update_sdk.GetSDKOverrideGCSPath', return_value=None) + def testDownloadImagesWithDifferentHash(self, *_): + try: + common.get_host_os() + except: + # Ignore unsupported platforms. common.get_host_os used in + # update_product_bundles.main throws an unsupported exception. + return + self._ffx_mock.return_value.stdout = json.dumps({ + "name": + "core.x64", + "product_version": + "17.20240106.2.1", + "transfer_manifest_url": + "http://download-url" + }) + with mock.patch('sys.argv', ['update_product_bundles.py', 'terminal.x64']): + update_product_bundles.main() + self._ffx_mock.assert_has_calls([ + mock.call(cmd=[ + '--machine', 'json', 'product', 'lookup', 'terminal.x64', '2.2.2', + '--base-url', 'gs://fuchsia/development/2.2.2' + ], + check=True, + capture_output=True), + mock.call(cmd=[ + 'product', 'download', 'http://download-url', + os.path.join(common.IMAGES_ROOT, 'terminal', 'x64') + ], + check=True) + ]) - self.assertEqual('10.20221114.2.1', - update_product_bundles.get_current_signature(ffx_runner)) + @mock.patch('update_sdk.GetSDKOverrideGCSPath', + return_value='gs://my-bucket/sdk') + @mock.patch('common.get_hash_from_sdk', return_value='2.2.2') + def testSDKOverrideForSDKImages(self, *_): + try: + common.get_host_os() + except: + # Ignore unsupported platforms. common.get_host_os used in + # update_product_bundles.main throws an unsupported exception. + return + self._ffx_mock.return_value.stdout = json.dumps({ + "name": + "core.x64", + "product_version": + "17.20240106.2.1", + "transfer_manifest_url": + "http://download-url" + }) + with mock.patch('sys.argv', ['update_product_bundles.py', 'terminal.x64']): + update_product_bundles.main() + self._ffx_mock.assert_has_calls([ + mock.call(cmd=[ + '--machine', 'json', 'product', 'lookup', 'terminal.x64', '2.2.2', + '--base-url', 'gs://my-bucket' + ], + check=True, + capture_output=True), + mock.call(cmd=[ + 'product', 'download', 'http://download-url', + os.path.join(common.IMAGES_ROOT, 'terminal', 'x64') + ], + check=True) + ]) - @mock.patch('update_product_bundles.get_repositories') - def testGetCurrentSignatureParsesCustomArtifactsCorrectlys( - self, mock_get_repos): - ffx_runner = self._InitFFXRunWithProductBundleList(sdk_version='51390009') - mock_get_repos.return_value = [{ - 'name': 'workstation-eng.chromebook-x64' - }, { - 'name': 'terminal.qemu-x64' - }] + @mock.patch('update_product_bundles.internal_hash', return_value='1.1.1') + @mock.patch('update_product_bundles.get_current_signature', + return_value='1.1.1') + def testIgnoreDownloadInternalImagesWithSameHash(self, *_): + try: + common.get_host_os() + except: + # Ignore unsupported platforms. common.get_host_os used in + # update_product_bundles.main throws an unsupported exception. + return + with mock.patch( + 'sys.argv', + ['update_product_bundles.py', 'terminal.x64', '--internal']): + update_product_bundles.main() + self.assertFalse(self._ffx_mock.called) + + @mock.patch('update_product_bundles.get_current_signature', + return_value='0.0') + @mock.patch('update_product_bundles.internal_hash', return_value='1.1.1') + def testDownloadInternalImagesWithDifferentHash(self, *_): + try: + common.get_host_os() + except: + # Ignore unsupported platforms. common.get_host_os used in + # update_product_bundles.main throws an unsupported exception. + return + self._ffx_mock.return_value.stdout = json.dumps({ + "name": + "core.x64", + "product_version": + "17.20240106.2.1", + "transfer_manifest_url": + "http://download-url" + }) + with mock.patch( + 'sys.argv', + ['update_product_bundles.py', 'terminal.x64', '--internal']): + update_product_bundles.main() + self._ffx_mock.assert_has_calls([ + mock.call(cmd=[ + '--machine', 'json', 'product', 'lookup', 'terminal.x64', '1.1.1', + '--base-url', 'gs://fuchsia-sdk/development/1.1.1' + ], + check=True, + capture_output=True), + mock.call(cmd=[ + 'product', 'download', 'http://download-url', + os.path.join(common.INTERNAL_IMAGES_ROOT, 'terminal', 'x64') + ], + check=True) + ]) - self.assertEqual('51390009', - update_product_bundles.get_current_signature(ffx_runner)) + @mock.patch('update_sdk.GetSDKOverrideGCSPath', + return_value='gs://my-bucket/sdk') + @mock.patch('update_product_bundles.internal_hash', return_value='1.1.1') + def testIgnoreSDKOverrideForInternalImages(self, *_): + try: + common.get_host_os() + except: + # Ignore unsupported platforms. common.get_host_os used in + # update_product_bundles.main throws an unsupported exception. + return + self._ffx_mock.return_value.stdout = json.dumps({ + "name": + "core.x64", + "product_version": + "17.20240106.2.1", + "transfer_manifest_url": + "http://download-url" + }) + with mock.patch( + 'sys.argv', + ['update_product_bundles.py', 'terminal.x64', '--internal']): + update_product_bundles.main() + self._ffx_mock.assert_has_calls([ + mock.call(cmd=[ + '--machine', 'json', 'product', 'lookup', 'terminal.x64', '1.1.1', + '--base-url', 'gs://fuchsia-sdk/development/1.1.1' + ], + check=True, + capture_output=True), + mock.call(cmd=[ + 'product', 'download', 'http://download-url', + os.path.join(common.INTERNAL_IMAGES_ROOT, 'terminal', 'x64') + ], + check=True) + ]) if __name__ == '__main__': diff --git a/build/fuchsia/update_sdk.py b/build/fuchsia/update_sdk.py index f2e6692..8be91ff 100755 --- a/build/fuchsia/update_sdk.py +++ b/build/fuchsia/update_sdk.py @@ -7,6 +7,7 @@ 'fuchsia'.""" import argparse +import json import logging import os import platform @@ -14,12 +15,15 @@ import sys from typing import Optional -from common import GetHostOsFromPlatform -from common import MakeCleanDirectory -from common import SDK_ROOT - from gcs_download import DownloadAndUnpackFromCloudStorage +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), + 'test'))) + +from common import SDK_ROOT, get_host_os, make_clean_directory + +_VERSION_FILE = os.path.join(SDK_ROOT, 'meta', 'manifest.json') + def _GetHostArch(): host_arch = platform.machine() @@ -31,19 +35,14 @@ def _GetHostArch(): raise Exception('Unsupported host architecture: %s' % host_arch) -def GetSDKOverrideGCSPath(path: Optional[str] = None) -> Optional[str]: +def GetSDKOverrideGCSPath() -> Optional[str]: """Fetches the sdk override path from a file. - Args: - path: the full file path to read the data from. - defaults to sdk_override.txt in the directory of this file. - Returns: The contents of the file, stripped of white space. Example: gs://fuchsia-artifacts/development/some-id/sdk """ - if not path: - path = os.path.join(os.path.dirname(__file__), 'sdk_override.txt') + path = os.path.join(os.path.dirname(__file__), 'sdk_override.txt') if not os.path.isfile(path): return None @@ -54,9 +53,9 @@ def GetSDKOverrideGCSPath(path: Optional[str] = None) -> Optional[str]: def _GetTarballPath(gcs_tarball_prefix: str) -> str: """Get the full path to the sdk tarball on GCS""" - platform = GetHostOsFromPlatform() + platform = get_host_os() arch = _GetHostArch() - return f'{gcs_tarball_prefix}/{platform}-{arch}/gn.tar.gz' + return f'{gcs_tarball_prefix}/{platform}-{arch}/core.tar.gz' def main(): @@ -73,12 +72,21 @@ def main(): # Exit if there's no SDK support for this platform. try: - host_plat = GetHostOsFromPlatform() + host_plat = get_host_os() except: logging.warning('Fuchsia SDK is not supported on this platform.') return 0 gcs_tarball_prefix = GetSDKOverrideGCSPath() + new_version = gcs_tarball_prefix if gcs_tarball_prefix else args.version + curr_version = None + if os.path.exists(_VERSION_FILE): + with open(_VERSION_FILE) as f: + curr_version = json.load(f)['id'] + + if new_version == curr_version: + return + make_clean_directory(SDK_ROOT) # Download from CIPD if there is no override file. if not gcs_tarball_prefix: @@ -86,7 +94,7 @@ def main(): parser.exit(1, '--cipd-prefix must be specified.') if not args.version: parser.exit(2, '--version must be specified.') - logging.info('Downloading GN SDK from CIPD...') + logging.info('Downloading SDK from CIPD...') ensure_file = '%s%s-%s %s' % (args.cipd_prefix, host_plat, _GetHostArch(), args.version) subprocess.run(('cipd', 'ensure', '-ensure-file', '-', '-root', SDK_ROOT, @@ -94,13 +102,24 @@ def main(): check=True, text=True, input=ensure_file) - return 0 + else: + logging.info('Downloading SDK from GCS...') + DownloadAndUnpackFromCloudStorage(_GetTarballPath(gcs_tarball_prefix), + SDK_ROOT) + + # Build rules (e.g. fidl_library()) depend on updates to the top-level + # manifest to spot when to rebuild for an SDK update. Ensure that ninja + # sees that the SDK manifest has changed, regardless of the mtime set by + # the download & unpack steps above, by setting mtime to now. + # See crbug.com/1457463 + os.utime(os.path.join(SDK_ROOT, 'meta', 'manifest.json'), None) + + root_dir = os.path.dirname(os.path.realpath(__file__)) + build_def_cmd = [ + os.path.join(root_dir, 'gen_build_defs.py'), + ] + subprocess.run(build_def_cmd, check=True) - # Always re-download the SDK. - logging.info('Downloading GN SDK from GCS...') - MakeCleanDirectory(SDK_ROOT) - DownloadAndUnpackFromCloudStorage(_GetTarballPath(gcs_tarball_prefix), - SDK_ROOT) return 0 diff --git a/build/fuchsia/update_sdk_test.py b/build/fuchsia/update_sdk_test.py index 7d8bcc7..2f3773a 100755 --- a/build/fuchsia/update_sdk_test.py +++ b/build/fuchsia/update_sdk_test.py @@ -30,12 +30,6 @@ def testUnsupportedArch(self, mock_machine): @mock.patch('builtins.open') @mock.patch('os.path.isfile') class TestGetSDKOverrideGCSPath(unittest.TestCase): - def testFileNotFound(self, mock_isfile, mock_open): - mock_isfile.return_value = False - - actual = GetSDKOverrideGCSPath('this-file-does-not-exist.txt') - self.assertIsNone(actual) - def testDefaultPath(self, mock_isfile, mock_open): mock_isfile.return_value = False @@ -55,14 +49,14 @@ def testRead(self, mock_isfile, mock_open): @mock.patch('update_sdk._GetHostArch') -@mock.patch('update_sdk.GetHostOsFromPlatform') +@mock.patch('update_sdk.get_host_os') class TestGetTarballPath(unittest.TestCase): def testGetTarballPath(self, mock_get_host_os, mock_host_arch): mock_get_host_os.return_value = 'linux' mock_host_arch.return_value = 'amd64' actual = _GetTarballPath('gs://bucket/sdk') - self.assertEqual(actual, 'gs://bucket/sdk/linux-amd64/gn.tar.gz') + self.assertEqual(actual, 'gs://bucket/sdk/linux-amd64/core.tar.gz') if __name__ == '__main__': diff --git a/build/get_landmines.py b/build/get_landmines.py index 6155d71..0c3cf4c 100755 --- a/build/get_landmines.py +++ b/build/get_landmines.py @@ -80,6 +80,8 @@ def print_landmines(): print('Clobber to flush stale generated files. See crbug.com/1406628') print('Clobber to flush old .ninja_log files for updating ninja. ' 'See crbug.com/1406628#c14') + if host_os() == 'mac': + print('Clobber to clear old nocompile targets. See crbug.com/1497005.') def main(): diff --git a/build/gn_ast/.style.yapf b/build/gn_ast/.style.yapf new file mode 100644 index 0000000..557fa7b --- /dev/null +++ b/build/gn_ast/.style.yapf @@ -0,0 +1,2 @@ +[style] +based_on_style = pep8 diff --git a/build/gn_ast/README.md b/build/gn_ast/README.md new file mode 100644 index 0000000..994e37a --- /dev/null +++ b/build/gn_ast/README.md @@ -0,0 +1,20 @@ +# GN AST + +A Python library for working with GN files via abstract syntax tree (AST). + +## JNI Refactor Example + +This library was originally created to perform the refactor within +`jni_refactor.py`. The file is left as an example. + +```sh +# To apply to all files: +find -name BUILD.gn > file-list.txt +# To apply to those that match a pattern: +grep -r --files-with-matches --include "BUILD.gn" "some pattern" > file-list.txt + +# To run one-at-a-time: +for f in $(cat file-list.txt); do python3 jni_refactor.py "$f"; done +# To run in parallel: +parallel python3 jni_refactor.py -- $(cat file-list.txt) +``` diff --git a/build/gn_ast/gn_ast.py b/build/gn_ast/gn_ast.py new file mode 100644 index 0000000..2e9aac0 --- /dev/null +++ b/build/gn_ast/gn_ast.py @@ -0,0 +1,373 @@ +# Lint as: python3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Helper script to use GN's JSON interface to make changes. + +AST implementation details: + https://gn.googlesource.com/gn/+/refs/heads/main/src/gn/parse_tree.cc + +To dump an AST: + gn format --dump-tree=json BUILD.gn > foo.json +""" + +from __future__ import annotations + +import dataclasses +import functools +import json +import subprocess +from typing import Callable, Dict, List, Optional, Tuple, TypeVar + +NODE_CHILD = 'child' +NODE_TYPE = 'type' +NODE_VALUE = 'value' + +_T = TypeVar('_T') + + +def _create_location_node(begin_line=1): + return { + 'begin_column': 1, + 'begin_line': begin_line, + 'end_column': 2, + 'end_line': begin_line, + } + + +def _wrap(node: dict): + kind = node[NODE_TYPE] + if kind == 'LIST': + return StringList(node) + if kind == 'BLOCK': + return BlockWrapper(node) + return NodeWrapper(node) + + +def _unwrap(thing): + if isinstance(thing, NodeWrapper): + return thing.node + return thing + + +def _find_node(root_node: dict, target_node: dict): + def recurse(node: dict) -> Optional[Tuple[dict, int]]: + children = node.get(NODE_CHILD) + if children: + for i, child in enumerate(children): + if child is target_node: + return node, i + ret = recurse(child) + if ret is not None: + return ret + return None + + ret = recurse(root_node) + if ret is None: + raise Exception( + f'Node not found: {target_node}\nLooked in: {root_node}') + return ret + +@dataclasses.dataclass +class NodeWrapper: + """Base class for all wrappers.""" + node: dict + + @property + def node_type(self) -> str: + return self.node[NODE_TYPE] + + @property + def node_value(self) -> str: + return self.node[NODE_VALUE] + + @property + def node_children(self) -> List[dict]: + return self.node[NODE_CHILD] + + @functools.cached_property + def first_child(self): + return _wrap(self.node_children[0]) + + @functools.cached_property + def second_child(self): + return _wrap(self.node_children[1]) + + def is_list(self): + return self.node_type == 'LIST' + + def is_identifier(self): + return self.node_type == 'IDENTIFIER' + + def visit_nodes(self, callback: Callable[[dict], + Optional[_T]]) -> List[_T]: + ret = [] + + def recurse(root: dict): + value = callback(root) + if value is not None: + ret.append(value) + return + children = root.get(NODE_CHILD) + if children: + for child in children: + recurse(child) + + recurse(self.node) + return ret + + def set_location_recursive(self, line): + def helper(n: dict): + loc = n.get('location') + if loc: + loc['begin_line'] = line + loc['end_line'] = line + + self.visit_nodes(helper) + + def add_child(self, node, *, before=None): + node = _unwrap(node) + if before is None: + self.node_children.append(node) + else: + before = _unwrap(before) + parent_node, child_idx = _find_node(self.node, before) + parent_node[NODE_CHILD].insert(child_idx, node) + + # Prevent blank lines between |before| and |node|. + target_line = before['location']['begin_line'] + _wrap(node).set_location_recursive(target_line) + + def remove_child(self, node): + node = _unwrap(node) + parent_node, child_idx = _find_node(self.node, node) + parent_node[NODE_CHILD].pop(child_idx) + + +@dataclasses.dataclass +class BlockWrapper(NodeWrapper): + """Wraps a BLOCK node.""" + def __post_init__(self): + assert self.node_type == 'BLOCK' + + def find_assignments(self, var_name=None): + def match_fn(node: dict): + assignment = AssignmentWrapper.from_node(node) + if not assignment: + return None + if var_name is None or var_name == assignment.variable_name: + return assignment + return None + + return self.visit_nodes(match_fn) + + +@dataclasses.dataclass +class AssignmentWrapper(NodeWrapper): + """Wraps a =, +=, or -= BINARY node where the LHS is an identifier.""" + def __post_init__(self): + assert self.node_type == 'BINARY' + + @property + def variable_name(self): + return self.first_child.node_value + + @property + def value(self): + return self.second_child + + @property + def list_value(self): + ret = self.second_child + assert isinstance(ret, StringList), 'Found: ' + ret.node_type + return ret + + @property + def operation(self): + """The assignment operation. Either "=" or "+=".""" + return self.node_value + + @property + def is_append(self): + return self.operation == '+=' + + def value_as_string_list(self): + return StringList(self.value.node) + + @staticmethod + def from_node(node: dict) -> Optional[AssignmentWrapper]: + if node.get(NODE_TYPE) != 'BINARY': + return None + children = node[NODE_CHILD] + assert len(children) == 2, ( + 'Binary nodes should have two child nodes, but the node is: ' + f'{node}') + left_child, right_child = children + if left_child.get(NODE_TYPE) != 'IDENTIFIER': + return None + if node.get(NODE_VALUE) not in ('=', '+=', '-='): + return None + return AssignmentWrapper(node) + + @staticmethod + def create(variable_name, value, operation='='): + value_node = _unwrap(value) + id_node = { + 'location': _create_location_node(), + 'type': 'IDENTIFIER', + 'value': variable_name, + } + return AssignmentWrapper({ + 'location': _create_location_node(), + 'child': [id_node, value_node], + 'type': 'BINARY', + 'value': operation, + }) + + @staticmethod + def create_list(variable_name, operation='='): + return AssignmentWrapper.create(variable_name, + StringList.create(), + operation=operation) + + +@dataclasses.dataclass +class StringList(NodeWrapper): + """Wraps a list node that contains only string literals.""" + def __post_init__(self): + assert self.is_list() + + self.literals: List[str] = [ + x[NODE_VALUE].strip('"') for x in self.node_children + if x[NODE_TYPE] == 'LITERAL' + ] + + def add_literal(self, value: str): + # For lists of deps, gn format will sort entries, but it will not + # move entries past comment boundaries. Insert at the front by default + # so that if sorting moves the value, and there is a comment boundary, + # it will end up before the comment instead of immediately after the + # comment (which likely does not apply to it). + self.literals.insert(0, value) + self.node_children.insert( + 0, { + 'location': _create_location_node(), + 'type': 'LITERAL', + 'value': f'"{value}"', + }) + + def remove_literal(self, value: str): + self.literals.remove(value) + quoted = f'"{value}"' + children = self.node_children + for i, node in enumerate(children): + if node[NODE_VALUE] == quoted: + children.pop(i) + break + else: + raise ValueError(f'Did not find child with value {quoted}') + + @staticmethod + def create() -> StringList: + return StringList({ + 'location': _create_location_node(), + 'begin_token': '[', + 'child': [], + 'end': { + 'location': _create_location_node(), + 'type': 'END', + 'value': ']' + }, + 'type': 'LIST', + }) + + +class Target(NodeWrapper): + """Wraps a target node. + + A target node is any function besides "template" with exactly two children: + * Child 1: LIST with single string literal child + * Child 2: BLOCK + + This does not actually find all targets. E.g. ignores those that use an + expression for a name, or that use "target(type, name)". + """ + def __init__(self, function_node: dict, name_node: dict): + super().__init__(function_node) + self.name_node = name_node + + @property + def name(self) -> str: + return self.name_node[NODE_VALUE].strip('"') + + # E.g. "android_library" + @property + def type(self) -> str: + return self.node[NODE_VALUE] + + @property + def block(self) -> BlockWrapper: + block = self.second_child + assert isinstance(block, BlockWrapper) + return block + + def set_name(self, value): + self.name_node[NODE_VALUE] = f'"{value}"' + + @staticmethod + def from_node(node: dict) -> Optional[Target]: + """Returns a Target if |node| is a target, None otherwise.""" + if node.get(NODE_TYPE) != 'FUNCTION': + return None + if node.get(NODE_VALUE) == 'template': + return None + children = node.get(NODE_CHILD) + if not children or len(children) != 2: + return None + func_params_node, block_node = children + if block_node.get(NODE_TYPE) != 'BLOCK': + return None + if func_params_node.get(NODE_TYPE) != 'LIST': + return None + param_nodes = func_params_node.get(NODE_CHILD) + if param_nodes is None or len(param_nodes) != 1: + return None + name_node = param_nodes[0] + if name_node.get(NODE_TYPE) != 'LITERAL': + return None + return Target(function_node=node, name_node=name_node) + + +class BuildFile: + """Represents the contents of a BUILD.gn file.""" + def __init__(self, path: str, root_node: dict): + self.block = BlockWrapper(root_node) + self.path = path + self._original_content = json.dumps(root_node) + + def write_changes(self) -> bool: + """Returns whether there were any changes.""" + new_content = json.dumps(self.block.node) + if new_content == self._original_content: + return False + output = subprocess.check_output( + ['gn', 'format', '--read-tree=json', self.path], + text=True, + input=new_content) + if 'Wrote rebuilt from json to' not in output: + raise Exception('JSON was invalid') + return True + + @functools.cached_property + def targets(self) -> List[Target]: + return self.block.visit_nodes(Target.from_node) + + @functools.cached_property + def targets_by_name(self) -> Dict[str, Target]: + return {t.name: t for t in self.targets} + + @staticmethod + def from_file(path): + output = subprocess.check_output( + ['gn', 'format', '--dump-tree=json', path], text=True) + return BuildFile(path, json.loads(output)) diff --git a/build/gn_ast/gn_editor.py b/build/gn_ast/gn_editor.py new file mode 100755 index 0000000..3b63ba8 --- /dev/null +++ b/build/gn_ast/gn_editor.py @@ -0,0 +1,436 @@ +#!/usr/bin/env python3 +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import argparse +import dataclasses +import functools +import json +import logging +import multiprocessing +import os +import pathlib +import subprocess +import sys +from typing import List, Optional, Set + +import json_gn_editor +import utils + +_SRC_PATH = pathlib.Path(__file__).resolve().parents[2] + +_BUILD_ANDROID_PATH = _SRC_PATH / 'build/android' +if str(_BUILD_ANDROID_PATH) not in sys.path: + sys.path.append(str(_BUILD_ANDROID_PATH)) +from pylib import constants + +_BUILD_ANDROID_GYP_PATH = _SRC_PATH / 'build/android/gyp' +if str(_BUILD_ANDROID_GYP_PATH) not in sys.path: + sys.path.append(str(_BUILD_ANDROID_GYP_PATH)) + +from util import build_utils + +_GIT_IGNORE_STR = '(git ignored file) ' + +NO_VALID_GN_STR = 'No valid GN files found after filtering.' + + +@dataclasses.dataclass +class OperationResult: + path: str + git_ignored: bool = False + dryrun: bool = False + skipped: bool = False + skip_reason: str = '' + + def __str__(self): + msg = f'Skipped ' if self.skipped else 'Updated ' + dryrun = '[DRYRUN] ' if self.dryrun else '' + ignore = _GIT_IGNORE_STR if self.git_ignored else '' + skip = f' ({self.skip_reason})' if self.skipped else '' + return f'{dryrun}{msg}{ignore}{self.path}{skip}' + + +def _add_deps(target: str, deps: List[str], root: pathlib.Path, path: str): + with json_gn_editor.BuildFile(path, root) as build_file: + build_file.add_deps(target, deps) + + +def _search_deps(name_query: Optional[str], path_query: Optional[str], + root: pathlib.Path, path: str): + with json_gn_editor.BuildFile(path, root) as build_file: + build_file.search_deps(name_query, path_query) + + +def _split_deps(existing_dep: str, new_deps: List[str], root: pathlib.Path, + path: str, dryrun: bool) -> Optional[OperationResult]: + with json_gn_editor.BuildFile(path, root, dryrun=dryrun) as build_file: + if build_file.split_deps(existing_dep, new_deps): + return OperationResult(path=os.path.relpath(path, start=root), + git_ignored=utils.is_git_ignored( + root, path), + dryrun=dryrun) + return None + + +def _remove_deps( + *, deps: List[str], out_dir: str, root: pathlib.Path, path: str, + dryrun: bool, targets: List[str], inline_mode: bool, + target_name_filter: Optional[str]) -> Optional[OperationResult]: + with json_gn_editor.BuildFile(path, root, dryrun=dryrun) as build_file: + if build_file.remove_deps(deps, out_dir, targets, target_name_filter, + inline_mode): + return OperationResult(path=os.path.relpath(path, start=root), + git_ignored=utils.is_git_ignored( + root, path), + dryrun=dryrun) + return None + + +def _add(args: argparse.Namespace, build_filepaths: List[str], + root: pathlib.Path): + deps = args.deps + target = args.target + with multiprocessing.Pool() as pool: + pool.map( + functools.partial(_add_deps, target, deps, root), + build_filepaths, + ) + + +def _search(args: argparse.Namespace, build_filepaths: List[str], + root: pathlib.Path): + name_query = args.name + path_query = args.path + if name_query: + logging.info(f'Searching dep names using: {name_query}') + if path_query: + logging.info(f'Searching paths using: {path_query}') + with multiprocessing.Pool() as pool: + pool.map( + functools.partial(_search_deps, name_query, path_query, root), + build_filepaths, + ) + + +def _split(args: argparse.Namespace, build_filepaths: List[str], + root: pathlib.Path) -> List[OperationResult]: + num_total = len(build_filepaths) + results = [] + with multiprocessing.Pool() as pool: + tasks = { + filepath: pool.apply_async( + _split_deps, + (args.existing, args.new, root, filepath, args.dryrun)) + for filepath in build_filepaths + } + for idx, filepath in enumerate(tasks.keys()): + relpath = os.path.relpath(filepath, start=root) + logging.info('[%d/%d] Checking %s', idx, num_total, relpath) + operation_result = tasks[filepath].get() + if operation_result: + logging.info(operation_result) + results.append(operation_result) + return results + + +def _get_project_json_contents(out_dir: str) -> str: + project_json_path = os.path.join(out_dir, 'project.json') + with open(project_json_path) as f: + return f.read() + + +def _calculate_targets_for_file(relpath: str, arg_extra_targets: List[str], + all_targets: Set[str]) -> Optional[List[str]]: + if os.path.basename(relpath) != 'BUILD.gn': + # Build all targets when we are dealing with build files that might be + # imported by other build files (e.g. config.gni or other_name.gn). + return [] + dirpath = os.path.dirname(relpath) + file_extra_targets = [] + for full_target_name in all_targets: + target_dir, short_target_name = full_target_name.split(':', 1) + # __ is used for sub-targets in GN, only focus on top-level ones. Also + # skip targets using other toolchains, e.g. + # base:feature_list_buildflags(//build/toolchain/linux:clang_x64) + if (target_dir == dirpath and '__' not in short_target_name + and '(' not in short_target_name): + file_extra_targets.append(full_target_name) + targets = arg_extra_targets + file_extra_targets + return targets or None + + +def _remove(args: argparse.Namespace, build_filepaths: List[str], + root: pathlib.Path) -> List[OperationResult]: + num_total = len(build_filepaths) + + if args.output_directory: + constants.SetOutputDirectory(args.output_directory) + constants.CheckOutputDirectory() + out_dir: str = constants.GetOutDirectory() + + args_gn_path = os.path.join(out_dir, 'args.gn') + if not os.path.exists(args_gn_path): + raise Exception(f'No args.gn in out directory {out_dir}') + with open(args_gn_path) as f: + # Although the target may compile fine, bytecode checks are necessary + # for correctness at runtime. + assert 'android_static_analysis = "on"' in f.read(), ( + 'Static analysis must be on to ensure correctness.') + # TODO: Ensure that the build server is not running. + + logging.info(f'Running "gn gen" in output directory: {out_dir}') + build_utils.CheckOutput(['gn', 'gen', '-C', out_dir, '--ide=json']) + + if args.all_java_deps: + assert not args.dep, '--all-java-target does not support passing deps.' + assert args.file, '--all-java-target requires passing --file.' + logging.info(f'Finding java deps under {out_dir}.') + all_java_deps = build_utils.CheckOutput([ + str(_SRC_PATH / 'build' / 'android' / 'list_java_targets.py'), + '--gn-labels', '-C', out_dir + ]).split('\n') + logging.info(f'Found {len(all_java_deps)} java deps.') + args.dep += all_java_deps + else: + assert args.dep, 'At least one explicit dep is required.' + + project_json_contents = _get_project_json_contents(out_dir) + project_json = json.loads(project_json_contents) + # The input file names have a // prefix. (e.g. //android_webview/BUILD.gn) + known_build_files = set( + name[2:] for name in project_json['build_settings']['gen_input_files']) + # Remove the // prefix for target names so ninja can build them. + known_target_names = set(name[2:] + for name in project_json['targets'].keys()) + + unknown_targets = [ + t for t in args.extra_build_targets if t not in known_target_names + ] + assert not unknown_targets, f'Cannot build {unknown_targets} in {out_dir}.' + + logging.info('Building all targets in preparation for removing deps') + # Avoid capturing stdout/stderr to see the progress of the full build. + subprocess.run(['autoninja', '-C', out_dir], check=True) + + results = [] + for idx, filepath in enumerate(build_filepaths): + # Since removal can take a long time, provide an easy way to resume the + # command if something fails. + try: + # When resuming, the first build file is the one that is being + # resumed. Avoid inline mode skipping it since it's already started + # to be processed and the first dep may already have been removed. + if args.resume_from and idx == 0 and args.inline_mode: + logging.info(f'Resuming: skipping inline mode for {filepath}.') + should_inline = False + else: + should_inline = args.inline_mode + relpath = os.path.relpath(filepath, start=root) + logging.info('[%d/%d] Checking %s', idx, num_total, relpath) + if relpath not in known_build_files: + operation_result = OperationResult( + path=relpath, + skipped=True, + skip_reason='Not in the list of known build files.') + else: + targets = _calculate_targets_for_file(relpath, + args.extra_build_targets, + known_target_names) + if targets is None: + operation_result = OperationResult( + path=relpath, + skipped=True, + skip_reason='Could not find any valid targets.') + else: + operation_result = _remove_deps( + deps=args.dep, + out_dir=out_dir, + root=root, + path=filepath, + dryrun=args.dryrun, + targets=targets, + inline_mode=should_inline, + target_name_filter=args.target_name_filter) + if operation_result: + logging.info(operation_result) + results.append(operation_result) + # Use blank except: to show this for KeyboardInterrupt as well. + except: + logging.error( + f'Encountered error while processing {filepath}. Append the ' + 'following args to resume from this file once the error is ' + f'fixed:\n\n--resume-from {filepath}\n') + raise + return results + + +def main(): + parser = argparse.ArgumentParser( + prog='gn_editor', description='Add or remove deps programatically.') + + common_args_parser = argparse.ArgumentParser(add_help=False) + common_args_parser.add_argument( + '-n', + '--dryrun', + action='store_true', + help='Show which files would be updated but avoid changing them.') + common_args_parser.add_argument('-v', + '--verbose', + action='store_true', + help='Used to print ninjalog.') + common_args_parser.add_argument('-q', + '--quiet', + action='store_true', + help='Used to print less logging.') + common_args_parser.add_argument('--file', + help='Run on a specific build file.') + common_args_parser.add_argument( + '--resume-from', + help='Skip files before this build file path (debugging).') + + subparsers = parser.add_subparsers( + required=True, help='Use subcommand -h to see full usage.') + + add_parser = subparsers.add_parser( + 'add', + parents=[common_args_parser], + help='Add one or more deps to a specific target (pass the path to the ' + 'BUILD.gn via --file for faster results). The target **must** ' + 'have a deps variable defined, even if it is an empty [].') + add_parser.add_argument('--target', help='The name of the target.') + add_parser.add_argument('--deps', + nargs='+', + help='The name(s) of the new dep(s).') + add_parser.set_defaults(command=_add) + + search_parser = subparsers.add_parser( + 'search', + parents=[common_args_parser], + help='Search for strings in build files. Each query is a regex string.' + ) + search_parser.add_argument('--name', + help='This is checked against dep names.') + search_parser.add_argument( + '--path', help='This checks the relative path of the build file.') + search_parser.set_defaults(command=_search) + + split_parser = subparsers.add_parser( + 'split', + parents=[common_args_parser], + help='Split one or more deps from an existing dep.') + split_parser.add_argument('existing', help='The dep to split from.') + split_parser.add_argument('new', + nargs='+', + help='One of the new deps to be added.') + split_parser.set_defaults(command=_split) + + remove_parser = subparsers.add_parser( + 'remove', + parents=[common_args_parser], + help='Remove one or more deps if the build still succeeds. Removing ' + 'one dep at a time is recommended.') + remove_parser.add_argument( + 'dep', + nargs='*', + help='One or more deps to be removed. Zero when other options are used.' + ) + remove_parser.add_argument( + '-C', + '--output-directory', + metavar='OUT', + help='If outdir is not provided, will attempt to guess.') + remove_parser.add_argument( + '--target-name-filter', + help='This will cause the script to only remove deps from targets that ' + 'match the filter provided. The filter should be a valid python regex ' + 'string and is used in a re.search on the full GN target names, e.g. ' + 're.search(pattern, "//base:base_java").') + remove_parser.add_argument( + '--all-java-deps', + action='store_true', + help='This will attempt to remove all known java deps. This option ' + 'requires no explicit deps to be passed.') + remove_parser.add_argument( + '--extra-build-targets', + metavar='T', + nargs='*', + default=[], + help='The set of extra targets to compile after each dep removal. This ' + 'is in addition to file-based targets that are automatically added.') + remove_parser.add_argument( + '--inline-mode', + action='store_true', + help='Skip the build file if the first dep is not found and removed. ' + 'This is especially useful when inlining deps so that a build file ' + 'that does not contain the dep being inlined can be skipped. This ' + 'mode assumes that the first dep is the one being inlined.') + remove_parser.set_defaults(command=_remove) + + args = parser.parse_args() + + if args.quiet: + level = logging.WARNING + elif args.verbose: + level = logging.DEBUG + else: + level = logging.INFO + logging.basicConfig( + level=level, format='%(levelname).1s %(relativeCreated)7d %(message)s') + + root = _SRC_PATH + if args.file: + build_filepaths = [os.path.relpath(args.file, root)] + else: + build_filepaths = [] + logging.info('Finding build files under %s', root) + for dirpath, _, filenames in os.walk(root): + for filename in filenames: + filepath = os.path.join(dirpath, filename) + if filename.endswith(('.gn', '.gni')): + build_filepaths.append(filepath) + build_filepaths.sort() + + logging.info('Found %d build files.', len(build_filepaths)) + + if args.resume_from: + resume_idx = None + for idx, path in enumerate(build_filepaths): + if path.endswith(args.resume_from): + resume_idx = idx + break + assert resume_idx is not None, f'Did not find {args.resume_from}.' + logging.info('Skipping %d build files with --resume-from.', resume_idx) + build_filepaths = build_filepaths[resume_idx:] + + filtered_build_filepaths = [ + p for p in build_filepaths if not utils.is_bad_gn_file(p, root) + ] + num_total = len(filtered_build_filepaths) + if num_total == 0: + logging.error(NO_VALID_GN_STR) + sys.exit(1) + logging.info('Running on %d valid build files.', num_total) + + operation_results: List[OperationResult] = args.command( + args, filtered_build_filepaths, root) + if operation_results is None: + return + ignored_operation_results = [r for r in operation_results if r.git_ignored] + skipped_operation_results = [r for r in operation_results if r.skipped] + num_ignored = len(ignored_operation_results) + num_skipped = len(skipped_operation_results) + num_updated = len(operation_results) - num_skipped + print(f'Checked {num_total}, updated {num_updated} ({num_ignored} of ' + f'which are ignored by git under {root}), and skipped {num_skipped} ' + 'build files.') + if num_ignored: + print(f'\nThe following {num_ignored} files were ignored by git and ' + 'may need separate CLs in their respective repositories:') + for result in ignored_operation_results: + print(' ' + result.path) + + +if __name__ == '__main__': + main() diff --git a/build/gn_ast/jni_refactor.py b/build/gn_ast/jni_refactor.py new file mode 100644 index 0000000..eaa9861 --- /dev/null +++ b/build/gn_ast/jni_refactor.py @@ -0,0 +1,155 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Refactors BUILD.gn files for our Annotation Processor -> .srcjar migration. + +1) Finds all generate_jni() targets +2) Finds all android_library() targets with that use ":jni_processor" +3) Compares lists of sources between them +4) Removes the annotation_processor_deps entry +5) Adds the generate_jni target as a srcjar_dep +6) Updates visibility of generate_jni to allow the dep + +This script has already done its job, but is left as an example of using gn_ast. +""" + +import argparse +import sys + +import gn_ast + +_PROCESSOR_DEP = '//base/android/jni_generator:jni_processor' + + +class RefactorException(Exception): + pass + + +def find_processor_assignment(target): + for assignment in target.block.find_assignments( + 'annotation_processor_deps'): + processors = assignment.list_value.literals + if _PROCESSOR_DEP in processors: + return assignment + return None + + +def find_all_sources(target, build_file): + ret = [] + + def helper(assignments): + for assignment in assignments: + if assignment.operation not in ('=', '+='): + raise RefactorException( + f'{target.name}: sources has a {assignment.operation}.') + + value = assignment.value + if value.is_identifier(): + helper(build_file.block.find_assignments(value.node_value)) + elif not value.is_list(): + raise RefactorException(f'{target.name}: sources not a list.') + else: + ret.extend(value.literals) + + helper(target.block.find_assignments('sources')) + return ret + + +def find_matching_jni_target(library_target, jni_target_to_sources, + build_file): + all_sources = set(find_all_sources(library_target, build_file)) + matches = [] + for jni_target_name, jni_sources in jni_target_to_sources.items(): + if all(s in all_sources for s in jni_sources): + matches.append(jni_target_name) + if len(matches) == 1: + return matches[0] + if len(matches) > 1: + raise RefactorException( + f'{library_target.name}: Matched multiple generate_jni().') + if jni_target_to_sources: + raise RefactorException( + f'{library_target.name}: No matching generate_jni().') + raise RefactorException('No sources found for generate_jni().') + + +def fix_visibility(target): + for assignment in target.block.find_assignments('visibility'): + if not assignment.value.is_list(): + continue + list_value = assignment.list_value + for value in list(list_value.literals): + if value.startswith(':'): + list_value.remove_literal(value) + list_value.add_literal(':*') + + +def refactor(lib_target, jni_target): + assignments = lib_target.block.find_assignments('srcjar_deps') + srcjar_deps = assignments[0] if assignments else None + if srcjar_deps is None: + srcjar_deps = gn_ast.AssignmentWrapper.create_list('srcjar_deps') + first_source_assignment = lib_target.block.find_assignments( + 'sources')[0] + lib_target.block.add_child(srcjar_deps, before=first_source_assignment) + elif not srcjar_deps.value.is_list(): + raise RefactorException( + f'{lib_target.name}: srcjar_deps is not a list.') + srcjar_deps.list_value.add_literal(f':{jni_target.name}') + + processor_assignment = find_processor_assignment(lib_target) + processors = processor_assignment.list_value.literals + if len(processors) == 1: + lib_target.block.remove_child(processor_assignment.node) + else: + processor_assignment.list_value.remove_literal(_PROCESSOR_DEP) + + fix_visibility(jni_target) + + +def analyze(build_file): + targets = build_file.targets + jni_targets = [t for t in targets if t.type == 'generate_jni'] + lib_targets = [t for t in targets if find_processor_assignment(t)] + + if len(jni_targets) == 0 and len(lib_targets) == 0: + return + # Match up target when there are only one, even when targets use variables + # for list values. + if len(jni_targets) == 1 and len(lib_targets) == 1: + refactor(lib_targets[0], jni_targets[0]) + return + + jni_target_to_sources = { + t.name: find_all_sources(t, build_file) + for t in jni_targets + } + for lib_target in lib_targets: + jni_target_name = find_matching_jni_target(lib_target, + jni_target_to_sources, + build_file) + jni_target = build_file.targets_by_name[jni_target_name] + refactor(lib_target, jni_target) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('path') + args = parser.parse_args() + try: + build_file = gn_ast.BuildFile.from_file(args.path) + analyze(build_file) + if build_file.write_changes(): + print(f'{args.path}: Changes applied.') + else: + print(f'{args.path}: No changes necessary.') + except RefactorException as e: + print(f'{args.path}: {e}') + sys.exit(1) + except Exception: + print('Failure on', args.path) + raise + + +if __name__ == '__main__': + main() diff --git a/build/gn_ast/json_gn_editor.py b/build/gn_ast/json_gn_editor.py new file mode 100644 index 0000000..abafb63 --- /dev/null +++ b/build/gn_ast/json_gn_editor.py @@ -0,0 +1,563 @@ +# Lint as: python3 +# Copyright 2021 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +'''Helper script to use GN's JSON interface to make changes.''' + +from __future__ import annotations + +import contextlib +import copy +import dataclasses +import json +import logging +import os +import pathlib +import re +import shutil +import subprocess +import sys + +from typing import Dict, Iterator, List, Optional, Tuple + +_SRC_PATH = pathlib.Path(__file__).resolve().parents[2] + +_BUILD_ANDROID_GYP_PATH = _SRC_PATH / 'build/android/gyp' +if str(_BUILD_ANDROID_GYP_PATH) not in sys.path: + sys.path.append(str(_BUILD_ANDROID_GYP_PATH)) + +from util import build_utils + +# Refer to parse_tree.cc for GN AST implementation details: +# https://gn.googlesource.com/gn/+/refs/heads/main/src/gn/parse_tree.cc +# These constants should match corresponding entries in parse_tree.cc. +# TODO: Add high-level details for the expected data structure. +NODE_CHILD = 'child' +NODE_TYPE = 'type' +NODE_VALUE = 'value' +BEFORE_COMMENT = 'before_comment' +SUFFIX_COMMENT = 'suffix_comment' +AFTER_COMMENT = 'after_comment' + + +@contextlib.contextmanager +def _backup_and_restore_file_contents(path: str): + with open(path) as f: + contents = f.read() + try: + yield + finally: + # Ensure that the timestamp is updated since otherwise ninja will not + # re-build relevant targets with the original file. + with open(path, 'w') as f: + f.write(contents) + + +def _build_targets_output( + out_dir: str, + targets: List[str], + should_print: Optional[bool] = None) -> Optional[str]: + env = os.environ.copy() + if should_print is None: + should_print = logging.getLogger().isEnabledFor(logging.DEBUG) + # Ensuring ninja does not attempt to summarize the build results in slightly + # faster builds. This script does many builds so this time can add up. + if 'NINJA_SUMMARIZE_BUILD' in env: + del env['NINJA_SUMMARIZE_BUILD'] + proc = subprocess.Popen(['autoninja', '-C', out_dir] + targets, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + env=env, + text=True) + lines = [] + prev_line = '' + width = shutil.get_terminal_size().columns + while proc.poll() is None: + line = proc.stdout.readline() + lines.append(line) + if should_print: + if prev_line.startswith('[') and line.startswith('['): + # Shrink the line according to terminal size. + msg = line.rstrip() + if len(msg) > width: + # 5 = 3 (Ellipsis) + 2 (header) + length_to_show = width - 5 + msg = f'{msg[:2]}...{msg[-length_to_show:]}' + # \r to return the carriage to the beginning of line, \033[K to + # replace the normal \n to erase until the end of the line. This + # allows ninja output for successful targets to overwrite each + # other. + msg = f'\r{msg}\033[K' + elif prev_line.startswith('['): + # Since the previous line likely did not include a newline, an + # extra newline is needed to avoid the current line being + # appended to the previous line. + msg = f'\n{line}' + else: + msg = line + print(msg, end='') + prev_line = line + if proc.returncode != 0: + return None + return ''.join(lines) + + +def _generate_project_json_content(out_dir: str) -> str: + build_utils.CheckOutput(['gn', 'gen', '--ide=json', out_dir]) + with open(os.path.join(out_dir, 'project.json')) as f: + return f.read() + + +@dataclasses.dataclass +class DepList: + """Represents a dep list assignment in GN.""" + target_name: Optional[str] # The name of the target containing the list. + variable_name: str # Left-hand side variable name the list is assigned to. + child_nodes: List[dict] # Right-hand side list of nodes. + operation: str # The assignment operation, whether += or =. + + +class BuildFile: + """Represents the contents of a BUILD.gn file.""" + def __init__(self, + build_gn_path: str, + root_gn_path: pathlib.Path, + *, + dryrun: bool = False): + self._root = root_gn_path + self._rel_path = os.path.relpath(build_gn_path, root_gn_path) + self._gn_rel_path = '//' + os.path.dirname(self._rel_path) + self._full_path = os.path.abspath(build_gn_path) + self._skip_write_content = dryrun + + def __enter__(self): + output = build_utils.CheckOutput( + ['gn', 'format', '--dump-tree=json', self._full_path]) + self._content = json.loads(output) + self._original_content = json.dumps(self._content) + return self + + def __exit__(self, exc, value, tb): + if not self._skip_write_content: + self.write_content_to_file() + + # See: https://gist.github.com/sgraham/bd9ffee312f307d5f417019a9c0f0777 + def _find_all(self, match_fn): + results = [] + + def get_target_name(node) -> Optional[str]: + """Example format (with irrelevant fields omitted): + { + "child": [ { + "child": [ { + "type": "LITERAL", + "value": "\"hello_world_java\"" + } ], + "type": "LIST" + }, { + ... + } ], + "type": "FUNCTION", + "value": "java_library" + } + + Example return: hello_world_java + """ + if node.get(NODE_TYPE) != 'FUNCTION': + return None + children = node.get(NODE_CHILD) + if not children: + return None + first_child = children[0] + if first_child.get(NODE_TYPE) != 'LIST': + return None + grand_children = first_child.get(NODE_CHILD) + if not grand_children: + return None + grand_child = grand_children[0] + if grand_child.get(NODE_TYPE) != 'LITERAL': + return None + name = grand_child.get(NODE_VALUE) + if name.startswith('"'): + return name[1:-1] + return name + + def recursive_find(root, last_known_target=None): + target_name = get_target_name(root) or last_known_target + matched = match_fn(root) + if matched is not None: + results.append((target_name, matched)) + return + children = root.get(NODE_CHILD) + if children: + for child in children: + recursive_find(child, last_known_target=target_name) + + recursive_find(self._content) + return results + + def _normalize(self, name: Optional[str], abs_path: bool = True): + """Returns the absolute GN path to the target with |name|. + + This method normalizes target names, assuming that relative targets are + referenced based on the current file, allowing targets to be compared + by name to determine whether they are the same or not. + + Given the current file is chrome/android/BUILD.gn: + + # Removes surrounding quotation marks. + "//chrome/android:chrome_java" -> //chrome/android:chrome_java + + # Makes relative paths absolute. + :chrome_java -> //chrome/android:chrome_java + + # Spells out GN shorthands for basenames. + //chrome/android -> //chrome/android:android + """ + if not name: + return '' + if name.startswith('"'): + name = name[1:-1] + if not name.startswith('//') and abs_path: + name = self._gn_rel_path + name + if not ':' in name: + name += ':' + os.path.basename(name) + return name + + def _find_all_list_assignments(self): + def match_list_assignments(node): + r"""Matches and returns the list being assigned. + + Binary node (with an operation such as = or +=) + / \ + / \ + name list of nodes + + Returns (name, list of nodes, op) + """ + if node.get(NODE_TYPE) != 'BINARY': + return None + operation = node.get(NODE_VALUE) + children = node.get(NODE_CHILD) + assert len(children) == 2, ( + 'Binary nodes should have two child nodes, but the node is: ' + f'{node}') + left_child, right_child = children + if left_child.get(NODE_TYPE) != 'IDENTIFIER': + return None + name = left_child.get(NODE_VALUE) + if right_child.get(NODE_TYPE) != 'LIST': + return None + list_of_nodes = right_child.get(NODE_CHILD) + return name, list_of_nodes, operation + + return self._find_all(match_list_assignments) + + def _find_all_deps_lists(self) -> Iterator[DepList]: + list_tuples = self._find_all_list_assignments() + for target_name, (var_name, node_list, operation) in list_tuples: + if (var_name == 'deps' or var_name.startswith('deps_') + or var_name.endswith('_deps') or '_deps_' in var_name): + yield DepList(target_name=target_name, + variable_name=var_name, + child_nodes=node_list, + operation=operation) + + def _new_literal_node(self, value: str, begin_line: int = 1): + return { + 'location': { + 'begin_column': 1, + 'begin_line': begin_line, + 'end_column': 2, + 'end_line': begin_line, + }, + 'type': 'LITERAL', + 'value': f'"{value}"' + } + + def _clone_replacing_value(self, node_to_copy: Dict, new_dep_name: str): + """Clone the existing node to preserve line numbers and update name. + + It is easier to clone an existing node around the same location, as the + actual dict looks like this: + { + 'location': { + 'begin_column': 5, + 'begin_line': 137, + 'end_column': 27, + 'end_line': 137 + }, + 'type': 'LITERAL', + 'value': '":anr_data_proto_java"' + } + + Thus the new node to return should keep the same 'location' value (the + parser is tolerant as long as it's roughly in the correct spot) but + update the 'value' to the new dependency name. + """ + new_dep = copy.deepcopy(node_to_copy) + # Any comments associated with the previous dep would not apply. + for comment_key in (BEFORE_COMMENT, AFTER_COMMENT, SUFFIX_COMMENT): + new_dep.pop(comment_key, None) # Remove if exists. + new_dep[NODE_VALUE] = f'"{new_dep_name}"' + return new_dep + + def add_deps(self, target: str, deps: List[str]) -> bool: + added_new_dep = False + normalized_target = self._normalize(target) + for dep_list in self._find_all_deps_lists(): + if dep_list.target_name is None: + continue + # Only modify the first assignment operation to the deps variable, + # otherwise if there are += operations, then the list of deps will + # be added multiple times to the same target's deps. + if dep_list.operation != '=': + continue + full_target_name = f'{self._gn_rel_path}:{dep_list.target_name}' + # Support both the exact name and the absolute GN target names + # starting with //. + if (target != dep_list.target_name + and normalized_target != full_target_name): + continue + if dep_list.variable_name != 'deps': + continue + existing_dep_names = set( + self._normalize(child.get(NODE_VALUE), abs_path=False) + for child in dep_list.child_nodes) + for new_dep_name in deps: + if new_dep_name in existing_dep_names: + logging.info( + f'Skipping existing {new_dep_name} in {target}.deps') + continue + logging.info(f'Adding {new_dep_name} to {target}.deps') + # If there are no existing child nodes, then create a new one. + # Otherwise clone an existing child node to ensure more accurate + # line numbers and possible better preserve comments. + if not dep_list.child_nodes: + new_dep = self._new_literal_node(new_dep_name) + else: + new_dep = self._clone_replacing_value( + dep_list.child_nodes[0], new_dep_name) + dep_list.child_nodes.append(new_dep) + added_new_dep = True + if not added_new_dep: + # This should match the string in bytecode_processor.py. + print(f'Unable to find {target}') + return added_new_dep + + def search_deps(self, name_query: Optional[str], + path_query: Optional[str]) -> bool: + if path_query: + if not re.search(path_query, self._rel_path): + return False + elif not name_query: + print(self._rel_path) + return True + for dep_list in self._find_all_deps_lists(): + for child in dep_list.child_nodes: + # Typically searches run on non-absolute dep paths. + dep_name = self._normalize(child.get(NODE_VALUE), + abs_path=False) + if name_query and re.search(name_query, dep_name): + print(f'{self._rel_path}: {dep_name} in ' + f'{dep_list.target_name}.{dep_list.variable_name}') + return True + return False + + def split_deps(self, original_dep_name: str, + new_dep_names: List[str]) -> bool: + split = False + for new_dep_name in new_dep_names: + if self._split_dep(original_dep_name, new_dep_name): + split = True + return split + + def _split_dep(self, original_dep_name: str, new_dep_name: str) -> bool: + """Add |new_dep_name| to GN deps that contains |original_dep_name|. + + Supports deps, public_deps, and other deps variables. + + Works for explicitly assigning a list to deps: + deps = [ ..., "original_dep", ...] + # Becomes + deps = [ ..., "original_dep", "new_dep", ...] + Also works for appending a list to deps: + public_deps += [ ..., "original_dep", ...] + # Becomes + public_deps += [ ..., "original_dep", "new_dep", ...] + + Does not work for assigning or appending variables to deps: + deps = other_list_of_deps # Does NOT check other_list_of_deps. + # Becomes (no changes) + deps = other_list_of_deps + + Does not work with parameter expansion, i.e. $variables. + + Returns whether the new dep was added one or more times. + """ + for dep_name in (original_dep_name, new_dep_name): + assert dep_name.startswith('//'), ( + f'Absolute GN path required, starting with //: {dep_name}') + + added_new_dep = False + normalized_original_dep_name = self._normalize(original_dep_name) + normalized_new_dep_name = self._normalize(new_dep_name) + for dep_list in self._find_all_deps_lists(): + original_dep_idx = None + new_dep_already_exists = False + for idx, child in enumerate(dep_list.child_nodes): + dep_name = self._normalize(child.get(NODE_VALUE)) + if dep_name == normalized_original_dep_name: + original_dep_idx = idx + if dep_name == normalized_new_dep_name: + new_dep_already_exists = True + if original_dep_idx is not None and not new_dep_already_exists: + if dep_list.target_name is None: + target_str = self._gn_rel_path + else: + target_str = f'{self._gn_rel_path}:{dep_list.target_name}' + location = f"{target_str}'s {dep_list.variable_name} variable" + logging.info(f'Adding {new_dep_name} to {location}') + new_dep = self._clone_replacing_value( + dep_list.child_nodes[original_dep_idx], new_dep_name) + # Add the new dep after the existing dep to preserve comments + # before the existing dep. + dep_list.child_nodes.insert(original_dep_idx + 1, new_dep) + added_new_dep = True + + return added_new_dep + + def remove_deps(self, + dep_names: List[str], + out_dir: str, + targets: List[str], + target_name_filter: Optional[str], + inline_mode: bool = False) -> Tuple[bool, str]: + if not inline_mode: + deps_to_remove = dep_names + else: + # If the first dep cannot be removed (or is not found) then in the + # case of inlining we can skip this file for the rest of the deps. + first_dep = dep_names[0] + if not self._remove_deps([first_dep], out_dir, targets, + target_name_filter): + return False + deps_to_remove = dep_names[1:] + return self._remove_deps(deps_to_remove, out_dir, targets, + target_name_filter) + + def _remove_deps(self, dep_names: List[str], out_dir: str, + targets: List[str], + target_name_filter: Optional[str]) -> Tuple[bool, str]: + """Remove |dep_names| if the target can still be built in |out_dir|. + + Supports deps, public_deps, and other deps variables. + + Works for explicitly assigning a list to deps: + deps = [ ..., "original_dep", ...] + # Becomes + deps = [ ..., ...] + + Does not work with parameter expansion, i.e. $variables. + + Returns whether any deps were removed. + """ + normalized_dep_names = set() + for dep_name in dep_names: + assert dep_name.startswith('//'), ( + f'Absolute GN path required, starting with //: {dep_name}') + normalized_dep_names.add(self._normalize(dep_name)) + + removed_dep = False + for dep_list in self._find_all_deps_lists(): + child_deps_to_remove = [ + c for c in dep_list.child_nodes + if self._normalize(c.get(NODE_VALUE)) in normalized_dep_names + ] + if not child_deps_to_remove: + continue + + if dep_list.target_name is None: + target_name_str = self._gn_rel_path + else: + target_name_str = f'{self._gn_rel_path}:{dep_list.target_name}' + if (target_name_filter is not None and + re.search(target_name_filter, target_name_str) is None): + logging.info(f'Skip: Since re.search("{target_name_filter}", ' + f'"{target_name_str}") is None.') + continue + + location = f"{target_name_str}'s {dep_list.variable_name} variable" + expected_json = _generate_project_json_content(out_dir) + num_to_remove = len(child_deps_to_remove) + for remove_idx, child_dep in enumerate(child_deps_to_remove): + child_dep_name = self._normalize(child_dep.get(NODE_VALUE)) + idx_to_remove = dep_list.child_nodes.index(child_dep) + logging.info(f'({remove_idx + 1}/{num_to_remove}) Found ' + f'{child_dep_name} in {location}.') + child_to_remove = dep_list.child_nodes[idx_to_remove] + can_remove_dep = False + with _backup_and_restore_file_contents(self._full_path): + dep_list.child_nodes.remove(child_to_remove) + self.write_content_to_file() + # Immediately restore deps_list's original value in case the + # following build is interrupted. We don't want the + # intermediate untested value to be written as the final + # build file. + dep_list.child_nodes.insert(idx_to_remove, child_to_remove) + if expected_json is not None: + # If no changes to project.json was detected, this means + # the current target is not part of out_dir's build and + # cannot be removed even if the build succeeds. + after_json = _generate_project_json_content(out_dir) + if expected_json == after_json: + # If one change in this list isn't part of the + # build, no need to try any other in this list. + logging.info('Skip: No changes to project.json.') + break + + # Avoids testing every dep removal for the same list. + expected_json = None + if self._can_still_build_everything(out_dir, targets): + can_remove_dep = True + if not can_remove_dep: + continue + + dep_list.child_nodes.remove(child_to_remove) + # Comments before a target can apply to the targets after. + if (BEFORE_COMMENT in child_to_remove + and idx_to_remove < len(dep_list.child_nodes)): + child_after = dep_list.child_nodes[idx_to_remove] + if BEFORE_COMMENT not in child_after: + child_after[BEFORE_COMMENT] = [] + child_after[BEFORE_COMMENT][:] = ( + child_to_remove[BEFORE_COMMENT] + + child_after[BEFORE_COMMENT]) + # Comments after or behind a target don't make sense to re- + # position, simply ignore AFTER_COMMENT and SUFFIX_COMMENT. + removed_dep = True + logging.info(f'Removed {child_dep_name} from {location}.') + return removed_dep + + def _can_still_build_everything(self, out_dir: str, + targets: List[str]) -> bool: + output = _build_targets_output(out_dir, targets) + if output is None: + logging.info('Ninja failed to build all targets') + return False + # If ninja did not re-build anything, then the target changed is not + # among the targets being built. Avoid this change as it's not been + # tested/used. + if 'ninja: no work to do.' in output: + logging.info('Ninja did not find any targets to build') + return False + return True + + def write_content_to_file(self) -> None: + current_content = json.dumps(self._content) + if current_content != self._original_content: + subprocess.run( + ['gn', 'format', '--read-tree=json', self._full_path], + text=True, + check=True, + input=current_content) diff --git a/build/gn_ast/json_gn_editor_test.py b/build/gn_ast/json_gn_editor_test.py new file mode 100755 index 0000000..1df5593 --- /dev/null +++ b/build/gn_ast/json_gn_editor_test.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +# Copyright 2021 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +import unittest +import tempfile +import textwrap +import os + +import json_gn_editor + + +class BuildFileTest(unittest.TestCase): + def test_avoid_reformatting_gn_file_if_no_ast_changed(self): + text = textwrap.dedent('''\ + android_library("target_name") { + deps =[":local_dep"]} #shouldn't change + ''') + with tempfile.NamedTemporaryFile(mode='w') as f: + f.write(text) + f.flush() + with json_gn_editor.BuildFile(f.name, '/') as build_file: + pass + with open(f.name, 'r') as f_after: + self.assertEqual(f_after.read(), text) + + def test_split_dep_works_for_full_relative_abs_deps(self): + with tempfile.TemporaryDirectory() as rootdir: + java_subdir = os.path.join(rootdir, 'java') + os.mkdir(java_subdir) + build_gn_path = os.path.join(java_subdir, 'BUILD.gn') + with open(build_gn_path, 'w') as f: + f.write( + textwrap.dedent('''\ + android_library("java") { + } + + android_library("target1") { + deps = [ "//java:java" ] + } + + android_library("target2") { + deps += [ ":java" ] + } + + android_library("target3") { + public_deps = [ "//java" ] + } + ''')) + with json_gn_editor.BuildFile(build_gn_path, + rootdir) as build_file: + # Test both explicit and implied dep resolution works. + build_file.split_dep('//java:java', '//other_dir:other_dep') + build_file.split_dep('//java', '//other_dir:other_dep2') + with open(build_gn_path, 'r') as f: + self.assertEqual( + f.read(), + textwrap.dedent('''\ + android_library("java") { + } + + android_library("target1") { + deps = [ + "//java:java", + "//other_dir:other_dep", + "//other_dir:other_dep2", + ] + } + + android_library("target2") { + deps += [ + ":java", + "//other_dir:other_dep", + "//other_dir:other_dep2", + ] + } + + android_library("target3") { + public_deps = [ + "//java", + "//other_dir:other_dep", + "//other_dir:other_dep2", + ] + } + ''')) + + def test_split_dep_does_not_duplicate_deps(self): + with tempfile.TemporaryDirectory() as rootdir: + java_subdir = os.path.join(rootdir, 'java') + os.mkdir(java_subdir) + build_gn_path = os.path.join(java_subdir, 'BUILD.gn') + with open(build_gn_path, 'w') as f: + f.write( + textwrap.dedent('''\ + android_library("target") { + deps = [ + "//java", + "//other_dir:other_dep", + ] + } + ''')) + with json_gn_editor.BuildFile(build_gn_path, + rootdir) as build_file: + build_file.split_dep('//java:java', '//other_dir:other_dep') + with open(build_gn_path, 'r') as f: + self.assertEqual( + f.read(), + textwrap.dedent('''\ + android_library("target") { + deps = [ + "//java", + "//other_dir:other_dep", + ] + } + ''')) + + +if __name__ == '__main__': + unittest.main() diff --git a/build/gn_ast/utils.py b/build/gn_ast/utils.py new file mode 100644 index 0000000..05fe41b --- /dev/null +++ b/build/gn_ast/utils.py @@ -0,0 +1,35 @@ +# Lint as: python3 +# Copyright 2021 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import logging +import os +import pathlib +import subprocess + +# These paths should be relative to repository root. +_BAD_FILES = [ + # Malformed BUILD.gn file, remove this entry once it is fixed. + "third_party/swiftshader/tests/VulkanUnitTests/BUILD.gn", +] + + +def is_bad_gn_file(filepath: str, root: pathlib.Path) -> bool: + relpath = os.path.relpath(filepath, root) + for bad_filepath in _BAD_FILES: + if relpath == bad_filepath: + logging.info(f'Skipping {relpath}: found in _BAD_FILES list.') + return True + if not os.access(filepath, os.R_OK | os.W_OK): + logging.info(f'Skipping {relpath}: Cannot read and write to it.') + return True + return False + + +def is_git_ignored(root: pathlib.Path, filepath: str) -> bool: + # The command git check-ignore exits with 0 if the path is ignored, 1 if it + # is not ignored. + exit_code = subprocess.run(['git', 'check-ignore', '-q', filepath], + cwd=root).returncode + return exit_code == 0 diff --git a/build/gn_editor b/build/gn_editor new file mode 100755 index 0000000..ecf86e8 --- /dev/null +++ b/build/gn_editor @@ -0,0 +1,8 @@ +#!/bin/bash +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +base_dir=$(dirname "$0") + +exec python3 "$base_dir/gn_ast/gn_editor.py" "$@" diff --git a/build/gn_helpers.py b/build/gn_helpers.py index 94c1a84..34dfb13 100644 --- a/build/gn_helpers.py +++ b/build/gn_helpers.py @@ -546,7 +546,10 @@ def ReadBuildVars(output_directory): def CreateBuildCommand(output_directory): - """Returns [cmd, -C, output_directory], where |cmd| is auto{siso,ninja}.""" + """Returns [cmd, -C, output_directory]. + + Where |cmd| is one of: siso ninja, ninja, or autoninja. + """ suffix = '.bat' if sys.platform.startswith('win32') else '' # Prefer the version on PATH, but fallback to known version if PATH doesn't # have one (e.g. on bots). @@ -560,7 +563,7 @@ def CreateBuildCommand(output_directory): siso_cmd = [f'{siso_prefix}siso{suffix}', 'ninja'] else: ninja_cmd = [f'autoninja{suffix}'] - siso_cmd = [f'autosiso{suffix}'] + siso_cmd = list(ninja_cmd) if output_directory and os.path.relpath(output_directory) != '.': ninja_cmd += ['-C', output_directory] diff --git a/build/gn_helpers_unittest.py b/build/gn_helpers_unittest.py index bb0f31f..ed3df42 100755 --- a/build/gn_helpers_unittest.py +++ b/build/gn_helpers_unittest.py @@ -3,10 +3,14 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import mock +import os +import pathlib +import shutil import sys +import tempfile import textwrap import unittest +from unittest import mock import gn_helpers @@ -311,6 +315,39 @@ def test_ReplaceImports(self): textwrap.dedent('import("some/relative/args/file.gni")')) parser.ReplaceImports() + def test_CreateBuildCommand(self): + with tempfile.TemporaryDirectory() as temp_dir: + suffix = '.bat' if sys.platform.startswith('win32') else '' + self.assertEqual(f'autoninja{suffix}', + gn_helpers.CreateBuildCommand(temp_dir)[0]) + + siso_deps = pathlib.Path(temp_dir) / '.siso_deps' + siso_deps.touch() + self.assertEqual(f'autoninja{suffix}', + gn_helpers.CreateBuildCommand(temp_dir)[0]) + + with mock.patch('shutil.which', lambda x: None): + cmd = gn_helpers.CreateBuildCommand(temp_dir) + self.assertIn('third_party', cmd[0]) + self.assertIn(f'{os.sep}siso', cmd[0]) + self.assertEqual(['ninja', '-C', temp_dir], cmd[1:]) + + ninja_deps = pathlib.Path(temp_dir) / '.ninja_deps' + ninja_deps.touch() + + with self.assertRaisesRegex(Exception, 'Found both'): + gn_helpers.CreateBuildCommand(temp_dir) + + siso_deps.unlink() + self.assertEqual(f'autoninja{suffix}', + gn_helpers.CreateBuildCommand(temp_dir)[0]) + + with mock.patch('shutil.which', lambda x: None): + cmd = gn_helpers.CreateBuildCommand(temp_dir) + self.assertIn('third_party', cmd[0]) + self.assertIn(f'{os.sep}ninja', cmd[0]) + self.assertEqual(['-C', temp_dir], cmd[1:]) + if __name__ == '__main__': unittest.main() diff --git a/build/install-build-deps.py b/build/install-build-deps.py index ae0614e..a38ad22 100755 --- a/build/install-build-deps.py +++ b/build/install-build-deps.py @@ -148,7 +148,7 @@ def check_distro(options): distro_id = subprocess.check_output(["lsb_release", "--id", "--short"]).decode().strip() - supported_codenames = ["bionic", "focal", "jammy"] + supported_codenames = ["bionic", "focal", "jammy", "noble"] supported_ids = ["Debian"] if (distro_codename() not in supported_codenames @@ -160,6 +160,7 @@ def check_distro(options): "\tUbuntu 18.04 LTS (bionic with EoL April 2028)", "\tUbuntu 20.04 LTS (focal with EoL April 2030)", "\tUbuntu 22.04 LTS (jammy with EoL April 2032)", + "\tUbuntu 24.04 LTS (noble with EoL June 2029)", "\tDebian 10 (buster) or later", sep="\n", file=sys.stderr, @@ -345,7 +346,6 @@ def lib_list(): "libglib2.0-0", "libgl1", "libgtk-3-0", - "libncurses5", "libpam0g", "libpango-1.0-0", "libpangocairo-1.0-0", @@ -374,6 +374,8 @@ def lib_list(): "libxrender1", "libxtst6", "x11-utils", + "xserver-xorg-core", # TODO(crbug.com/1417069): Experimental. + "xserver-xorg-video-dummy", # TODO(crbug.com/1417069): Experimental. "xvfb", "zlib1g", ] @@ -412,6 +414,12 @@ def lib_list(): if package_exists("libinput10"): packages.append("libinput10") + # Work around for dependency On Ubuntu 24.04 LTS (noble) + if distro_codename() == "noble": + packages.append("libncurses6") + else: + packages.append("libncurses5") + return packages @@ -433,7 +441,6 @@ def lib32_list(options): "libegl1:i386", "libgl1:i386", "libglib2.0-0:i386", - "libncurses5:i386", "libnss3:i386", "libpango-1.0-0:i386", "libpangocairo-1.0-0:i386", @@ -465,6 +472,12 @@ def lib32_list(options): pattern = re.compile(r"g\+\+-[0-9.]+-multilib") packages += re.findall(pattern, lines) + # Work around for 32-bit dependency On Ubuntu 24.04 LTS (noble) + if distro_codename() == "noble": + packages.append("libncurses6:i386") + else: + packages.append("libncurses5:i386") + return packages @@ -639,8 +652,6 @@ def nacl_list(options): "libfontconfig1:i386", "libglib2.0-0:i386", "libgpm2:i386", - "libncurses5:i386", - "lib32ncurses5-dev", "libnss3:i386", "libpango-1.0-0:i386", "libssl-dev:i386", @@ -686,6 +697,14 @@ def nacl_list(options): else: packages.append("libudev0:i386") + # Work around for nacl dependency On Ubuntu 24.04 LTS (noble) + if distro_codename() == "noble": + packages.append("libncurses6:i386") + packages.append("lib32ncurses-dev") + else: + packages.append("libncurses5:i386") + packages.append("lib32ncurses5-dev") + return packages @@ -875,7 +894,7 @@ def install_chromeos_fonts(options): def install_locales(): print("Installing locales.", file=sys.stderr) CHROMIUM_LOCALES = [ - "da_DK.UTF-8", "fr_FR.UTF-8", "he_IL.UTF-8", "zh_TW.UTF-8" + "da_DK.UTF-8", "en_US.UTF-8", "fr_FR.UTF-8", "he_IL.UTF-8", "zh_TW.UTF-8" ] LOCALE_GEN = "/etc/locale.gen" if os.path.exists(LOCALE_GEN): diff --git a/build/lacros/test_runner.py b/build/lacros/test_runner.py index ba15266..9d39ec3 100755 --- a/build/lacros/test_runner.py +++ b/build/lacros/test_runner.py @@ -14,7 +14,7 @@ ./build/lacros/test_runner.py test out/lacros/url_unittests ./build/lacros/test_runner.py test out/lacros/browser_tests - The commands above run url_unittests and browser_tests respecitively, and more + The commands above run url_unittests and browser_tests respectively, and more specifically, url_unitests is executed directly while browser_tests is executed with the latest version of prebuilt ash-chrome, and the behavior is controlled by |_TARGETS_REQUIRE_ASH_CHROME|, and it's worth noting that the @@ -28,12 +28,17 @@ the underlying test binary can be specified in the command. ./build/lacros/test_runner.py test out/lacros/browser_tests \\ - --ash-chrome-version=793554 + --ash-chrome-version=120.0.6099.0 The above command runs tests with a given version of ash-chrome, which is - useful to reproduce test failures, the version corresponds to the commit - position of commits on the master branch, and a list of prebuilt versions can - be found at: gs://ash-chromium-on-linux-prebuilts/x86_64. + useful to reproduce test failures. A list of prebuilt versions can + be found at: + https://chrome-infra-packages.appspot.com/p/chromium/testing/linux-ash-chromium/x86_64/ash.zip + Click on any instance, you should see the version number for that instance. + Also, there are refs, which points to the instance for that channel. It should + be close the prod version but no guarantee. + For legacy refs, like legacy119, it point to the latest version for that + milestone. ./testing/xvfb.py ./build/lacros/test_runner.py test out/lacros/browser_tests @@ -117,7 +122,6 @@ # serially. 'interactive_ui_tests', 'lacros_chrome_browsertests', - 'lacros_chrome_browsertests_run_in_series' ] # Default test filter file for each target. These filter files will be @@ -574,6 +578,7 @@ def _RunTestWithAshChrome(args, forward_args): '--disable-lacros-keep-alive', '--disable-login-lacros-opening', '--enable-field-trial-config', + '--enable-logging=stderr', '--enable-features=LacrosSupport,LacrosPrimary,LacrosOnly', '--ash-ready-file-path=%s' % ash_ready_file, '--wayland-server-socket=%s' % ash_wayland_socket_name, @@ -823,9 +828,9 @@ def Main(): '--ash-chrome-version', type=str, help='Version of an prebuilt ash-chrome to use for testing, for example: ' - '"793554", and the version corresponds to the commit position of commits ' - 'on the main branch. If not specified, will use the latest version ' - 'available') + '"120.0.6099.0", and the version corresponds to the commit position of ' + 'commits on the main branch. If not specified, will use the latest ' + 'version available') version_group.add_argument( '--ash-chrome-path', type=str, diff --git a/build/lacros/test_runner_test.py b/build/lacros/test_runner_test.py index 0e2d665..7d0fbec 100755 --- a/build/lacros/test_runner_test.py +++ b/build/lacros/test_runner_test.py @@ -107,6 +107,7 @@ def test_require_ash_chrome(self, command, mock_popen, mock_download, *_): '--disable-lacros-keep-alive', '--disable-login-lacros-opening', '--enable-field-trial-config', + '--enable-logging=stderr', '--enable-features=LacrosSupport,LacrosPrimary,LacrosOnly', '--ash-ready-file-path=/tmp/ash-data/ash_ready.txt', '--wayland-server-socket=wayland-exo', diff --git a/build/linux/libncursesw/DIR_METADATA b/build/linux/libncursesw/DIR_METADATA index 6bbf490..714a4d8 100644 --- a/build/linux/libncursesw/DIR_METADATA +++ b/build/linux/libncursesw/DIR_METADATA @@ -1,5 +1,7 @@ -monorail { +monorail: { component: "Internals>Accessibility" } - team_email: "chromium-accessibility@chromium.org" +buganizer_public: { + component_id: 1456313 +} diff --git a/build/linux/sysroot_scripts/.style.yapf b/build/linux/sysroot_scripts/.style.yapf new file mode 100644 index 0000000..557fa7b --- /dev/null +++ b/build/linux/sysroot_scripts/.style.yapf @@ -0,0 +1,2 @@ +[style] +based_on_style = pep8 diff --git a/build/linux/sysroot_scripts/build_and_upload.py b/build/linux/sysroot_scripts/build_and_upload.py index 9e3338a..8695698 100755 --- a/build/linux/sysroot_scripts/build_and_upload.py +++ b/build/linux/sysroot_scripts/build_and_upload.py @@ -3,7 +3,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -"""Automates running sysroot-creator.sh for each supported arch. +"""Automates running sysroot_creator.py for each supported arch. """ @@ -11,92 +11,103 @@ import json import multiprocessing import os -import shlex -import subprocess import sys -ARCHES = ("amd64", "i386", "armhf", "arm64", "armel", "mipsel", "mips64el") +import sysroot_creator -DEFAULT_URL_PREFIX = "https://commondatastorage.googleapis.com/" \ - "chrome-linux-sysroot/toolchain" +DEFAULT_URL_PREFIX = ("https://commondatastorage.googleapis.com/" + "chrome-linux-sysroot/toolchain") def sha1sumfile(filename): - sha1 = hashlib.sha1() - with open(filename, "rb") as f: - while True: - data = f.read(65536) - if not data: - break - sha1.update(data) - return sha1.hexdigest() - - -def get_proc_output(args): - return subprocess.check_output(args, encoding="utf-8").strip() - - -def build_and_upload(script_path, distro, release, key, arch, lock): - script_dir = os.path.dirname(os.path.realpath(__file__)) - - subprocess.check_output([script_path, "build", arch]) - subprocess.check_output([script_path, "upload", arch]) - - 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 = { - "Key": key, - "Sha1Sum": sha1sum, - "SysrootDir": sysroot_dir, - "Tarball": tarball, - "URL": DEFAULT_URL_PREFIX, - } - with lock: - fname = os.path.join(script_dir, "sysroots.json") - sysroots = json.load(open(fname)) - with open(fname, "w") as f: - sysroots["%s_%s" % (release, arch.lower())] = sysroot_metadata - f.write( - json.dumps(sysroots, sort_keys=True, indent=4, - separators=(",", ": "))) - f.write("\n") + sha1 = hashlib.sha1() + with open(filename, "rb") as f: + while True: + data = f.read(65536) + if not data: + break + sha1.update(data) + return sha1.hexdigest() + + +def build_and_upload(key, arch, lock): + script_dir = os.path.dirname(os.path.realpath(__file__)) + + sysroot_creator.build_sysroot(arch) + sysroot_creator.upload_sysroot(arch) + + tarball = "%s_%s_%s_sysroot.tar.xz" % ( + sysroot_creator.DISTRO, + sysroot_creator.RELEASE, + arch.lower(), + ) + tarxz_path = os.path.join( + script_dir, + "..", + "..", + "..", + "out", + "sysroot-build", + sysroot_creator.RELEASE, + tarball, + ) + sha1sum = sha1sumfile(tarxz_path) + sysroot_dir = "%s_%s_%s-sysroot" % ( + sysroot_creator.DISTRO, + sysroot_creator.RELEASE, + arch.lower(), + ) + sysroot_metadata = { + "Key": key, + "Sha1Sum": sha1sum, + "SysrootDir": sysroot_dir, + "Tarball": tarball, + "URL": DEFAULT_URL_PREFIX, + } + with lock: + fname = os.path.join(script_dir, "sysroots.json") + sysroots = json.load(open(fname)) + with open(fname, "w") as f: + sysroots["%s_%s" % (sysroot_creator.RELEASE, + arch.lower())] = sysroot_metadata + f.write( + json.dumps(sysroots, + sort_keys=True, + indent=4, + separators=(",", ": "))) + f.write("\n") -def main(): - script_dir = os.path.dirname(os.path.realpath(__file__)) - script_path = os.path.join(script_dir, "sysroot-creator.sh") - lexer = shlex.shlex(open(script_path).read(), posix=True) - lexer.wordchars += "=" - vars = dict(kv.split("=") for kv in list(lexer) if "=" in kv) - distro = vars["DISTRO"] - release = vars["RELEASE"] - key = "%s-%s" % (vars["ARCHIVE_TIMESTAMP"], vars["SYSROOT_RELEASE"]) - - procs = [] - lock = multiprocessing.Lock() - for arch in ARCHES: - proc = multiprocessing.Process( - target=build_and_upload, - args=(script_path, distro, release, key, arch, lock), - ) - procs.append(("%s %s (%s)" % (distro, release, arch), proc)) - proc.start() - for _, proc in procs: - proc.join() - print("SYSROOT CREATION SUMMARY") - failures = 0 - for name, proc in procs: - if proc.exitcode: - failures += 1 - status = "FAILURE" if proc.exitcode else "SUCCESS" - print("%s sysroot creation\t%s" % (name, status)) - return failures +def main(): + key = "%s-%s" % (sysroot_creator.ARCHIVE_TIMESTAMP, + sysroot_creator.SYSROOT_RELEASE) + + procs = [] + lock = multiprocessing.Lock() + for arch in sysroot_creator.TRIPLES: + proc = multiprocessing.Process( + target=build_and_upload, + args=(key, arch, lock), + ) + procs.append(( + "%s %s (%s)" % + (sysroot_creator.DISTRO, sysroot_creator.RELEASE, arch), + proc, + )) + proc.start() + for _, proc in procs: + proc.join() + + print("SYSROOT CREATION SUMMARY") + failures = 0 + for name, proc in procs: + if proc.exitcode: + failures += 1 + status = "FAILURE" if proc.exitcode else "SUCCESS" + print("%s sysroot creation\t%s" % (name, status)) + return failures if __name__ == "__main__": - sys.exit(main()) + sys.exit(main()) diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.amd64 b/build/linux/sysroot_scripts/generated_package_lists/bullseye.amd64 index b782e59..8a1a276 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.amd64 +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.amd64 @@ -1,28 +1,28 @@ -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_amd64.deb @@ -33,18 +33,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1-dev_2.2.10-2+deb11u5_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_amd64.deb @@ -61,13 +61,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_amd64.deb @@ -78,14 +78,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_amd64.deb @@ -98,238 +98,238 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-dev_1.18.3-6+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libb2/libb2-1_0.98.1-1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libbsd/libbsd0_0.11.3-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr492+repack1-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-intel1_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevent/libevent-2.1-7_2.1.12-stable-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi-dev_3.3-6_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles1_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles2_1.3.2-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd-dev_1.3.2-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpciaccess/libpciaccess0_0.16-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng-dev_1.6.37-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libproxy/libproxy1v5_0.4.17-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpsl/libpsl5_0.21.0-1.2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.72.0-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter-dev_1.2.1-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-dev_2.17.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-drm2_2.17.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-glx2_2.17.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-wayland2_2.17.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-x11-2_2.17.0-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbis0a_1.3.7-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbisenc2_1.3.7-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp7_1.2.4-0.2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau-dev_1.0.9-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync-dev_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0-dev_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinerama0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinput0_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xkb1_1.14-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.5-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt-dev_4.4.18-4_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor-dev_1.2.0-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage-dev_1.1.5-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext-dev_1.3.3-1.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi-dev_1.7.10-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.0.3-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1-dev_1.1.34-4+deb11u1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss-dev_1.2.3-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt-dev_1.2.0-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3-dev_3.61-1+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openldap/libldap-2.4-2_2.4.59+dfsg-1~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl-dev_1.1.1n-0+deb11u4_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-32-0_10.36-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-dev_10.36-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-posix2_10.36-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre16-3_8.39-13_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_amd64.deb @@ -342,8 +342,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_amd64.deb @@ -354,56 +354,56 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-o https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd-dev_0.11.4-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff6_4.5.0-6_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-bin_1.18.0-2~exp1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-client0_1.18.0-2~exp1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-cursor0_1.18.0-2~exp1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-dev_1.18.0-2~exp1.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0-dev_0.4.0-1+b3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-keysyms/libxcb-keysyms1_0.4.0-1+b2_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0-dev_0.3.9-1+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-wm/libxcb-icccm4_0.4.1-1.1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_amd64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_amd64.deb diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.arm64 b/build/linux/sysroot_scripts/generated_package_lists/bullseye.arm64 index e58880f..88e7141 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.arm64 +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.arm64 @@ -1,28 +1,28 @@ -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_arm64.deb @@ -33,18 +33,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1-dev_2.2.10-2+deb11u5_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_arm64.deb @@ -60,14 +60,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_arm64.deb @@ -78,14 +77,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_arm64.deb @@ -98,22 +97,26 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-dev_1.18.3-6+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libb2/libb2-1_0.98.1-1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libbsd/libbsd0_0.11.3-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr492+repack1-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-etnaviv1_2.4.104-1_arm64.deb @@ -121,218 +124,213 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdr https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-tegra0_2.4.104-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevent/libevent-2.1-7_2.1.12-stable-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi-dev_3.3-6_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles1_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles2_1.3.2-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd-dev_1.3.2-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpciaccess/libpciaccess0_0.16-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng-dev_1.6.37-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libproxy/libproxy1v5_0.4.17-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpsl/libpsl5_0.21.0-1.2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.72.0-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter-dev_1.2.1-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-dev_2.17.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-drm2_2.17.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-glx2_2.17.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-wayland2_2.17.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-x11-2_2.17.0-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbis0a_1.3.7-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbisenc2_1.3.7-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp7_1.2.4-0.2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau-dev_1.0.9-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync-dev_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0-dev_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinerama0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinput0_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xkb1_1.14-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.5-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt-dev_4.4.18-4_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor-dev_1.2.0-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage-dev_1.1.5-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext-dev_1.3.3-1.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi-dev_1.7.10-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.0.3-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1-dev_1.1.34-4+deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss-dev_1.2.3-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt-dev_1.2.0-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3-dev_3.61-1+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openldap/libldap-2.4-2_2.4.59+dfsg-1~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl-dev_1.1.1n-0+deb11u4_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-32-0_10.36-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-dev_10.36-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-posix2_10.36-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre16-3_8.39-13_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_arm64.deb @@ -345,8 +343,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_arm64.deb @@ -357,56 +355,56 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-o https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd-dev_0.11.4-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff6_4.5.0-6_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-bin_1.18.0-2~exp1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-client0_1.18.0-2~exp1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-cursor0_1.18.0-2~exp1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-dev_1.18.0-2~exp1.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0-dev_0.4.0-1+b3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-keysyms/libxcb-keysyms1_0.4.0-1+b2_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0-dev_0.3.9-1+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-wm/libxcb-icccm4_0.4.1-1.1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_arm64.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_arm64.deb diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.armel b/build/linux/sysroot_scripts/generated_package_lists/bullseye.armel index bb1d76d..be86c5c 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.armel +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.armel @@ -1,28 +1,28 @@ -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_armel.deb @@ -33,18 +33,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1-dev_2.2.10-2+deb11u5_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_armel.deb @@ -57,13 +57,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_armel.deb @@ -74,14 +74,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_armel.deb @@ -94,22 +94,26 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-dev_1.18.3-6+deb11u3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libb2/libb2-1_0.98.1-1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libbsd/libbsd0_0.11.3-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr492+repack1-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-exynos1_2.4.104-1_armel.deb @@ -118,217 +122,213 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdr https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-omap1_2.4.104-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-tegra0_2.4.104-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevent/libevent-2.1-7_2.1.12-stable-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi-dev_3.3-6_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles1_1.3.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles2_1.3.2-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd-dev_1.3.2-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpciaccess/libpciaccess0_0.16-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng-dev_1.6.37-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libproxy/libproxy1v5_0.4.17-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpsl/libpsl5_0.21.0-1.2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.4-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.72.0-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter-dev_1.2.1-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-dev_2.17.0-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-drm2_2.17.0-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-glx2_2.17.0-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-wayland2_2.17.0-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-x11-2_2.17.0-1~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbis0a_1.3.7-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbisenc2_1.3.7-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp7_1.2.4-0.2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau-dev_1.0.9-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync-dev_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0-dev_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinerama0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinput0_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xkb1_1.14-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.5-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt-dev_4.4.18-4_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor-dev_1.2.0-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage-dev_1.1.5-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext-dev_1.3.3-1.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi-dev_1.7.10-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.0.3-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1-dev_1.1.34-4+deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss-dev_1.2.3-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt-dev_1.2.0-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3-dev_3.61-1+deb11u3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openldap/libldap-2.4-2_2.4.59+dfsg-1~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl-dev_1.1.1n-0+deb11u4_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-32-0_10.36-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-dev_10.36-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-posix2_10.36-2+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre16-3_8.39-13_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_armel.deb @@ -341,8 +341,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_armel.deb @@ -353,55 +353,55 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-o https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd-dev_0.11.4-2~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff6_4.5.0-6_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-bin_1.18.0-2~exp1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-client0_1.18.0-2~exp1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-cursor0_1.18.0-2~exp1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-dev_1.18.0-2~exp1.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0-dev_0.4.0-1+b3_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-keysyms/libxcb-keysyms1_0.4.0-1+b2_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0-dev_0.3.9-1+b1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-wm/libxcb-icccm4_0.4.1-1.1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_armel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_armel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_armel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_armel.deb diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.armhf b/build/linux/sysroot_scripts/generated_package_lists/bullseye.armhf index 2785535..9311436 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.armhf +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.armhf @@ -1,28 +1,28 @@ -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_armhf.deb @@ -33,18 +33,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1-dev_2.2.10-2+deb11u5_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_armhf.deb @@ -57,13 +57,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_armhf.deb @@ -74,14 +74,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_armhf.deb @@ -94,22 +94,26 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-dev_1.18.3-6+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libb2/libb2-1_0.98.1-1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libbsd/libbsd0_0.11.3-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr492+repack1-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-etnaviv1_2.4.104-1_armhf.deb @@ -119,217 +123,213 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdr https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-omap1_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-tegra0_2.4.104-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevent/libevent-2.1-7_2.1.12-stable-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi-dev_3.3-6_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles1_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles2_1.3.2-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd-dev_1.3.2-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpciaccess/libpciaccess0_0.16-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng-dev_1.6.37-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libproxy/libproxy1v5_0.4.17-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpsl/libpsl5_0.21.0-1.2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.72.0-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter-dev_1.2.1-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-dev_2.17.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-drm2_2.17.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-glx2_2.17.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-wayland2_2.17.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-x11-2_2.17.0-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbis0a_1.3.7-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbisenc2_1.3.7-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp7_1.2.4-0.2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau-dev_1.0.9-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync-dev_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0-dev_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinerama0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinput0_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xkb1_1.14-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.5-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt-dev_4.4.18-4_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor-dev_1.2.0-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage-dev_1.1.5-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext-dev_1.3.3-1.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi-dev_1.7.10-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.0.3-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1-dev_1.1.34-4+deb11u1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss-dev_1.2.3-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt-dev_1.2.0-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3-dev_3.61-1+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openldap/libldap-2.4-2_2.4.59+dfsg-1~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl-dev_1.1.1n-0+deb11u4_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-32-0_10.36-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-dev_10.36-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-posix2_10.36-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre16-3_8.39-13_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_armhf.deb @@ -342,8 +342,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_armhf.deb @@ -354,56 +354,56 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-o https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd-dev_0.11.4-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff6_4.5.0-6_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-bin_1.18.0-2~exp1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-client0_1.18.0-2~exp1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-cursor0_1.18.0-2~exp1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-dev_1.18.0-2~exp1.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0-dev_0.4.0-1+b3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-keysyms/libxcb-keysyms1_0.4.0-1+b2_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0-dev_0.3.9-1+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-wm/libxcb-icccm4_0.4.1-1.1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_armhf.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_armhf.deb diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.i386 b/build/linux/sysroot_scripts/generated_package_lists/bullseye.i386 index cd354e2..a150f68 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.i386 +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.i386 @@ -1,28 +1,28 @@ -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_i386.deb @@ -33,18 +33,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1-dev_2.2.10-2+deb11u5_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_i386.deb @@ -59,13 +59,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_i386.deb @@ -76,14 +76,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_i386.deb @@ -96,238 +96,238 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-dev_1.18.3-6+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libb2/libb2-1_0.98.1-1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libbsd/libbsd0_0.11.3-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr492+repack1-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-intel1_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevent/libevent-2.1-7_2.1.12-stable-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi-dev_3.3-6_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles1_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles2_1.3.2-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd-dev_1.3.2-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpciaccess/libpciaccess0_0.16-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng-dev_1.6.37-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libproxy/libproxy1v5_0.4.17-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpsl/libpsl5_0.21.0-1.2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.72.0-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter-dev_1.2.1-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-dev_2.17.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-drm2_2.17.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-glx2_2.17.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-wayland2_2.17.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-x11-2_2.17.0-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbis0a_1.3.7-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbisenc2_1.3.7-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp7_1.2.4-0.2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau-dev_1.0.9-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync-dev_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0-dev_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinerama0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinput0_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xkb1_1.14-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.5-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt-dev_4.4.18-4_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor-dev_1.2.0-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage-dev_1.1.5-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext-dev_1.3.3-1.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi-dev_1.7.10-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.0.3-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1-dev_1.1.34-4+deb11u1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss-dev_1.2.3-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt-dev_1.2.0-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3-dev_3.61-1+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openldap/libldap-2.4-2_2.4.59+dfsg-1~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl-dev_1.1.1n-0+deb11u4_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-32-0_10.36-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-dev_10.36-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-posix2_10.36-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre16-3_8.39-13_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_i386.deb @@ -340,8 +340,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_i386.deb @@ -352,56 +352,56 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-o https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd-dev_0.11.4-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff6_4.5.0-6_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-bin_1.18.0-2~exp1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-client0_1.18.0-2~exp1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-cursor0_1.18.0-2~exp1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-dev_1.18.0-2~exp1.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0-dev_0.4.0-1+b3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-keysyms/libxcb-keysyms1_0.4.0-1+b2_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0-dev_0.3.9-1+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-wm/libxcb-icccm4_0.4.1-1.1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_i386.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_i386.deb diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.mips64el b/build/linux/sysroot_scripts/generated_package_lists/bullseye.mips64el index 78e5909..a49696a 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.mips64el +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.mips64el @@ -1,28 +1,28 @@ -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_mips64el.deb @@ -33,18 +33,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1-dev_2.2.10-2+deb11u5_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_mips64el.deb @@ -55,13 +55,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_mips64el.deb @@ -72,14 +72,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_mips64el.deb @@ -92,237 +92,237 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-dev_1.18.3-6+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_5.19.11-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libb2/libb2-1_0.98.1-1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libbsd/libbsd0_0.11.3-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr492+repack1-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevent/libevent-2.1-7_2.1.12-stable-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi-dev_3.3-6_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles1_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles2_1.3.2-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd-dev_1.3.2-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpciaccess/libpciaccess0_0.16-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng-dev_1.6.37-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libproxy/libproxy1v5_0.4.17-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpsl/libpsl5_0.21.0-1.2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.72.0-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter-dev_1.2.1-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-dev_2.17.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-drm2_2.17.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-glx2_2.17.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-wayland2_2.17.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-x11-2_2.17.0-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbis0a_1.3.7-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbisenc2_1.3.7-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp7_1.2.4-0.2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau-dev_1.0.9-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync-dev_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0-dev_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinerama0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinput0_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xkb1_1.14-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.5-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt-dev_4.4.18-4_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor-dev_1.2.0-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage-dev_1.1.5-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext-dev_1.3.3-1.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi-dev_1.7.10-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.0.3-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1-dev_1.1.34-4+deb11u1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss-dev_1.2.3-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt-dev_1.2.0-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_5.19.11-1~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3-dev_3.61-1+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openldap/libldap-2.4-2_2.4.59+dfsg-1~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl-dev_1.1.1n-0+deb11u4_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-32-0_10.36-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-dev_10.36-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-posix2_10.36-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre16-3_8.39-13_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_mips64el.deb @@ -335,8 +335,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_mips64el.deb @@ -347,56 +347,56 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-o https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd-dev_0.11.4-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff6_4.5.0-6_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-bin_1.18.0-2~exp1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-client0_1.18.0-2~exp1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-cursor0_1.18.0-2~exp1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-dev_1.18.0-2~exp1.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0-dev_0.4.0-1+b3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-keysyms/libxcb-keysyms1_0.4.0-1+b2_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0-dev_0.3.9-1+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-wm/libxcb-icccm4_0.4.1-1.1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_mips64el.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_mips64el.deb diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.mipsel b/build/linux/sysroot_scripts/generated_package_lists/bullseye.mipsel index dc38c60..f5310b7 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.mipsel +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.mipsel @@ -1,28 +1,28 @@ -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2-dev_1.16.0-5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo2_1.16.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2_2.3.3op2-3+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_mipsel.deb @@ -33,18 +33,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf1_0.187-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1-dev_2.2.10-2+deb11u5_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/expat/libexpat1_2.2.10-2+deb11u5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_mipsel.deb @@ -55,13 +55,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_mipsel.deb @@ -72,14 +72,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_mipsel.deb @@ -92,237 +92,237 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/lib https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5-dev_1.18.3-6+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.12-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libb2/libb2-1_0.98.1-1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libb/libbsd/libbsd0_0.11.3-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap-dev_2.44-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcap2/libcap2_2.44-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr492+repack1-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev2_1.11.0+dfsg-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevent/libevent-2.1-7_2.1.12-stable-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi-dev_3.3-6_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl1_1.3.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles1_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles2_1.3.2-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgles-dev_1.3.2-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd-dev_1.3.2-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg0_1.3.4-0.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpciaccess/libpciaccess0_0.16-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng-dev_1.6.37-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libproxy/libproxy1v5_0.4.17-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpsl/libpsl5_0.21.0-1.2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libp/libpthread-stubs/libpthread-stubs0-dev_0.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.72.0-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoup2.4/libsoup2.4-1_2.72.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter-dev_1.2.1-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libutempter/libutempter0_1.2.1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-dev_2.17.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-drm2_2.17.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-glx2_2.17.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-wayland2_2.17.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva-x11-2_2.17.0-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libva/libva2_2.17.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbis0a_1.3.7-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvorbis/libvorbisenc2_1.3.7-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp7_1.2.4-0.2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau-dev_1.0.9-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxau/libxau6_1.0.9-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri2-0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-dri3-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-glx0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-present0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-randr0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-render0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shape0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-shm0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync-dev_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-sync1_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0-dev_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xfixes0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinerama0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xinput0_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb-xkb1_1.14-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1-dev_1.14-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcb/libxcb1_1.14-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.5-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcomposite/libxcomposite1_0.4.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt-dev_4.4.18-4_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor-dev_1.2.0-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxcursor/libxcursor1_1.2.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage-dev_1.1.5-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdamage/libxdamage1_1.1.5-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp-dev_1.1.2-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext-dev_1.3.3-1.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxext/libxext6_1.3.3-1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxfixes/libxfixes3_5.0.3-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi-dev_1.7.10-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxi/libxi6_1.7.10-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxinerama/libxinerama1_1.1.4-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-dev_1.0.3-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender-dev_0.9.10-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrender/libxrender1_0.9.10-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence-dev_1.3-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1-dev_1.1.34-4+deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss-dev_1.2.3-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxss/libxss1_1.2.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt-dev_1.2.0-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxt/libxt6_1.2.0-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxtst/libxtst6_1.2.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.12-1~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4_4.29-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3-dev_3.61-1+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nss/libnss3_3.61-1+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openldap/libldap-2.4-2_2.4.59+dfsg-1~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl-dev_1.1.1n-0+deb11u4_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-32-0_10.36-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-dev_10.36-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-posix2_10.36-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre16-3_8.39-13_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3-dev_8.39-13_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_mipsel.deb @@ -335,8 +335,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_mipsel.deb @@ -347,55 +347,55 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-o https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy1v5_1.1.8-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd-dev_0.11.4-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff6_4.5.0-6_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-bin_1.18.0-2~exp1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-client0_1.18.0-2~exp1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-cursor0_1.18.0-2~exp1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-dev_1.18.0-2~exp1.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland-protocols/wayland-protocols_1.20-1_all.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0-dev_0.4.0-1+b3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-image/libxcb-image0_0.4.0-1+b3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-keysyms/libxcb-keysyms1_0.4.0-1+b2_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0-dev_0.3.9-1+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-renderutil/libxcb-render-util0_0.3.9-1+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util-wm/libxcb-icccm4_0.4.1-1.1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-1+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_mipsel.deb -https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_mipsel.deb diff --git a/build/linux/sysroot_scripts/merge-package-lists.py b/build/linux/sysroot_scripts/merge-package-lists.py deleted file mode 100755 index e2a5a63..0000000 --- a/build/linux/sysroot_scripts/merge-package-lists.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2016 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Merge package entries from different package lists. -""" - -# This is used for replacing packages in eg. bullseye with those in bookworm. -# The updated packages are ABI compatible, but include security patches, so we -# should use those instead in our sysroots. - -import sys - -if len(sys.argv) != 2: - exit(1) - -packages = {} - -def AddPackagesFromFile(file): - global packages - lines = file.readlines() - if len(lines) % 3 != 0: - exit(1) - for i in range(0, len(lines), 3): - packages[lines[i]] = (lines[i + 1], lines[i + 2]) - -AddPackagesFromFile(open(sys.argv[1], 'r')) -AddPackagesFromFile(sys.stdin) - -output_file = open(sys.argv[1], 'w') - -for (package, (filename, sha256)) in packages.items(): - output_file.write(package + filename + sha256) diff --git a/build/linux/sysroot_scripts/reversion_glibc.py b/build/linux/sysroot_scripts/reversion_glibc.py old mode 100755 new mode 100644 index 8651386..b7e18ef --- a/build/linux/sysroot_scripts/reversion_glibc.py +++ b/build/linux/sysroot_scripts/reversion_glibc.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -8,117 +7,119 @@ import re import subprocess -import sys # This constant comes from the oldest glibc version in # //chrome/installer/linux/debian/dist_package_versions.json and # //chrome/installer/linux/rpm/dist_package_provides.json MAX_ALLOWED_GLIBC_VERSION = [2, 26] -VERSION_PATTERN = re.compile('GLIBC_([0-9\.]+)') -SECTION_PATTERN = re.compile(r'^ *\[ *[0-9]+\] +(\S+) +\S+ + ([0-9a-f]+) .*$') +VERSION_PATTERN = re.compile("GLIBC_([0-9\.]+)") +SECTION_PATTERN = re.compile(r"^ *\[ *[0-9]+\] +(\S+) +\S+ + ([0-9a-f]+) .*$") # Some otherwise disallowed symbols are referenced in the linux-chromeos build. # To continue supporting it, allow these symbols to remain enabled. SYMBOL_ALLOWLIST = { - 'fts64_close', - 'fts64_open', - 'fts64_read', - 'memfd_create', + "fts64_close", + "fts64_open", + "fts64_read", + "memfd_create", } -# The two dictionaries below map from symbol name to -# (symbol version, symbol index). -# -# The default version for a given symbol (which may be unsupported). -default_version = {} -# The max supported symbol version for a given symbol. -supported_version = {} - -# The file name of the binary we're going to rewrite. -BIN_FILE = sys.argv[1] - -# Populate |default_version| and |supported_version| with data from readelf. -stdout = subprocess.check_output(['readelf', '--dyn-syms', '--wide', BIN_FILE]) -for line in stdout.decode("utf-8").split('\n'): - cols = re.split('\s+', line) - # Skip the preamble. - if len(cols) < 9: - continue - - index = cols[1].rstrip(':') - # Skip the header. - if not index.isdigit(): - continue - - index = int(index) - name = cols[8].split('@') - # Ignore unversioned symbols. - if len(name) < 2: - continue - - base_name = name[0] - version = name[-1] - # The default version will have '@@' in the name. - is_default = len(name) > 2 - - if version.startswith('XCRYPT_'): - # Prefer GLIBC_* versioned symbols over XCRYPT_* ones. Set the version to - # something > MAX_ALLOWED_GLIBC_VERSION so this symbol will not be picked. - version = [float('inf')] - else: - match = re.match(VERSION_PATTERN, version) - # Ignore symbols versioned with GLIBC_PRIVATE. - if not match: - continue - version = [int(part) for part in match.group(1).split('.')] - - if version < MAX_ALLOWED_GLIBC_VERSION: - old_supported_version = supported_version.get(base_name, ([-1], -1)) - supported_version[base_name] = max((version, index), old_supported_version) - if is_default: - default_version[base_name] = (version, index) - -# Get the offset into the binary of the .gnu.version section from readelf. -stdout = subprocess.check_output(['readelf', '--sections', '--wide', BIN_FILE]) -for line in stdout.decode("utf-8").split('\n'): - if match := SECTION_PATTERN.match(line): - section_name, address = match.groups() - if section_name == '.gnu.version': - gnu_version_addr = int(address, base=16) - break -else: - print('No .gnu.version section found', file=sys.stderr) - sys.exit(1) - -# Rewrite the binary. -bin_data = bytearray(open(BIN_FILE, 'rb').read()) -for name, (version, index) in default_version.items(): - # No need to rewrite the default if it's already an allowed version. - if version <= MAX_ALLOWED_GLIBC_VERSION: - continue - - if name in SYMBOL_ALLOWLIST: - continue - elif name in supported_version: - _, supported_index = supported_version[name] - else: - supported_index = -1 - - # The .gnu.version section is divided into 16-bit chunks that give the - # symbol versions. The 16th bit is a flag that's false for the default - # version. The data is stored in little-endian so we need to add 1 to - # get the address of the byte we want to flip. - # - # Disable the unsupported symbol. - old_default = gnu_version_addr + 2 * index + 1 - assert (bin_data[old_default] & 0x80) == 0 - bin_data[old_default] ^= 0x80 - - # If we found a supported version, enable that as default. - if supported_index != -1: - new_default = gnu_version_addr + 2 * supported_index + 1 - assert (bin_data[new_default] & 0x80) == 0x80 - bin_data[new_default] ^= 0x80 - -open(BIN_FILE, 'wb').write(bin_data) + +def reversion_glibc(bin_file: str) -> None: + # The two dictionaries below map from symbol name to + # (symbol version, symbol index). + # + # The default version for a given symbol (which may be unsupported). + default_version = {} + # The max supported symbol version for a given symbol. + supported_version = {} + + # Populate |default_version| and |supported_version| with data from readelf. + stdout = subprocess.check_output( + ["readelf", "--dyn-syms", "--wide", bin_file]) + for line in stdout.decode("utf-8").split("\n"): + cols = re.split("\s+", line) + # Skip the preamble. + if len(cols) < 9: + continue + + index = cols[1].rstrip(":") + # Skip the header. + if not index.isdigit(): + continue + + index = int(index) + name = cols[8].split("@") + # Ignore unversioned symbols. + if len(name) < 2: + continue + + base_name = name[0] + version = name[-1] + # The default version will have '@@' in the name. + is_default = len(name) > 2 + + if version.startswith("XCRYPT_"): + # Prefer GLIBC_* versioned symbols over XCRYPT_* ones. + # Set the version to something > MAX_ALLOWED_GLIBC_VERSION + # so this symbol will not be picked. + version = [10**10] + else: + match = re.match(VERSION_PATTERN, version) + # Ignore symbols versioned with GLIBC_PRIVATE. + if not match: + continue + version = [int(part) for part in match.group(1).split(".")] + + if version < MAX_ALLOWED_GLIBC_VERSION: + old_supported_version = supported_version.get( + base_name, ([-1], -1)) + supported_version[base_name] = max((version, index), + old_supported_version) + if is_default: + default_version[base_name] = (version, index) + + # Get the offset into the binary of the .gnu.version section from readelf. + stdout = subprocess.check_output( + ["readelf", "--sections", "--wide", bin_file]) + for line in stdout.decode("utf-8").split("\n"): + if match := SECTION_PATTERN.match(line): + section_name, address = match.groups() + if section_name == ".gnu.version": + gnu_version_addr = int(address, base=16) + break + else: + raise Exception("No .gnu.version section found") + + # Rewrite the binary. + bin_data = bytearray(open(bin_file, "rb").read()) + for name, (version, index) in default_version.items(): + # No need to rewrite the default if it's already an allowed version. + if version <= MAX_ALLOWED_GLIBC_VERSION: + continue + + if name in SYMBOL_ALLOWLIST: + continue + elif name in supported_version: + _, supported_index = supported_version[name] + else: + supported_index = -1 + + # The .gnu.version section is divided into 16-bit chunks that give the + # symbol versions. The 16th bit is a flag that's false for the default + # version. The data is stored in little-endian so we need to add 1 to + # get the address of the byte we want to flip. + # + # Disable the unsupported symbol. + old_default = gnu_version_addr + 2 * index + 1 + assert (bin_data[old_default] & 0x80) == 0 + bin_data[old_default] ^= 0x80 + + # If we found a supported version, enable that as default. + if supported_index != -1: + new_default = gnu_version_addr + 2 * supported_index + 1 + assert (bin_data[new_default] & 0x80) == 0x80 + bin_data[new_default] ^= 0x80 + + open(bin_file, "wb").write(bin_data) diff --git a/build/linux/sysroot_scripts/sysroot-creator.sh b/build/linux/sysroot_scripts/sysroot-creator.sh deleted file mode 100755 index 71a9ade..0000000 --- a/build/linux/sysroot_scripts/sysroot-creator.sh +++ /dev/null @@ -1,1027 +0,0 @@ -#!/bin/bash - -# Copyright 2014 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -#@ This script builds Debian sysroot images for building Google Chrome. -#@ -#@ Usage: -#@ sysroot-creator.sh {build,upload} \ -#@ {amd64,i386,armhf,arm64,armel,mipsel,mips64el} -#@ - -###################################################################### -# Config -###################################################################### - -set -o nounset -set -o errexit - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -DISTRO=debian -RELEASE=bullseye - -# This number is appended to the sysroot key to cause full rebuilds. It -# should be incremented when removing packages or patching existing packages. -# It should not be incremented when adding packages. -SYSROOT_RELEASE=2 - -ARCHIVE_TIMESTAMP=20230611T210420Z - -ARCHIVE_URL="https://snapshot.debian.org/archive/debian/$ARCHIVE_TIMESTAMP/" -APT_SOURCES_LIST=( - # Debian 12 (Bookworm) is needed for GTK4. It should be kept before bullseye - # so that bullseye takes precedence. - "${ARCHIVE_URL} bookworm main" - "${ARCHIVE_URL} bookworm-updates main" - - # This mimics a sources.list from bullseye. - "${ARCHIVE_URL} bullseye main contrib non-free" - "${ARCHIVE_URL} bullseye-updates main contrib non-free" - "${ARCHIVE_URL} bullseye-backports main contrib non-free" -) - -# gpg keyring file generated using generate_keyring.sh -KEYRING_FILE="${SCRIPT_DIR}/keyring.gpg" - -# Sysroot packages: these are the packages needed to build chrome. -DEBIAN_PACKAGES="\ - comerr-dev - krb5-multidev - libasound2 - libasound2-dev - libasyncns0 - libatk-bridge2.0-0 - libatk-bridge2.0-dev - libatk1.0-0 - libatk1.0-dev - libatomic1 - libatspi2.0-0 - libatspi2.0-dev - libattr1 - libaudit1 - libavahi-client3 - libavahi-common3 - libb2-1 - libblkid-dev - libblkid1 - libbluetooth-dev - libbluetooth3 - libbrotli-dev - libbrotli1 - libbsd0 - libc6 - libc6-dev - libcairo-gobject2 - libcairo-script-interpreter2 - libcairo2 - libcairo2-dev - libcap-dev - libcap-ng0 - libcap2 - libcloudproviders0 - libcolord2 - libcom-err2 - libcrypt-dev - libcrypt1 - libcups2 - libcups2-dev - libcupsimage2 - libcupsimage2-dev - libcurl3-gnutls - libcurl4-gnutls-dev - libdatrie-dev - libdatrie1 - libdb5.3 - libdbus-1-3 - libdbus-1-dev - libdbus-glib-1-2 - libdbusmenu-glib-dev - libdbusmenu-glib4 - libdbusmenu-gtk3-4 - libdbusmenu-gtk4 - libdeflate-dev - libdeflate0 - libdouble-conversion3 - libdrm-amdgpu1 - libdrm-dev - libdrm-nouveau2 - libdrm-radeon1 - libdrm2 - libegl-dev - libegl1 - libegl1-mesa - libegl1-mesa-dev - libelf-dev - libelf1 - libepoxy-dev - libepoxy0 - libevdev-dev - libevdev2 - libevent-2.1-7 - libexpat1 - libexpat1-dev - libffi-dev - libffi7 - libflac-dev - libflac8 - libfontconfig-dev - libfontconfig1 - libfreetype-dev - libfreetype6 - libfribidi-dev - libfribidi0 - libgbm-dev - libgbm1 - libgcc-10-dev - libgcc-s1 - libgcrypt20 - libgcrypt20-dev - libgdk-pixbuf-2.0-0 - libgdk-pixbuf-2.0-dev - libgl-dev - libgl1 - libgl1-mesa-dev - libgl1-mesa-glx - libglapi-mesa - libgles-dev - libgles1 - libgles2 - libglib2.0-0 - libglib2.0-dev - libglvnd-dev - libglvnd0 - libglx-dev - libglx0 - libgmp10 - libgnutls-dane0 - libgnutls-openssl27 - libgnutls28-dev - libgnutls30 - libgnutlsxx28 - libgomp1 - libgpg-error-dev - libgpg-error0 - libgraphene-1.0-0 - libgraphene-1.0-dev - libgraphite2-3 - libgraphite2-dev - libgssapi-krb5-2 - libgssrpc4 - libgtk-3-0 - libgtk-3-dev - libgtk-4-1 - libgtk-4-dev - libgtk2.0-0 - libgudev-1.0-0 - libharfbuzz-dev - libharfbuzz-gobject0 - libharfbuzz-icu0 - libharfbuzz0b - libhogweed6 - libice6 - libicu-le-hb0 - libicu67 - libidl-2-0 - libidn11 - libidn2-0 - libinput-dev - libinput10 - libjbig-dev - libjbig0 - libjpeg62-turbo - libjpeg62-turbo-dev - libjson-glib-1.0-0 - libjsoncpp-dev - libjsoncpp24 - libk5crypto3 - libkadm5clnt-mit12 - libkadm5srv-mit12 - libkdb5-10 - libkeyutils1 - libkrb5-3 - libkrb5-dev - libkrb5support0 - liblcms2-2 - libldap-2.4-2 - liblerc4 - libltdl7 - liblz4-1 - liblzma5 - liblzo2-2 - libmd0 - libmd4c0 - libminizip-dev - libminizip1 - libmount-dev - libmount1 - libmtdev1 - libncurses-dev - libncurses6 - libncursesw6 - libnettle8 - libnghttp2-14 - libnsl2 - libnspr4 - libnspr4-dev - libnss-db - libnss3 - libnss3-dev - libogg-dev - libogg0 - libopengl0 - libopus-dev - libopus0 - libp11-kit0 - libpam0g - libpam0g-dev - libpango-1.0-0 - libpango1.0-dev - libpangocairo-1.0-0 - libpangoft2-1.0-0 - libpangox-1.0-0 - libpangoxft-1.0-0 - libpci-dev - libpci3 - libpciaccess0 - libpcre16-3 - libpcre2-16-0 - libpcre2-32-0 - libpcre2-8-0 - libpcre2-dev - libpcre2-posix2 - libpcre3 - libpcre3-dev - libpcre32-3 - libpcrecpp0v5 - libpipewire-0.3-0 - libpipewire-0.3-dev - libpixman-1-0 - libpixman-1-dev - libpng-dev - libpng16-16 - libproxy1v5 - libpsl5 - libpthread-stubs0-dev - libpulse-dev - libpulse-mainloop-glib0 - libpulse0 - libqt5concurrent5 - libqt5core5a - libqt5dbus5 - libqt5gui5 - libqt5network5 - libqt5printsupport5 - libqt5sql5 - libqt5test5 - libqt5widgets5 - libqt5xml5 - libqt6concurrent6 - libqt6core6 - libqt6dbus6 - libqt6gui6 - libqt6network6 - libqt6opengl6 - libqt6openglwidgets6 - libqt6printsupport6 - libqt6sql6 - libqt6test6 - libqt6widgets6 - libqt6xml6 - libre2-9 - libre2-dev - librest-0.7-0 - librtmp1 - libsasl2-2 - libselinux1 - libselinux1-dev - libsepol1 - libsepol1-dev - libsm6 - libsnappy-dev - libsnappy1v5 - libsndfile1 - libsoup-gnome2.4-1 - libsoup2.4-1 - libspa-0.2-dev - libspeechd-dev - libspeechd2 - libsqlite3-0 - libssh2-1 - libssl-dev - libssl1.1 - libstdc++-10-dev - libstdc++6 - libsystemd-dev - libsystemd0 - libtasn1-6 - libthai-dev - libthai0 - libtiff-dev - libtiff5 - libtiff6 - libtiffxx5 - libtinfo6 - libtirpc3 - libts0 - libudev-dev - libudev1 - libunbound8 - libunistring2 - libutempter-dev - libutempter0 - libuuid1 - libva-dev - libva-drm2 - libva-glx2 - libva-wayland2 - libva-x11-2 - libva2 - libvorbis0a - libvorbisenc2 - libvulkan-dev - libvulkan1 - libwacom2 - libwayland-bin - libwayland-client0 - libwayland-cursor0 - libwayland-dev - libwayland-egl-backend-dev - libwayland-egl1 - libwayland-egl1-mesa - libwayland-server0 - libwebp-dev - libwebp6 - libwebp7 - libwebpdemux2 - libwebpmux3 - libwrap0 - libx11-6 - libx11-dev - libx11-xcb-dev - libx11-xcb1 - libxau-dev - libxau6 - libxcb-dri2-0 - libxcb-dri2-0-dev - libxcb-dri3-0 - libxcb-dri3-dev - libxcb-glx0 - libxcb-glx0-dev - libxcb-icccm4 - libxcb-image0 - libxcb-image0-dev - libxcb-keysyms1 - libxcb-present-dev - libxcb-present0 - libxcb-randr0 - libxcb-randr0-dev - libxcb-render-util0 - libxcb-render-util0-dev - libxcb-render0 - libxcb-render0-dev - libxcb-shape0 - libxcb-shape0-dev - libxcb-shm0 - libxcb-shm0-dev - libxcb-sync-dev - libxcb-sync1 - libxcb-util-dev - libxcb-util1 - libxcb-xfixes0 - libxcb-xfixes0-dev - libxcb-xinerama0 - libxcb-xinput0 - libxcb-xkb1 - libxcb1 - libxcb1-dev - libxcomposite-dev - libxcomposite1 - libxcursor-dev - libxcursor1 - libxdamage-dev - libxdamage1 - libxdmcp-dev - libxdmcp6 - libxext-dev - libxext6 - libxfixes-dev - libxfixes3 - libxft-dev - libxft2 - libxi-dev - libxi6 - libxinerama-dev - libxinerama1 - libxkbcommon-dev - libxkbcommon-x11-0 - libxkbcommon0 - libxml2 - libxml2-dev - libxrandr-dev - libxrandr2 - libxrender-dev - libxrender1 - libxshmfence-dev - libxshmfence1 - libxslt1-dev - libxslt1.1 - libxss-dev - libxss1 - libxt-dev - libxt6 - libxtst-dev - libxtst6 - libxxf86vm-dev - libxxf86vm1 - libzstd1 - linux-libc-dev - mesa-common-dev - qt6-base-dev - qt6-base-dev-tools - qtbase5-dev - qtbase5-dev-tools - shared-mime-info - uuid-dev - wayland-protocols - x11proto-dev - zlib1g - zlib1g-dev -" - -DEBIAN_PACKAGES_AMD64=" - libasan6 - libdrm-intel1 - libitm1 - liblsan0 - libquadmath0 - libtsan0 - libubsan1 - valgrind -" - -DEBIAN_PACKAGES_I386=" - libasan6 - libdrm-intel1 - libitm1 - libquadmath0 - libubsan1 - valgrind -" - -DEBIAN_PACKAGES_ARMHF=" - libasan6 - libdrm-etnaviv1 - libdrm-exynos1 - libdrm-freedreno1 - libdrm-omap1 - libdrm-tegra0 - libubsan1 - valgrind -" - -DEBIAN_PACKAGES_ARM64=" - libasan6 - libdrm-etnaviv1 - libdrm-freedreno1 - libdrm-tegra0 - libgmp10 - libitm1 - liblsan0 - libthai0 - libtsan0 - libubsan1 - valgrind -" - -DEBIAN_PACKAGES_ARMEL=" - libasan6 - libdrm-exynos1 - libdrm-freedreno1 - libdrm-omap1 - libdrm-tegra0 - libubsan1 -" - -DEBIAN_PACKAGES_MIPSEL=" -" - -DEBIAN_PACKAGES_MIPS64EL=" - valgrind -" - -readonly REQUIRED_TOOLS="curl xzcat" - -###################################################################### -# Package Config -###################################################################### - -readonly PACKAGES_EXT=xz -readonly RELEASE_FILE="Release" -readonly RELEASE_FILE_GPG="Release.gpg" - -###################################################################### -# Helper -###################################################################### - -Banner() { - echo "######################################################################" - echo $* - echo "######################################################################" -} - - -SubBanner() { - echo "----------------------------------------------------------------------" - echo $* - echo "----------------------------------------------------------------------" -} - - -Usage() { - egrep "^#@" "${BASH_SOURCE[0]}" | cut --bytes=3- -} - - -DownloadOrCopyNonUniqueFilename() { - # Use this function instead of DownloadOrCopy when the url uniquely - # identifies the file, but the filename (excluding the directory) - # does not. - local url="$1" - local dest="$2" - - local hash="$(echo "$url" | sha256sum | cut -d' ' -f1)" - - DownloadOrCopy "${url}" "${dest}.${hash}" - # cp the file to prevent having to redownload it, but mv it to the - # final location so that it's atomic. - cp "${dest}.${hash}" "${dest}.$$" - mv "${dest}.$$" "${dest}" -} - -DownloadOrCopy() { - if [ -f "$2" ] ; then - echo "$2 already in place" - return - fi - - HTTP=0 - echo "$1" | grep -Eqs '^https?://' && HTTP=1 - if [ "$HTTP" = "1" ]; then - 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. - local temp_file="${2}.partial.$$" - # curl --retry doesn't retry when the page gives a 4XX error, so we need to - # manually rerun. - for i in {1..10}; do - # --create-dirs is added in case there are slashes in the filename, as can - # happen with the "debian/security" release class. - local http_code=$(curl -L "$1" --create-dirs -o "${temp_file}" \ - -w "%{http_code}") - if [ ${http_code} -eq 200 ]; then - break - fi - echo "Bad HTTP code ${http_code} when downloading $1" - rm -f "${temp_file}" - sleep $i - done - if [ ! -f "${temp_file}" ]; then - exit 1 - fi - mv "${temp_file}" $2 - else - SubBanner "copying from $1" - cp "$1" "$2" - fi -} - -SetEnvironmentVariables() { - case $ARCH in - amd64) - TRIPLE=x86_64-linux-gnu - DEBIAN_PACKAGES_ARCH="${DEBIAN_PACKAGES_AMD64}" - ;; - i386) - TRIPLE=i386-linux-gnu - DEBIAN_PACKAGES_ARCH="${DEBIAN_PACKAGES_I386}" - ;; - armhf) - TRIPLE=arm-linux-gnueabihf - DEBIAN_PACKAGES_ARCH="${DEBIAN_PACKAGES_ARMHF}" - ;; - arm64) - TRIPLE=aarch64-linux-gnu - DEBIAN_PACKAGES_ARCH="${DEBIAN_PACKAGES_ARM64}" - ;; - armel) - TRIPLE=arm-linux-gnueabi - DEBIAN_PACKAGES_ARCH="${DEBIAN_PACKAGES_ARMEL}" - ;; - mipsel) - TRIPLE=mipsel-linux-gnu - DEBIAN_PACKAGES_ARCH="${DEBIAN_PACKAGES_MIPSEL}" - ;; - mips64el) - TRIPLE=mips64el-linux-gnuabi64 - DEBIAN_PACKAGES_ARCH="${DEBIAN_PACKAGES_MIPS64EL}" - ;; - *) - echo "ERROR: Unsupported architecture: $ARCH" - Usage - exit 1 - ;; - esac -} - -# some sanity checks to make sure this script is run from the right place -# with the right tools -SanityCheck() { - Banner "Sanity Checks" - - local chrome_dir=$(cd "${SCRIPT_DIR}/../../.." && pwd) - BUILD_DIR="${chrome_dir}/out/sysroot-build/${RELEASE}" - mkdir -p ${BUILD_DIR} - echo "Using build directory: ${BUILD_DIR}" - - for tool in ${REQUIRED_TOOLS} ; do - if ! which ${tool} > /dev/null ; then - echo "Required binary $tool not found." - echo "Exiting." - exit 1 - fi - done - - # This is where the staging sysroot is. - INSTALL_ROOT="${BUILD_DIR}/${RELEASE}_${ARCH}_staging" - TARBALL="${BUILD_DIR}/${DISTRO}_${RELEASE}_${ARCH}_sysroot.tar.xz" - - if ! mkdir -p "${INSTALL_ROOT}" ; then - echo "ERROR: ${INSTALL_ROOT} can't be created." - exit 1 - fi -} - - -ChangeDirectory() { - # Change directory to where this script is. - cd ${SCRIPT_DIR} -} - - -ClearInstallDir() { - Banner "Clearing dirs in ${INSTALL_ROOT}" - rm -rf ${INSTALL_ROOT}/* -} - - -CreateTarBall() { - Banner "Creating tarball ${TARBALL}" - tar -I "xz -9 -T0" -cf ${TARBALL} -C ${INSTALL_ROOT} . -} - -ExtractPackageXz() { - local src_file="$1" - local dst_file="$2" - local repo="$3" - xzcat "${src_file}" | egrep '^(Package:|Filename:|SHA256:) ' | - sed "s|Filename: |Filename: ${repo}|" > "${dst_file}" -} - -GeneratePackageListDistRepo() { - local arch="$1" - local repo="$2" - local dist="$3" - local repo_name="$4" - - local tmp_package_list="${BUILD_DIR}/Packages.${dist}_${repo_name}_${arch}" - 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}" - - DownloadOrCopyNonUniqueFilename "${package_list_arch}" "${package_list}" - VerifyPackageListing "${package_file_arch}" "${package_list}" ${repo} ${dist} - ExtractPackageXz "${package_list}" "${tmp_package_list}" ${repo} - cat "${tmp_package_list}" | ./merge-package-lists.py "${list_base}" -} - -GeneratePackageListDist() { - local arch="$1" - set -- $2 - local repo="$1" - local dist="$2" - shift 2 - while (( "$#" )); do - GeneratePackageListDistRepo "$arch" "$repo" "$dist" "$1" - shift - done -} - -GeneratePackageList() { - local output_file="$1" - local arch="$2" - local packages="$3" - - local list_base="${BUILD_DIR}/Packages.${RELEASE}_${arch}" - > "${list_base}" # Create (or truncate) a zero-length file. - printf '%s\n' "${APT_SOURCES_LIST[@]}" | while read source; do - GeneratePackageListDist "${arch}" "${source}" - done - - GeneratePackageListImpl "${list_base}" "${output_file}" \ - "${DEBIAN_PACKAGES} ${packages}" -} - -StripChecksumsFromPackageList() { - local package_file="$1" - sed -i 's/ [a-f0-9]\{64\}$//' "$package_file" -} - -###################################################################### -# -###################################################################### - -HacksAndPatches() { - Banner "Misc Hacks & Patches" - - # Remove an unnecessary dependency on qtchooser. - rm "${INSTALL_ROOT}/usr/lib/${TRIPLE}/qt-default/qtchooser/default.conf" - - # libxcomposite1 is missing a symbols file. - cp "${SCRIPT_DIR}/libxcomposite1-symbols" \ - "${INSTALL_ROOT}/debian/libxcomposite1/DEBIAN/symbols" - - # __GLIBC_MINOR__ is used as a feature test macro. Replace it with the - # earliest supported version of glibc (2.26, obtained from the oldest glibc - # version in //chrome/installer/linux/debian/dist_packag_versions.json and - # //chrome/installer/linux/rpm/dist_package_provides.json). - local usr_include="${INSTALL_ROOT}/usr/include" - local features_h="${usr_include}/features.h" - sed -i 's|\(#define\s\+__GLIBC_MINOR__\)|\1 26 //|' "${features_h}" - - # fcntl64() was introduced in glibc 2.28. Make sure to use fcntl() instead. - local fcntl_h="${INSTALL_ROOT}/usr/include/fcntl.h" - sed -i '{N; s/#ifndef __USE_FILE_OFFSET64\(\nextern int fcntl\)/#if 1\1/}' \ - "${fcntl_h}" - - # Do not use pthread_cond_clockwait as it was introduced in glibc 2.30. - local cppconfig_h="${usr_include}/${TRIPLE}/c++/10/bits/c++config.h" - sed -i 's|\(#define\s\+_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT\)|// \1|' \ - "${cppconfig_h}" - - # Include limits.h in stdlib.h to fix an ODR issue - # (https://sourceware.org/bugzilla/show_bug.cgi?id=30516) - local stdlib_h="${usr_include}/stdlib.h" - sed -i '/#include /a #include ' "${stdlib_h}" - - # This is for chrome's ./build/linux/pkg-config-wrapper - # which overwrites PKG_CONFIG_LIBDIR internally - SubBanner "Move pkgconfig scripts" - mkdir -p ${INSTALL_ROOT}/usr/lib/pkgconfig - mv ${INSTALL_ROOT}/usr/lib/${TRIPLE}/pkgconfig/* \ - ${INSTALL_ROOT}/usr/lib/pkgconfig - - # Avoid requiring unsupported glibc versions. - "${SCRIPT_DIR}/reversion_glibc.py" \ - "${INSTALL_ROOT}/lib/${TRIPLE}/libc.so.6" - "${SCRIPT_DIR}/reversion_glibc.py" \ - "${INSTALL_ROOT}/lib/${TRIPLE}/libm.so.6" - "${SCRIPT_DIR}/reversion_glibc.py" \ - "${INSTALL_ROOT}/lib/${TRIPLE}/libcrypt.so.1" -} - -InstallIntoSysroot() { - Banner "Install Libs And Headers Into Jail" - - mkdir -p ${BUILD_DIR}/debian-packages - # The /debian directory is an implementation detail that's used to cd into - # when running dpkg-shlibdeps. - mkdir -p ${INSTALL_ROOT}/debian - # An empty control file is necessary to run dpkg-shlibdeps. - touch ${INSTALL_ROOT}/debian/control - while (( "$#" )); do - local file="$1" - local package="${BUILD_DIR}/debian-packages/${file##*/}" - shift - local sha256sum="$1" - shift - if [ "${#sha256sum}" -ne "64" ]; then - echo "Bad sha256sum from package list" - exit 1 - fi - - Banner "Installing $(basename ${file})" - DownloadOrCopy ${file} ${package} - if [ ! -s "${package}" ] ; then - echo - echo "ERROR: bad package ${package}" - exit 1 - fi - echo "${sha256sum} ${package}" | sha256sum --quiet -c - - SubBanner "Extracting to ${INSTALL_ROOT}" - dpkg-deb -x ${package} ${INSTALL_ROOT} - - base_package=$(dpkg-deb --field ${package} Package) - mkdir -p ${INSTALL_ROOT}/debian/${base_package}/DEBIAN - dpkg-deb -e ${package} ${INSTALL_ROOT}/debian/${base_package}/DEBIAN - done - - # Prune /usr/share, leaving only pkgconfig, wayland, and wayland-protocols. - ls -d ${INSTALL_ROOT}/usr/share/* | \ - grep -v "/\(pkgconfig\|wayland\|wayland-protocols\)$" | xargs rm -r -} - - -CleanupJailSymlinks() { - Banner "Jail symlink cleanup" - - SAVEDPWD=$(pwd) - cd ${INSTALL_ROOT} - local libdirs="lib usr/lib" - if [ -d lib64 ]; then - libdirs="${libdirs} lib64" - fi - - find $libdirs -type l -printf '%p %l\n' | while read link target; do - # skip links with non-absolute paths - echo "${target}" | grep -qs ^/ || continue - echo "${link}: ${target}" - # Relativize the symlink. - prefix=$(echo "${link}" | sed -e 's/[^/]//g' | sed -e 's|/|../|g') - ln -snfv "${prefix}${target}" "${link}" - done - - failed=0 - while read link target; do - # Make sure we catch new bad links. - if [ ! -r "${link}" ]; then - echo "ERROR: FOUND BAD LINK ${link}" - ls -l ${link} - failed=1 - fi - done < <(find $libdirs -type l -printf '%p %l\n') - if [ $failed -eq 1 ]; then - exit 1 - fi - cd "$SAVEDPWD" -} - - -VerifyLibraryDeps() { - local find_dirs=( - "${INSTALL_ROOT}/lib/" - "${INSTALL_ROOT}/lib/${TRIPLE}/" - "${INSTALL_ROOT}/usr/lib/${TRIPLE}/" - ) - local needed_libs="$( - find ${find_dirs[*]} -name "*\.so*" -type f -exec file {} \; | \ - grep ': ELF' | sed 's/^\(.*\): .*$/\1/' | xargs readelf -d | \ - grep NEEDED | sort | uniq | sed 's/^.*Shared library: \[\(.*\)\]$/\1/g')" - local all_libs="$(find ${find_dirs[*]} -printf '%f\n')" - # Ignore missing libdbus-1.so.0 - all_libs+="$(echo -e '\nlibdbus-1.so.0')" - local missing_libs="$(grep -vFxf <(echo "${all_libs}") \ - <(echo "${needed_libs}"))" - if [ ! -z "${missing_libs}" ]; then - echo "Missing libraries:" - echo "${missing_libs}" - exit 1 - fi -} - -BuildSysroot() { - ClearInstallDir - local package_file="generated_package_lists/${RELEASE}.${ARCH}" - GeneratePackageList "${package_file}" $ARCH "${DEBIAN_PACKAGES_ARCH}" - local files_and_sha256sums="$(cat ${package_file})" - StripChecksumsFromPackageList "$package_file" - InstallIntoSysroot ${files_and_sha256sums} - HacksAndPatches - CleanupJailSymlinks - VerifyLibraryDeps - CreateTarBall -} - -UploadSysroot() { - local sha=$(sha1sum "${TARBALL}" | awk '{print $1;}') - set -x - gsutil.py cp -a public-read "${TARBALL}" \ - "gs://chrome-linux-sysroot/toolchain/$sha/" - set +x -} - -# -# CheckForDebianGPGKeyring -# -# Make sure the Debian GPG keys exist. Otherwise print a helpful message. -# -CheckForDebianGPGKeyring() { - if [ ! -e "$KEYRING_FILE" ]; then - echo "KEYRING_FILE not found: ${KEYRING_FILE}" - echo "Debian GPG keys missing. Install the debian-archive-keyring package." - exit 1 - fi -} - -# -# VerifyPackageListing -# -# Verifies the downloaded Packages.xz file has the right checksums. -# -VerifyPackageListing() { - local file_path="$1" - local output_file="$2" - local repo="$3" - local dist="$4" - - local repo_basedir="${repo}/dists/${dist}" - local release_list="${repo_basedir}/${RELEASE_FILE}" - local release_list_gpg="${repo_basedir}/${RELEASE_FILE_GPG}" - - local release_file="${BUILD_DIR}/${dist}-${RELEASE_FILE}" - local release_file_gpg="${BUILD_DIR}/${dist}-${RELEASE_FILE_GPG}" - - CheckForDebianGPGKeyring - - DownloadOrCopyNonUniqueFilename ${release_list} ${release_file} - DownloadOrCopyNonUniqueFilename ${release_list_gpg} ${release_file_gpg} - echo "Verifying: ${release_file} with ${release_file_gpg}" - set -x - gpgv --keyring "${KEYRING_FILE}" "${release_file_gpg}" "${release_file}" - set +x - - echo "Verifying: ${output_file}" - local sha256sum=$(grep -E "${file_path}\$|:\$" "${release_file}" | \ - grep "SHA256:" -A 1 | xargs echo | awk '{print $2;}') - - if [ "${#sha256sum}" -ne "64" ]; then - echo "Bad sha256sum from ${release_list}" - exit 1 - fi - - echo "${sha256sum} ${output_file}" | sha256sum --quiet -c -} - -# -# GeneratePackageListImpl -# -# Looks up package names in ${BUILD_DIR}/Packages and write list of URLs -# to output file. -# -GeneratePackageListImpl() { - local input_file="$1" - local output_file="$2" - echo "Updating: ${output_file} from ${input_file}" - /bin/rm -f "${output_file}" - shift - shift - local failed=0 - for pkg in $@ ; do - local pkg_full=$(grep -A 1 " ${pkg}\$" "$input_file" | \ - egrep "pool/.*" | sed 's/.*Filename: //') - if [ -z "${pkg_full}" ]; then - echo "ERROR: missing package: $pkg" - local failed=1 - else - local sha256sum=$(grep -A 4 " ${pkg}\$" "$input_file" | \ - grep ^SHA256: | sed 's/^SHA256: //') - if [ "${#sha256sum}" -ne "64" ]; then - echo "Bad sha256sum from Packages" - local failed=1 - fi - echo $pkg_full $sha256sum >> "$output_file" - fi - done - if [ $failed -eq 1 ]; then - exit 1 - fi - # sort -o does an in-place sort of this file - sort "$output_file" -o "$output_file" -} - -if [ $# -ne 2 ]; then - Usage - exit 1 -else - ChangeDirectory - ARCH=$2 - SetEnvironmentVariables - SanityCheck - case "$1" in - build) - BuildSysroot - ;; - upload) - UploadSysroot - ;; - *) - echo "ERROR: Invalid command: $1" - Usage - exit 1 - ;; - esac -fi diff --git a/build/linux/sysroot_scripts/sysroot_creator.py b/build/linux/sysroot_scripts/sysroot_creator.py new file mode 100755 index 0000000..c64e446 --- /dev/null +++ b/build/linux/sysroot_scripts/sysroot_creator.py @@ -0,0 +1,998 @@ +#!/usr/bin/env python3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +""" +This script is used to build Debian sysroot images for building Chromium. +""" + +import argparse +import hashlib +import lzma +import os +import re +import shutil +import subprocess +import tempfile +import time + +import requests +import reversion_glibc + +DISTRO = "debian" +RELEASE = "bullseye" + +# This number is appended to the sysroot key to cause full rebuilds. It +# should be incremented when removing packages or patching existing packages. +# It should not be incremented when adding packages. +SYSROOT_RELEASE = 2 + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + +CHROME_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, "..", "..", "..")) +BUILD_DIR = os.path.join(CHROME_DIR, "out", "sysroot-build", RELEASE) + +# gpg keyring file generated using generate_keyring.sh +KEYRING_FILE = os.path.join(SCRIPT_DIR, "keyring.gpg") + +ARCHIVE_TIMESTAMP = "20230611T210420Z" + +ARCHIVE_URL = f"https://snapshot.debian.org/archive/debian/{ARCHIVE_TIMESTAMP}/" +APT_SOURCES_LIST = [ + # Debian 12 (Bookworm) is needed for GTK4. It should be kept before + # bullseye so that bullseye takes precedence. + ("bookworm", ["main"]), + ("bookworm-updates", ["main"]), + # This mimics a sources.list from bullseye. + ("bullseye", ["main", "contrib", "non-free"]), + ("bullseye-updates", ["main", "contrib", "non-free"]), + ("bullseye-backports", ["main", "contrib", "non-free"]), +] + +TRIPLES = { + "amd64": "x86_64-linux-gnu", + "i386": "i386-linux-gnu", + "armhf": "arm-linux-gnueabihf", + "arm64": "aarch64-linux-gnu", + "armel": "arm-linux-gnueabi", + "mipsel": "mipsel-linux-gnu", + "mips64el": "mips64el-linux-gnuabi64", +} + +REQUIRED_TOOLS = [ + "dpkg-deb", + "file", + "gpgv", + "readelf", + "tar", + "xz", +] + +# Package configuration +PACKAGES_EXT = "xz" +RELEASE_FILE = "Release" +RELEASE_FILE_GPG = "Release.gpg" + +# Packages common to all architectures. +DEBIAN_PACKAGES = [ + "comerr-dev", + "krb5-multidev", + "libasound2", + "libasound2-dev", + "libasyncns0", + "libatk-bridge2.0-0", + "libatk-bridge2.0-dev", + "libatk1.0-0", + "libatk1.0-dev", + "libatomic1", + "libatspi2.0-0", + "libatspi2.0-dev", + "libattr1", + "libaudit1", + "libavahi-client3", + "libavahi-common3", + "libb2-1", + "libblkid-dev", + "libblkid1", + "libbluetooth-dev", + "libbluetooth3", + "libbrotli-dev", + "libbrotli1", + "libbsd0", + "libc6", + "libc6-dev", + "libcairo-gobject2", + "libcairo-script-interpreter2", + "libcairo2", + "libcairo2-dev", + "libcap-dev", + "libcap-ng0", + "libcap2", + "libcloudproviders0", + "libcolord2", + "libcom-err2", + "libcrypt-dev", + "libcrypt1", + "libcups2", + "libcups2-dev", + "libcupsimage2", + "libcupsimage2-dev", + "libcurl3-gnutls", + "libcurl4-gnutls-dev", + "libdatrie-dev", + "libdatrie1", + "libdb5.3", + "libdbus-1-3", + "libdbus-1-dev", + "libdbus-glib-1-2", + "libdbusmenu-glib-dev", + "libdbusmenu-glib4", + "libdbusmenu-gtk3-4", + "libdbusmenu-gtk4", + "libdeflate-dev", + "libdeflate0", + "libdouble-conversion3", + "libdrm-amdgpu1", + "libdrm-dev", + "libdrm-nouveau2", + "libdrm-radeon1", + "libdrm2", + "libegl-dev", + "libegl1", + "libegl1-mesa", + "libegl1-mesa-dev", + "libelf-dev", + "libelf1", + "libepoxy-dev", + "libepoxy0", + "libevdev-dev", + "libevdev2", + "libevent-2.1-7", + "libexpat1", + "libexpat1-dev", + "libffi-dev", + "libffi7", + "libflac-dev", + "libflac8", + "libfontconfig-dev", + "libfontconfig1", + "libfreetype-dev", + "libfreetype6", + "libfribidi-dev", + "libfribidi0", + "libgbm-dev", + "libgbm1", + "libgcc-10-dev", + "libgcc-s1", + "libgcrypt20", + "libgcrypt20-dev", + "libgdk-pixbuf-2.0-0", + "libgdk-pixbuf-2.0-dev", + "libgl-dev", + "libgl1", + "libgl1-mesa-dev", + "libgl1-mesa-glx", + "libglapi-mesa", + "libgles-dev", + "libgles1", + "libgles2", + "libglib2.0-0", + "libglib2.0-dev", + "libglvnd-dev", + "libglvnd0", + "libglx-dev", + "libglx0", + "libgmp10", + "libgnutls-dane0", + "libgnutls-openssl27", + "libgnutls28-dev", + "libgnutls30", + "libgnutlsxx28", + "libgomp1", + "libgpg-error-dev", + "libgpg-error0", + "libgraphene-1.0-0", + "libgraphene-1.0-dev", + "libgraphite2-3", + "libgraphite2-dev", + "libgssapi-krb5-2", + "libgssrpc4", + "libgtk-3-0", + "libgtk-3-dev", + "libgtk-4-1", + "libgtk-4-dev", + "libgtk2.0-0", + "libgudev-1.0-0", + "libharfbuzz-dev", + "libharfbuzz-gobject0", + "libharfbuzz-icu0", + "libharfbuzz0b", + "libhogweed6", + "libice6", + "libicu-le-hb0", + "libicu67", + "libidl-2-0", + "libidn11", + "libidn2-0", + "libinput-dev", + "libinput10", + "libjbig-dev", + "libjbig0", + "libjpeg62-turbo", + "libjpeg62-turbo-dev", + "libjson-glib-1.0-0", + "libjsoncpp-dev", + "libjsoncpp24", + "libk5crypto3", + "libkadm5clnt-mit12", + "libkadm5srv-mit12", + "libkdb5-10", + "libkeyutils1", + "libkrb5-3", + "libkrb5-dev", + "libkrb5support0", + "liblcms2-2", + "libldap-2.4-2", + "liblerc4", + "libltdl7", + "liblz4-1", + "liblzma5", + "liblzo2-2", + "libmd0", + "libmd4c0", + "libminizip-dev", + "libminizip1", + "libmount-dev", + "libmount1", + "libmtdev1", + "libncurses-dev", + "libncurses6", + "libncursesw6", + "libnettle8", + "libnghttp2-14", + "libnsl2", + "libnspr4", + "libnspr4-dev", + "libnss-db", + "libnss3", + "libnss3-dev", + "libogg-dev", + "libogg0", + "libopengl0", + "libopus-dev", + "libopus0", + "libp11-kit0", + "libpam0g", + "libpam0g-dev", + "libpango-1.0-0", + "libpango1.0-dev", + "libpangocairo-1.0-0", + "libpangoft2-1.0-0", + "libpangox-1.0-0", + "libpangoxft-1.0-0", + "libpci-dev", + "libpci3", + "libpciaccess0", + "libpcre16-3", + "libpcre2-16-0", + "libpcre2-32-0", + "libpcre2-8-0", + "libpcre2-dev", + "libpcre2-posix2", + "libpcre3", + "libpcre3-dev", + "libpcre32-3", + "libpcrecpp0v5", + "libpipewire-0.3-0", + "libpipewire-0.3-dev", + "libpixman-1-0", + "libpixman-1-dev", + "libpng-dev", + "libpng16-16", + "libproxy1v5", + "libpsl5", + "libpthread-stubs0-dev", + "libpulse-dev", + "libpulse-mainloop-glib0", + "libpulse0", + "libqt5concurrent5", + "libqt5core5a", + "libqt5dbus5", + "libqt5gui5", + "libqt5network5", + "libqt5printsupport5", + "libqt5sql5", + "libqt5test5", + "libqt5widgets5", + "libqt5xml5", + "libqt6concurrent6", + "libqt6core6", + "libqt6dbus6", + "libqt6gui6", + "libqt6network6", + "libqt6opengl6", + "libqt6openglwidgets6", + "libqt6printsupport6", + "libqt6sql6", + "libqt6test6", + "libqt6widgets6", + "libqt6xml6", + "libre2-9", + "libre2-dev", + "librest-0.7-0", + "librtmp1", + "libsasl2-2", + "libselinux1", + "libselinux1-dev", + "libsepol1", + "libsepol1-dev", + "libsm6", + "libsnappy-dev", + "libsnappy1v5", + "libsndfile1", + "libsoup-gnome2.4-1", + "libsoup2.4-1", + "libspa-0.2-dev", + "libspeechd-dev", + "libspeechd2", + "libsqlite3-0", + "libssh2-1", + "libssl-dev", + "libssl1.1", + "libstdc++-10-dev", + "libstdc++6", + "libsystemd-dev", + "libsystemd0", + "libtasn1-6", + "libthai-dev", + "libthai0", + "libtiff-dev", + "libtiff5", + "libtiff6", + "libtiffxx5", + "libtinfo6", + "libtirpc3", + "libts0", + "libudev-dev", + "libudev1", + "libunbound8", + "libunistring2", + "libutempter-dev", + "libutempter0", + "libuuid1", + "libva-dev", + "libva-drm2", + "libva-glx2", + "libva-wayland2", + "libva-x11-2", + "libva2", + "libvorbis0a", + "libvorbisenc2", + "libvulkan-dev", + "libvulkan1", + "libwacom2", + "libwayland-bin", + "libwayland-client0", + "libwayland-cursor0", + "libwayland-dev", + "libwayland-egl-backend-dev", + "libwayland-egl1", + "libwayland-egl1-mesa", + "libwayland-server0", + "libwebp-dev", + "libwebp6", + "libwebp7", + "libwebpdemux2", + "libwebpmux3", + "libwrap0", + "libx11-6", + "libx11-dev", + "libx11-xcb-dev", + "libx11-xcb1", + "libxau-dev", + "libxau6", + "libxcb-dri2-0", + "libxcb-dri2-0-dev", + "libxcb-dri3-0", + "libxcb-dri3-dev", + "libxcb-glx0", + "libxcb-glx0-dev", + "libxcb-icccm4", + "libxcb-image0", + "libxcb-image0-dev", + "libxcb-keysyms1", + "libxcb-present-dev", + "libxcb-present0", + "libxcb-randr0", + "libxcb-randr0-dev", + "libxcb-render-util0", + "libxcb-render-util0-dev", + "libxcb-render0", + "libxcb-render0-dev", + "libxcb-shape0", + "libxcb-shape0-dev", + "libxcb-shm0", + "libxcb-shm0-dev", + "libxcb-sync-dev", + "libxcb-sync1", + "libxcb-util-dev", + "libxcb-util1", + "libxcb-xfixes0", + "libxcb-xfixes0-dev", + "libxcb-xinerama0", + "libxcb-xinput0", + "libxcb-xkb1", + "libxcb1", + "libxcb1-dev", + "libxcomposite-dev", + "libxcomposite1", + "libxcursor-dev", + "libxcursor1", + "libxdamage-dev", + "libxdamage1", + "libxdmcp-dev", + "libxdmcp6", + "libxext-dev", + "libxext6", + "libxfixes-dev", + "libxfixes3", + "libxft-dev", + "libxft2", + "libxi-dev", + "libxi6", + "libxinerama-dev", + "libxinerama1", + "libxkbcommon-dev", + "libxkbcommon-x11-0", + "libxkbcommon0", + "libxml2", + "libxml2-dev", + "libxrandr-dev", + "libxrandr2", + "libxrender-dev", + "libxrender1", + "libxshmfence-dev", + "libxshmfence1", + "libxslt1-dev", + "libxslt1.1", + "libxss-dev", + "libxss1", + "libxt-dev", + "libxt6", + "libxtst-dev", + "libxtst6", + "libxxf86vm-dev", + "libxxf86vm1", + "libzstd1", + "linux-libc-dev", + "mesa-common-dev", + "qt6-base-dev", + "qt6-base-dev-tools", + "qtbase5-dev", + "qtbase5-dev-tools", + "shared-mime-info", + "uuid-dev", + "wayland-protocols", + "x11proto-dev", + "zlib1g", + "zlib1g-dev", +] + +DEBIAN_PACKAGES_ARCH = { + "amd64": [ + "libasan6", + "libdrm-intel1", + "libitm1", + "liblsan0", + "libquadmath0", + "libtsan0", + "libubsan1", + "valgrind", + ], + "i386": [ + "libasan6", + "libdrm-intel1", + "libitm1", + "libquadmath0", + "libubsan1", + "valgrind", + ], + "armhf": [ + "libasan6", + "libdrm-etnaviv1", + "libdrm-exynos1", + "libdrm-freedreno1", + "libdrm-omap1", + "libdrm-tegra0", + "libubsan1", + "valgrind", + ], + "arm64": [ + "libasan6", + "libdrm-etnaviv1", + "libdrm-freedreno1", + "libdrm-tegra0", + "libgmp10", + "libitm1", + "liblsan0", + "libthai0", + "libtsan0", + "libubsan1", + "valgrind", + ], + "armel": [ + "libasan6", + "libdrm-exynos1", + "libdrm-freedreno1", + "libdrm-omap1", + "libdrm-tegra0", + "libubsan1", + ], + "mipsel": [], + "mips64el": [ + "valgrind", + ], +} + + +def banner(message: str) -> None: + print("#" * 70) + print(message) + print("#" * 70) + + +def sub_banner(message: str) -> None: + print("-" * 70) + print(message) + print("-" * 70) + + +def hash_file(hasher, file_name: str) -> str: + with open(file_name, "rb") as f: + while chunk := f.read(8192): + hasher.update(chunk) + return hasher.hexdigest() + + +def atomic_copyfile(source: str, destination: str) -> None: + dest_dir = os.path.dirname(destination) + with tempfile.NamedTemporaryFile(mode="wb", delete=False, + dir=dest_dir) as temp_file: + temp_filename = temp_file.name + shutil.copyfile(source, temp_filename) + os.rename(temp_filename, destination) + + +def download_or_copy_non_unique_filename(url: str, dest: str) -> None: + """ + Downloads a file from a given URL to a destination with a unique filename, + based on the SHA-256 hash of the URL. + """ + hash_digest = hashlib.sha256(url.encode()).hexdigest() + unique_dest = f"{dest}.{hash_digest}" + download_or_copy(url, unique_dest) + atomic_copyfile(unique_dest, dest) + + +def download_or_copy(source: str, destination: str) -> None: + """ + Downloads a file from the given URL or copies it from a local path to the + specified destination. + """ + if os.path.exists(destination): + print(f"{destination} already in place") + return + + if source.startswith(("http://", "https://")): + download_file(source, destination) + else: + atomic_copyfile(source, destination) + + +def download_file(url: str, dest: str, retries=5) -> None: + """ + Downloads a file from a URL to a specified destination with retry logic, + directory creation, and atomic write. + """ + print(f"Downloading from {url} -> {dest}") + # Create directories if they don't exist + os.makedirs(os.path.dirname(dest), exist_ok=True) + + for attempt in range(retries): + try: + with requests.get(url, stream=True) as response: + response.raise_for_status() + + # Use a temporary file to write data + with tempfile.NamedTemporaryFile( + mode="wb", delete=False, + dir=os.path.dirname(dest)) as temp_file: + for chunk in response.iter_content(chunk_size=8192): + temp_file.write(chunk) + + # Rename temporary file to destination file + os.rename(temp_file.name, dest) + print(f"Downloaded {dest}") + break + + except requests.RequestException as e: + print(f"Attempt {attempt} failed: {e}") + # Exponential back-off + time.sleep(2**attempt) + else: + raise Exception(f"Failed to download file after {retries} attempts") + + +def sanity_check() -> None: + """ + Performs sanity checks to ensure the environment is correctly set up. + """ + banner("Sanity Checks") + + # Determine the Chrome build directory + os.makedirs(BUILD_DIR, exist_ok=True) + print(f"Using build directory: {BUILD_DIR}") + + # Check for required tools + missing = [tool for tool in REQUIRED_TOOLS if not shutil.which(tool)] + if missing: + raise Exception(f"Required tools not found: {', '.join(missing)}") + + +def clear_install_dir(install_root: str) -> None: + if os.path.exists(install_root): + shutil.rmtree(install_root) + os.makedirs(install_root) + + +def create_tarball(install_root: str, arch: str) -> None: + tarball_path = os.path.join(BUILD_DIR, + f"{DISTRO}_{RELEASE}_{arch}_sysroot.tar.xz") + banner("Creating tarball " + tarball_path) + command = [ + "tar", + "-I", + "xz -z9 -T0 --lzma2='dict=256MiB'", + "-cf", + tarball_path, + "-C", + install_root, + ".", + ] + subprocess.run(command, check=True) + + +def generate_package_list_dist_repo(arch: str, dist: str, + repo_name: str) -> list[dict[str, str]]: + repo_basedir = f"{ARCHIVE_URL}/dists/{dist}" + package_list = f"{BUILD_DIR}/Packages.{dist}_{repo_name}_{arch}" + package_list = f"{package_list}.{PACKAGES_EXT}" + package_file_arch = f"{repo_name}/binary-{arch}/Packages.{PACKAGES_EXT}" + package_list_arch = f"{repo_basedir}/{package_file_arch}" + + download_or_copy_non_unique_filename(package_list_arch, package_list) + verify_package_listing(package_file_arch, package_list, dist) + + with lzma.open(package_list, "rt") as src: + return [ + dict( + line.split(": ", 1) for line in package_meta.splitlines() + if not line.startswith(" ")) + for package_meta in src.read().split("\n\n") if package_meta + ] + + +def generate_package_list(arch: str) -> dict[str, str]: + package_meta = {} + for dist, repos in APT_SOURCES_LIST: + for repo_name in repos: + for meta in generate_package_list_dist_repo(arch, dist, repo_name): + package_meta[meta["Package"]] = meta + + # Read the input file and create a dictionary mapping package names to URLs + # and checksums. + missing = set(DEBIAN_PACKAGES + DEBIAN_PACKAGES_ARCH[arch]) + package_dict: dict[str, str] = {} + for meta in package_meta.values(): + package = meta["Package"] + if package in missing: + missing.remove(package) + url = ARCHIVE_URL + meta["Filename"] + package_dict[url] = meta["SHA256"] + if missing: + raise Exception(f"Missing packages: {', '.join(missing)}") + + # Write the URLs and checksums of the requested packages to the output file + output_file = os.path.join(SCRIPT_DIR, "generated_package_lists", + f"{RELEASE}.{arch}") + with open(output_file, "w") as f: + f.write("\n".join(sorted(package_dict)) + "\n") + return package_dict + + +def hacks_and_patches(install_root: str, script_dir: str, arch: str) -> None: + banner("Misc Hacks & Patches") + + # Remove an unnecessary dependency on qtchooser. + qtchooser_conf = os.path.join(install_root, "usr", "lib", TRIPLES[arch], + "qt-default/qtchooser/default.conf") + if os.path.exists(qtchooser_conf): + os.remove(qtchooser_conf) + + # libxcomposite1 is missing a symbols file. + atomic_copyfile( + os.path.join(script_dir, "libxcomposite1-symbols"), + os.path.join(install_root, "debian", "libxcomposite1", "DEBIAN", + "symbols"), + ) + + # __GLIBC_MINOR__ is used as a feature test macro. Replace it with the + # earliest supported version of glibc (2.26). + features_h = os.path.join(install_root, "usr", "include", "features.h") + replace_in_file(features_h, r"(#define\s+__GLIBC_MINOR__)", r"\1 26 //") + + # fcntl64() was introduced in glibc 2.28. Make sure to use fcntl() instead. + fcntl_h = os.path.join(install_root, "usr", "include", "fcntl.h") + replace_in_file( + fcntl_h, + r"#ifndef __USE_FILE_OFFSET64(\nextern int fcntl)", + r"#if 1\1", + ) + + # Do not use pthread_cond_clockwait as it was introduced in glibc 2.30. + cppconfig_h = os.path.join(install_root, "usr", "include", TRIPLES[arch], + "c++", "10", "bits", "c++config.h") + replace_in_file(cppconfig_h, + r"(#define\s+_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT)", + r"// \1") + + # Include limits.h in stdlib.h to fix an ODR issue. + stdlib_h = os.path.join(install_root, "usr", "include", "stdlib.h") + replace_in_file(stdlib_h, r"(#include )", + r"\1\n#include ") + + # Move pkgconfig scripts. + pkgconfig_dir = os.path.join(install_root, "usr", "lib", "pkgconfig") + os.makedirs(pkgconfig_dir, exist_ok=True) + triple_pkgconfig_dir = os.path.join(install_root, "usr", "lib", + TRIPLES[arch], "pkgconfig") + if os.path.exists(triple_pkgconfig_dir): + for file in os.listdir(triple_pkgconfig_dir): + shutil.move(os.path.join(triple_pkgconfig_dir, file), + pkgconfig_dir) + + # Avoid requiring unsupported glibc versions. + for lib in ["libc.so.6", "libm.so.6", "libcrypt.so.1"]: + lib_path = os.path.join(install_root, "lib", TRIPLES[arch], lib) + reversion_glibc.reversion_glibc(lib_path) + + # GTK4 is provided by bookworm (12), but pango is provided by bullseye + # (11). Fix the GTK4 pkgconfig file to relax the pango version + # requirement. + gtk4_pc = os.path.join(pkgconfig_dir, 'gtk4.pc') + replace_in_file(gtk4_pc, r"pango [>=0-9. ]*", "pango") + replace_in_file(gtk4_pc, r"pangocairo [>=0-9. ]*", "pangocairo") + + +def replace_in_file(file_path: str, search_pattern: str, + replace_pattern: str) -> None: + with open(file_path, "r") as file: + content = file.read() + with open(file_path, "w") as file: + file.write(re.sub(search_pattern, replace_pattern, content)) + + +def install_into_sysroot(build_dir: str, install_root: str, + packages: dict[str, str]) -> None: + """ + Installs libraries and headers into the sysroot environment. + """ + banner("Install Libs And Headers Into Jail") + + debian_packages_dir = os.path.join(build_dir, "debian-packages") + os.makedirs(debian_packages_dir, exist_ok=True) + + debian_dir = os.path.join(install_root, "debian") + os.makedirs(debian_dir, exist_ok=True) + control_file = os.path.join(debian_dir, "control") + # Create an empty control file + open(control_file, "a").close() + + for package, sha256sum in packages.items(): + package_name = os.path.basename(package) + package_path = os.path.join(debian_packages_dir, package_name) + + banner(f"Installing {package_name}") + download_or_copy(package, package_path) + if hash_file(hashlib.sha256(), package_path) != sha256sum: + raise ValueError(f"SHA256 mismatch for {package_path}") + + sub_banner(f"Extracting to {install_root}") + subprocess.run(["dpkg-deb", "-x", package_path, install_root], + check=True) + + base_package = get_base_package_name(package_path) + debian_package_dir = os.path.join(debian_dir, base_package, "DEBIAN") + + # Extract the control file + os.makedirs(debian_package_dir, exist_ok=True) + with subprocess.Popen( + ["dpkg-deb", "-e", package_path, debian_package_dir], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) as proc: + _, err = proc.communicate() + if proc.returncode != 0: + message = "Failed to extract control from" + raise Exception( + f"{message} {package_path}: {err.decode('utf-8')}") + + # Prune /usr/share, leaving only pkgconfig, wayland, and wayland-protocols + usr_share = os.path.join(install_root, "usr", "share") + for item in os.listdir(usr_share): + full_path = os.path.join(usr_share, item) + if os.path.isdir(full_path) and item not in [ + "pkgconfig", + "wayland", + "wayland-protocols", + ]: + shutil.rmtree(full_path) + + +def get_base_package_name(package_path: str) -> str: + """ + Retrieves the base package name from a Debian package. + """ + result = subprocess.run(["dpkg-deb", "--field", package_path, "Package"], + capture_output=True, + text=True) + if result.returncode != 0: + raise Exception( + f"Failed to get package name from {package_path}: {result.stderr}") + return result.stdout.strip() + + +def cleanup_jail_symlinks(install_root: str) -> None: + """ + Cleans up jail symbolic links by converting absolute symlinks + into relative ones. + """ + for root, dirs, files in os.walk(install_root): + for name in files + dirs: + full_path = os.path.join(root, name) + if os.path.islink(full_path): + target_path = os.readlink(full_path) + + # Check if the symlink is absolute and points inside the + # install_root. + if os.path.isabs(target_path): + # Compute the relative path from the symlink to the target. + relative_path = os.path.relpath( + os.path.join(install_root, target_path.strip("/")), + os.path.dirname(full_path)) + # Verify that the target exists inside the install_root. + joined_path = os.path.join(os.path.dirname(full_path), + relative_path) + if not os.path.exists(joined_path): + raise Exception( + f"Link target doesn't exist: {joined_path}") + os.remove(full_path) + os.symlink(relative_path, full_path) + + +def verify_library_deps(install_root: str) -> None: + """ + Verifies if all required libraries are present in the sysroot environment. + """ + # Get all shared libraries and their dependencies. + shared_libs = set() + needed_libs = set() + for root, _, files in os.walk(install_root): + for file in files: + if ".so" not in file: + continue + path = os.path.join(root, file) + islink = os.path.islink(path) + if islink: + path = os.path.join(root, os.readlink(path)) + cmd_file = ["file", path] + output = subprocess.check_output(cmd_file).decode() + if ": ELF" not in output or "shared object" not in output: + continue + shared_libs.add(file) + if islink: + continue + cmd_readelf = ["readelf", "-d", path] + output = subprocess.check_output(cmd_readelf).decode() + for line in output.split("\n"): + if "NEEDED" in line: + needed_libs.add(line.split("[")[1].split("]")[0]) + + missing_libs = needed_libs - shared_libs + if missing_libs: + raise Exception(f"Missing libraries: {missing_libs}") + + +def build_sysroot(arch: str) -> None: + install_root = os.path.join(BUILD_DIR, f"{RELEASE}_{arch}_staging") + clear_install_dir(install_root) + packages = generate_package_list(arch) + install_into_sysroot(BUILD_DIR, install_root, packages) + hacks_and_patches(install_root, SCRIPT_DIR, arch) + cleanup_jail_symlinks(install_root) + verify_library_deps(install_root) + create_tarball(install_root, arch) + + +def upload_sysroot(arch: str) -> None: + tarball_path = os.path.join(BUILD_DIR, + f"{DISTRO}_{RELEASE}_{arch}_sysroot.tar.xz") + sha = hash_file(hashlib.sha1(), tarball_path) + + destination_url = f"gs://chrome-linux-sysroot/toolchain/{sha}/" + command = [ + "gsutil.py", "cp", "-a", "public-read", tarball_path, destination_url + ] + subprocess.run(command, check=True) + + +def verify_package_listing(file_path: str, output_file: str, + dist: str) -> None: + """ + Verifies the downloaded Packages.xz file against its checksum and GPG keys. + """ + # Paths for Release and Release.gpg files + repo_basedir = f"{ARCHIVE_URL}/dists/{dist}" + release_list = f"{repo_basedir}/{RELEASE_FILE}" + release_list_gpg = f"{repo_basedir}/{RELEASE_FILE_GPG}" + + release_file = os.path.join(BUILD_DIR, f"{dist}-{RELEASE_FILE}") + release_file_gpg = os.path.join(BUILD_DIR, f"{dist}-{RELEASE_FILE_GPG}") + + if not os.path.exists(KEYRING_FILE): + raise Exception(f"KEYRING_FILE not found: {KEYRING_FILE}") + + # Download Release and Release.gpg files + download_or_copy_non_unique_filename(release_list, release_file) + download_or_copy_non_unique_filename(release_list_gpg, release_file_gpg) + + # Verify Release file with GPG + subprocess.run( + ["gpgv", "--keyring", KEYRING_FILE, release_file_gpg, release_file], + check=True) + + # Find the SHA256 checksum for the specific file in the Release file + sha256sum_pattern = re.compile(r"([a-f0-9]{64})\s+\d+\s+" + + re.escape(file_path) + r"$") + sha256sum_match = None + with open(release_file, "r") as f: + for line in f: + if match := sha256sum_pattern.search(line): + sha256sum_match = match.group(1) + break + + if not sha256sum_match: + raise Exception( + f"Checksum for {file_path} not found in {release_file}") + + if hash_file(hashlib.sha256(), output_file) != sha256sum_match: + raise Exception(f"Checksum mismatch for {output_file}") + + +def main(): + parser = argparse.ArgumentParser( + description="Build and upload Debian sysroot images for Chromium.") + parser.add_argument("command", choices=["build", "upload"]) + parser.add_argument("architecture", choices=list(TRIPLES)) + args = parser.parse_args() + + sanity_check() + + if args.command == "build": + build_sysroot(args.architecture) + elif args.command == "upload": + upload_sysroot(args.architecture) + + +if __name__ == "__main__": + main() diff --git a/build/linux/sysroot_scripts/sysroots.json b/build/linux/sysroot_scripts/sysroots.json index 156d4c6..fa41c46 100644 --- a/build/linux/sysroot_scripts/sysroots.json +++ b/build/linux/sysroot_scripts/sysroots.json @@ -1,49 +1,49 @@ { "bullseye_amd64": { "Key": "20230611T210420Z-2", - "Sha1Sum": "4c00ba2ad61ca7cc39392f192aa39420e086777c", + "Sha1Sum": "ec989b96c5f1e235182e5f2a5c9d23b3eb4101e0", "SysrootDir": "debian_bullseye_amd64-sysroot", "Tarball": "debian_bullseye_amd64_sysroot.tar.xz", "URL": "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain" }, "bullseye_arm64": { "Key": "20230611T210420Z-2", - "Sha1Sum": "41a6c8dec4c4304d6509e30cbaf9218dffb4438e", + "Sha1Sum": "f65e4d81b81d19f4354ed1bb22afeb1f3949a446", "SysrootDir": "debian_bullseye_arm64-sysroot", "Tarball": "debian_bullseye_arm64_sysroot.tar.xz", "URL": "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain" }, "bullseye_armel": { "Key": "20230611T210420Z-2", - "Sha1Sum": "bcff5c5a4060f3be7bff28aa9ff28c100b70a858", + "Sha1Sum": "e27b133d817fd141d6eacdc7db749dfaf7ae6b41", "SysrootDir": "debian_bullseye_armel-sysroot", "Tarball": "debian_bullseye_armel_sysroot.tar.xz", "URL": "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain" }, "bullseye_armhf": { "Key": "20230611T210420Z-2", - "Sha1Sum": "c153bf1027a67eec0f6ea2efa190e29c9c06e603", + "Sha1Sum": "023be791a65b04d6201f2d60052742683230050b", "SysrootDir": "debian_bullseye_armhf-sysroot", "Tarball": "debian_bullseye_armhf_sysroot.tar.xz", "URL": "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain" }, "bullseye_i386": { "Key": "20230611T210420Z-2", - "Sha1Sum": "cfba9004de1ace04f9604c13c30abad3be90e58f", + "Sha1Sum": "0997cb9c140089cee06252fcb656042526cdac8e", "SysrootDir": "debian_bullseye_i386-sysroot", "Tarball": "debian_bullseye_i386_sysroot.tar.xz", "URL": "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain" }, "bullseye_mips64el": { "Key": "20230611T210420Z-2", - "Sha1Sum": "3ce49d1c6b5fef17ad512f2d663a175829ae0b72", + "Sha1Sum": "868d8bfdbf9bd69ea0013fed4a97fa44fbc98a21", "SysrootDir": "debian_bullseye_mips64el-sysroot", "Tarball": "debian_bullseye_mips64el_sysroot.tar.xz", "URL": "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain" }, "bullseye_mipsel": { "Key": "20230611T210420Z-2", - "Sha1Sum": "1b857baabd7999ff0d6949a8973f896836ac45ac", + "Sha1Sum": "ece6684704ee0c3944f1903c39fa798ee9d7f57e", "SysrootDir": "debian_bullseye_mipsel-sysroot", "Tarball": "debian_bullseye_mipsel_sysroot.tar.xz", "URL": "https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain" diff --git a/build/linux/sysroot_scripts/update-archive-timestamp.sh b/build/linux/sysroot_scripts/update-archive-timestamp.sh index 63b7dab..eee657b 100755 --- a/build/linux/sysroot_scripts/update-archive-timestamp.sh +++ b/build/linux/sysroot_scripts/update-archive-timestamp.sh @@ -3,7 +3,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# This script updates sysroot-creator.sh with the timestamp of the latest +# This script updates sysroot_creator.py with the timestamp of the latest # snapshot from snapshot.debian.org. SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" @@ -15,4 +15,4 @@ TIMESTAMP=$(curl -s "${ARCHIVE_URL}/99990101T000000Z/pool/" | \ sed -n "s|.*${ARCHIVE_URL}/\([[:digit:]TZ]\+\)/pool/.*|\1|p" | head -n 1) sed -i "s/ARCHIVE_TIMESTAMP=.*$/ARCHIVE_TIMESTAMP=${TIMESTAMP}/" \ - "${SCRIPT_DIR}"/sysroot-creator.sh + "${SCRIPT_DIR}"/sysroot_creator.py diff --git a/build/linux/unbundle/brotli.gn b/build/linux/unbundle/brotli.gn index 09f55d1..8e43b4e 100644 --- a/build/linux/unbundle/brotli.gn +++ b/build/linux/unbundle/brotli.gn @@ -15,6 +15,7 @@ shim_headers("brotli_shim") { "brotli/decode.h", "brotli/encode.h", "brotli/port.h", + "brotli/shared_dictionary.h", "brotli/types.h", ] } diff --git a/build/linux/unbundle/flatbuffers.gn b/build/linux/unbundle/flatbuffers.gn new file mode 100644 index 0000000..a7f5b4c --- /dev/null +++ b/build/linux/unbundle/flatbuffers.gn @@ -0,0 +1,34 @@ +import("//build/shim_headers.gni") + + +config("flatbuffers_config") { + include_dirs = [ "src/include" ] + + # Required to prevent static initialization of locale + # in util.cpp + defines = [ "FLATBUFFERS_LOCALE_INDEPENDENT=0" ] +} + +shim_headers("flatbuffers_shim") { + root_path = "src/include" + headers = [ + "flatbuffers/base.h", + "flatbuffers/flatbuffers.h", + "flatbuffers/stl_emulation.h", + "flatbuffers/flexbuffers.h", + "flatbuffers/util.h", + ] +} + +source_set("flatbuffers") { + deps = [ ":flatbuffers_shim" ] + libs = [ "flatbuffers" ] + public_configs = [ ":flatbuffers_config" ] +} + +copy("flatc") { + sources = [ "/usr/bin/flatc" ] + outputs = [ "$root_out_dir/flatc" ] +} + +source_set("flatbuffers_unittests") {} \ No newline at end of file diff --git a/build/linux/unbundle/highway.gn b/build/linux/unbundle/highway.gn new file mode 100644 index 0000000..d997c7c --- /dev/null +++ b/build/linux/unbundle/highway.gn @@ -0,0 +1,9 @@ +import("//build/config/linux/pkg_config.gni") + +pkg_config("libhwy_external_config") { + packages = [ "libhwy" ] +} + +source_set("libhwy") { + public_configs = [ ":libhwy_external_config" ] +} diff --git a/build/linux/unbundle/libsecret.gn b/build/linux/unbundle/libsecret.gn new file mode 100644 index 0000000..4cfd2f0 --- /dev/null +++ b/build/linux/unbundle/libsecret.gn @@ -0,0 +1,9 @@ +import("//build/config/linux/pkg_config.gni") + +pkg_config("libsecret_config") { + packages = [ "libsecret-1" ] +} + +source_set("libsecret") { + public_configs = [ ":libsecret_config" ] +} diff --git a/build/linux/unbundle/libusb.gn b/build/linux/unbundle/libusb.gn new file mode 100644 index 0000000..8503057 --- /dev/null +++ b/build/linux/unbundle/libusb.gn @@ -0,0 +1,20 @@ +import("//build/config/linux/pkg_config.gni") +import("//build/shim_headers.gni") + +pkg_config("system_libusb") { + packages = [ "libusb-1.0" ] +} + +shim_headers("libusb_shim") { + root_path = "src/libusb" + headers = [ + "libusb.h", + ] +} + +source_set("libusb") { + deps = [ + ":libusb_shim", + ] + public_configs = [ ":system_libusb" ] +} diff --git a/build/linux/unbundle/replace_gn_files.py b/build/linux/unbundle/replace_gn_files.py index 0483cd6..a015ea5 100755 --- a/build/linux/unbundle/replace_gn_files.py +++ b/build/linux/unbundle/replace_gn_files.py @@ -43,9 +43,11 @@ 'double-conversion': 'base/third_party/double_conversion/BUILD.gn', 'ffmpeg': 'third_party/ffmpeg/BUILD.gn', 'flac': 'third_party/flac/BUILD.gn', + 'flatbuffers': 'third_party/flatbuffers/BUILD.gn', 'fontconfig': 'third_party/fontconfig/BUILD.gn', 'freetype': 'build/config/freetype/freetype.gni', 'harfbuzz-ng': 'third_party/harfbuzz-ng/harfbuzz.gni', + 'highway' : 'third_party/highway/BUILD.gn', 'icu': 'third_party/icu/BUILD.gn', 'jsoncpp' : 'third_party/jsoncpp/BUILD.gn', 'libaom' : 'third_party/libaom/BUILD.gn', @@ -54,6 +56,8 @@ 'libevent': 'third_party/libevent/BUILD.gn', 'libjpeg': 'third_party/libjpeg.gni', 'libpng': 'third_party/libpng/BUILD.gn', + 'libsecret' : 'third_party/libsecret/BUILD.gn', + 'libusb': 'third_party/libusb/BUILD.gn', 'libvpx': 'third_party/libvpx/BUILD.gn', 'libwebp': 'third_party/libwebp/BUILD.gn', 'libxml': 'third_party/libxml/BUILD.gn', @@ -72,6 +76,7 @@ 'vulkan-SPIRV-Headers' : 'third_party/vulkan-deps/spirv-headers/src/BUILD.gn', 'vulkan-SPIRV-Tools' : 'third_party/vulkan-deps/spirv-tools/src/BUILD.gn', # + 'vulkan_memory_allocator' : 'third_party/vulkan_memory_allocator/BUILD.gn', 'woff2': 'third_party/woff2/BUILD.gn', 'zlib': 'third_party/zlib/BUILD.gn', } diff --git a/build/linux/unbundle/vulkan_memory_allocator.gn b/build/linux/unbundle/vulkan_memory_allocator.gn new file mode 100644 index 0000000..2eec89c --- /dev/null +++ b/build/linux/unbundle/vulkan_memory_allocator.gn @@ -0,0 +1,7 @@ +config("vulkan_memory_allocator_config") { + libs = ["VulkanMemoryAllocator"] +} + +source_set("vulkan_memory_allocator") { + public_configs = [ ":vulkan_memory_allocator_config" ] +} diff --git a/build/mac_toolchain.py b/build/mac_toolchain.py index cd253cd..b206a74 100755 --- a/build/mac_toolchain.py +++ b/build/mac_toolchain.py @@ -20,7 +20,6 @@ import argparse import os -import pkg_resources import platform import plistlib import shutil @@ -34,8 +33,8 @@ def LoadPList(path): return plistlib.load(f) -# This contains binaries from Xcode 14.3 14E222b along with the macOS 13.3 SDK -# (13.3 22E245). To build these packages, see comments in +# This contains binaries from Xcode 15.0 15A240d along with the macOS 14.0 SDK +# (14.0 23A334). To build these packages, see comments in # build/xcode_binaries.yaml # To update the version numbers, open Xcode's "About Xcode" for the first number # and run `xcrun --show-sdk-build-version` for the second. @@ -43,11 +42,11 @@ def LoadPList(path): # xcode_binaries.yaml. MAC_BINARIES_LABEL = 'infra_internal/ios/xcode/xcode_binaries/mac-amd64' -MAC_BINARIES_TAG = 'ajH0-Cuzzqtyj98qUlsgO1-lepRhXoVVNAjVXDIYHxcC' +MAC_BINARIES_TAG = 'dC_BLs9U850OLk8m4V7yxysPhP-ixJ2b5c7hVm8B7tIC' # The toolchain will not be downloaded if the minimum OS version is not met. 19 -# is the major version number for macOS 10.15. Xcode 14.0 14B47b only runs on -# macOS 12.4 and newer, but some bots are still running older OS versions. macOS +# is the major version number for macOS 10.15. Xcode 15.0 only runs on macOS +# 13.5 and newer, but some bots are still running older OS versions. macOS # 10.15.4, the OS minimum through Xcode 12.4, still seems to work. MAC_MINIMUM_OS_VERSION = [19, 4] @@ -156,8 +155,8 @@ def InstallXcodeBinaries(): current_license_plist = LoadPList(current_license_path) xcode_version = current_license_plist.get( 'IDEXcodeVersionForAgreedToGMLicense') - if (xcode_version is not None and pkg_resources.parse_version(xcode_version) - >= pkg_resources.parse_version(cipd_xcode_version)): + if (xcode_version is not None + and xcode_version.split('.') >= cipd_xcode_version.split('.')): should_overwrite_license = False if not should_overwrite_license: diff --git a/build/nocompile.gni b/build/nocompile.gni index dafc9f4..242e910 100644 --- a/build/nocompile.gni +++ b/build/nocompile.gni @@ -6,194 +6,185 @@ # invokes a set of no-compile tests. A no-compile test is a test that asserts # a particular construct will not compile. # -# Also see: -# http://dev.chromium.org/developers/testing/no-compile-tests +# Usage: # -# To use this, create a gyp target with the following form: +# 1. Create a GN target: # -# import("//build/nocompile.gni") -# nocompile_test("my_module_nc_unittests") { -# sources = [ -# 'nc_testset_1.nc', -# 'nc_testset_2.nc', -# ] +# import("//build/nocompile.gni") # -# # optional extra include dirs: -# include_dirs = [ ... ] -# } +# nocompile_source_set("base_nocompile_tests") { +# sources = [ +# "functional/one_not_equal_two_nocompile.nc", +# ] +# deps = [ +# ":base" +# ] +# } # -# The .nc files are C++ files that contain code we wish to assert will not -# compile. Each individual test case in the file should be put in its own -# #ifdef section. The expected output should be appended with a C++-style -# comment that has a python list of regular expressions. This will likely -# be greater than 80-characters. Giving a solid expected output test is -# important so that random compile failures do not cause the test to pass. +# Note that by convention, nocompile tests use the `.nc` extension rather +# than the standard `.cc` extension: this is because the expectation lines +# often exceed 80 characters, which would make clang-format unhappy. # -# Example .nc file: +# 2. Add a dep from a related test binary to the nocompile source set: # -# #if defined(TEST_NEEDS_SEMICOLON) // [r"expected ',' or ';' at end of input"] +# test("base_unittests") { +# ... +# deps += [ ":base_nocompile_tests" ] +# } # -# int a = 1 +# 3. Populate the .nc file with test cases. Expected compile failures should be +# annotated with a comment of the form: # -# #elif defined(TEST_NEEDS_CAST) // [r"invalid conversion from 'void*' to 'char*'"] +# // expected-error {{}} # -# void* a = NULL; -# char* b = a; +# For example: # -# #endif +# void OneDoesNotEqualTwo() { +# static_assert(1 == 2); // expected-error {{static assertion failed due to requirement '1 == 2'}} +# } # -# If we needed disable TEST_NEEDS_SEMICOLON, then change the define to: +# The verification logic is built as part of clang; full documentation is at +# https://clang.llvm.org/doxygen/classclang_1_1VerifyDiagnosticConsumer.html. # -# DISABLE_TEST_NEEDS_SEMICOLON -# TEST_NEEDS_CAST -# -# The lines above are parsed by a regexp so avoid getting creative with the -# formatting or ifdef logic; it will likely just not work. +# Also see: +# http://dev.chromium.org/developers/testing/no-compile-tests # -# Implementation notes: -# The .nc files are actually processed by a python script which executes the -# compiler and generates a .cc file that is empty on success, or will have a -# series of #error lines on failure, and a set of trivially passing gunit -# TEST() functions on success. This allows us to fail at the compile step when -# something goes wrong, and know during the unittest run that the test was at -# least processed when things go right. - import("//build/config/clang/clang.gni") -import("//build/config/python.gni") -import("//build/toolchain/toolchain.gni") -import("//testing/test.gni") - -if (is_mac) { - import("//build/config/mac/mac_sdk.gni") +if (is_win) { + import("//build/toolchain/win/win_toolchain_data.gni") } declare_args() { - # TODO(crbug.com/1442625): Enable for Windows. - enable_nocompile_tests = (is_linux || is_chromeos || is_apple) && is_clang && - host_cpu == target_cpu + enable_nocompile_tests = is_clang && !is_nacl } if (enable_nocompile_tests) { - import("//build/config/c++/c++.gni") - import("//build/config/sysroot.gni") - template("nocompile_test") { - nocompile_target = target_name + "_run_nocompile" - - action_foreach(nocompile_target) { + template("nocompile_source_set") { + action_foreach(target_name) { testonly = true - script = "//tools/nocompile/driver.py" + + script = "//tools/nocompile/wrapper.py" sources = invoker.sources - deps = invoker.deps - if (defined(invoker.public_deps)) { - public_deps = invoker.public_deps + if (defined(invoker.deps)) { + deps = invoker.deps + } + + # An action is not a compiler, so configs is empty until it is explicitly + # set. + configs = default_compiler_configs + if (defined(invoker.configs)) { + configs += invoker.configs } - result_path = "$target_gen_dir/{{source_name_part}}_nc.cc" + # Disable the checks that the Chrome style plugin normally enforces to + # reduce the amount of boilerplate needed in nocompile tests. + configs -= [ "//build/config/clang:find_bad_constructs" ] + + if (is_win) { + result_path = + "$target_out_dir/$target_name/{{source_name_part}}_placeholder.obj" + } else { + result_path = + "$target_out_dir/$target_name/{{source_name_part}}_placeholder.o" + } + rebased_obj_path = rebase_path(result_path, root_build_dir) + + depfile = "${result_path}.d" + rebased_depfile_path = rebase_path(depfile, root_build_dir) outputs = [ result_path ] - rebased_result_path = rebase_path(result_path, root_build_dir) + if (is_win) { if (host_os == "win") { cxx = "clang-cl.exe" - nulldevice = "nul" } else { cxx = "clang-cl" - nulldevice = "/dev/null" } } else { cxx = "clang++" } - args = [ + + args = [] + + if (is_win) { + # ninja normally parses /showIncludes output, but the depsformat + # variable can only be set in compiler tools, not for custom actions. + # Unfortunately, this means the clang wrapper needs to generate the + # depfile itself. + args += [ "--generate-depfile" ] + } + + args += [ rebase_path("$clang_base_path/bin/$cxx", root_build_dir), - "4", # number of compilers to invoke in parallel. "{{source}}", - rebased_result_path, + rebased_obj_path, + rebased_depfile_path, "--", + "{{cflags}}", + "{{cflags_cc}}", + "{{defines}}", + "{{include_dirs}}", + + # No need to generate an object file for nocompile tests. + "-Xclang", + "-fsyntax-only", + + # Enable clang's VerifyDiagnosticConsumer: + # https://clang.llvm.org/doxygen/classclang_1_1VerifyDiagnosticConsumer.html + "-Xclang", + "-verify", + + # But don't require expected-note comments since that is not the + # primary point of the nocompile tests. + "-Xclang", + "-verify-ignore-unexpected=note", + + # Disable the error limit so that nocompile tests do not need to be + # arbitrarily split up when they hit the default error limit. + "-ferror-limit=0", + + # So funny characters don't show up in error messages. + "-fno-color-diagnostics", + + # Always treat warnings as errors. "-Werror", - "-Wfatal-errors", - "-Wthread-safety", - "-I" + rebase_path("//", root_build_dir), - "-I" + rebase_path("//third_party/abseil-cpp/", root_build_dir), - "-I" + rebase_path("//buildtools/third_party/libc++/", root_build_dir), - "-I" + rebase_path(root_gen_dir, root_build_dir), - - # TODO(https://crbug.com/989932): Track build/config/compiler/BUILD.gn - "-Wno-implicit-int-float-conversion", ] - if (is_win) { - args += [ - "/W4", - "-Wno-unused-parameter", - "-I" + rebase_path("$libcxx_prefix/include", root_build_dir), - "/std:c++20", - - # TODO(crbug.com/1442625): Uncomment this, then filter and process the - # output appropriately to track dependencies. - # "/showIncludes:user" - - "/Fo" + nulldevice, - "/c", - "/Tp", - ] - } else { - depfile = "${result_path}.d" + + if (!is_win) { args += [ - "-Wall", - "-nostdinc++", - "-isystem" + rebase_path("$libcxx_prefix/include", root_build_dir), - "-isystem" + rebase_path("$libcxxabi_prefix/include", root_build_dir), - "-std=c++20", + # On non-Windows platforms, clang can generate the depfile. "-MMD", "-MF", - rebased_result_path + ".d", + rebased_depfile_path, "-MT", - rebased_result_path, - "-o", - "/dev/null", - "-c", + rebased_obj_path, + + # Non-Windows clang uses file extensions to determine how to treat + # various inputs, so explicitly tell it to treat all inputs (even + # those with weird extensions like .nc) as C++ source files. "-x", "c++", ] - } - args += [ "{{source}}" ] - - if (is_mac && host_os != "mac") { - args += [ - "--target=x86_64-apple-macos", - "-mmacos-version-min=$mac_deployment_target", - ] - } - - # Iterate over any extra include dirs and append them to the command line. - if (defined(invoker.include_dirs)) { - foreach(include_dir, invoker.include_dirs) { - args += [ "-I" + rebase_path(include_dir, root_build_dir) ] - } - } - - if (sysroot != "") { - sysroot_path = rebase_path(sysroot, root_build_dir) - if (is_win) { - args += [ "/winsysroot" + sysroot_path ] + } else { + # For some reason, the Windows includes are not part of the default + # compiler configs. Set it explicitly here, since things like libc++ + # depend on the VC runtime. + if (target_cpu == "x86") { + win_toolchain_data = win_toolchain_data_x86 + } else if (target_cpu == "x64") { + win_toolchain_data = win_toolchain_data_x64 + } else if (target_cpu == "arm64") { + win_toolchain_data = win_toolchain_data_arm64 } else { - args += [ - "--sysroot", - sysroot_path, - ] + error("Unsupported target_cpu, add it to win_toolchain_data.gni") } + args += win_toolchain_data.include_flags_imsvc_list + args += [ "/showIncludes:user" ] } - if (!is_nacl) { - args += [ - # TODO(crbug.com/1343975) Evaluate and possibly enable. - "-Wno-deprecated-builtins", - ] - } - } - - test(target_name) { - deps = invoker.deps + [ ":$nocompile_target" ] - sources = get_target_outputs(":$nocompile_target") - forward_variables_from(invoker, [ "bundle_deps" ]) + # Note: for all platforms, the depfile only lists user includes, and not + # system includes. If system includes change, the compiler flags are + # expected to artificially change in some way to invalidate and force the + # nocompile tests to run again. } } } diff --git a/build/partitioned_shared_library.gni b/build/partitioned_shared_library.gni index 2af4f9e..18b5917 100644 --- a/build/partitioned_shared_library.gni +++ b/build/partitioned_shared_library.gni @@ -6,6 +6,9 @@ import("//build/config/android/config.gni") import("//build/config/clang/clang.gni") import("//build/config/compiler/compiler.gni") +if (build_with_chromium) { + import("//third_party/jni_zero/jni_zero.gni") +} # This template creates a set of shared libraries, by linking a single # "partitioned" shared library, then splitting it into multiple pieces. @@ -140,3 +143,17 @@ template("partitioned_shared_library") { set_defaults("partitioned_shared_library") { configs = default_shared_library_configs } + +# native_with_jni for partitioned shared libraries - see native_with_jni for +# details. +template("partitioned_shared_library_with_jni") { + native_with_jni(target_name) { + forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) + forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) + target_type = "partitioned_shared_library" + target_type_import = "//build/partitioned_shared_library.gni" + } +} +set_defaults("partitioned_shared_library_with_jni") { + configs = default_shared_library_configs +} diff --git a/build/private_code_test/BUILD.gn b/build/private_code_test/BUILD.gn index 8fcdd54..d7a1efa 100644 --- a/build/private_code_test/BUILD.gn +++ b/build/private_code_test/BUILD.gn @@ -1,4 +1,4 @@ -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. diff --git a/build/private_code_test/private_code_test.gni b/build/private_code_test/private_code_test.gni index 6ce82f0..23c7471 100644 --- a/build/private_code_test/private_code_test.gni +++ b/build/private_code_test/private_code_test.gni @@ -1,4 +1,4 @@ -# Copyright 2023 The Chromium Authors. All rights reserved. +# Copyright 2023 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. diff --git a/build/rust/BUILD.gn b/build/rust/BUILD.gn index 609dab8..26830ee 100644 --- a/build/rust/BUILD.gn +++ b/build/rust/BUILD.gn @@ -18,37 +18,44 @@ if (toolchain_has_rust) { rustflags = [ "--edition=2015" ] } - # The required dependencies for cxx-generated bindings, that must be included - # on the C++ side. - static_library("cxx_cppdeps") { - sources = [ - "//third_party/rust/cxx/v1/crate/include/cxx.h", - "//third_party/rust/cxx/v1/crate/src/cxx.cc", - ] + if (enable_cxx) { + # The required dependencies for cxx-generated bindings, that must be included + # on the C++ side. + static_library("cxx_cppdeps") { + sources = [ + "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.116/include/cxx.h", + "//third_party/rust/chromium_crates_io/vendor/cxx-1.0.116/src/cxx.cc", + + # Our version-independent forwarding header, which we patch cxx.cc to + # use since we want it to use an absolute path for its include. + "//third_party/rust/cxx/v1/cxx.h", + ] - defines = [ "RUST_CXX_NO_EXCEPTIONS" ] + defines = [ "RUST_CXX_NO_EXCEPTIONS" ] - # We cannot depend on base/base_export.h because base depends on us. - if (is_component_build) { - if (is_win) { - defines += [ "CXX_RS_EXPORT=__declspec(dllexport)" ] + # We cannot depend on base/base_export.h because base depends on us. + if (is_component_build) { + if (is_win) { + defines += [ "CXX_RS_EXPORT=__declspec(dllexport)" ] + } else { + defines += + [ "CXX_RS_EXPORT=__attribute__((visibility(\"default\")))" ] + } } else { - defines += [ "CXX_RS_EXPORT=__attribute__((visibility(\"default\")))" ] + defines += [ "CXX_RS_EXPORT=" ] } - } else { - defines += [ "CXX_RS_EXPORT=" ] - } - # Depending on the C++ bindings side of cxx then requires also depending - # on the Rust bindings, since one calls the other. And the Rust bindings - # require the Rust standard library. - deps = [ ":cxx_rustdeps" ] - } + # Depending on the C++ bindings side of cxx then requires also depending + # on the Rust bindings, since one calls the other. And the Rust bindings + # require the Rust standard library. + deps = [ ":cxx_rustdeps" ] + } - # The required dependencies for cxx-generated bindings, that must be included - # on the Rust side. - group("cxx_rustdeps") { - public_deps = [ "//third_party/rust/cxx/v1:lib" ] + # The required dependencies for cxx-generated bindings, that must be included + # on the Rust side. + group("cxx_rustdeps") { + public_deps = [ "//third_party/rust/cxx/v1:lib" ] + } } } @@ -85,3 +92,10 @@ config("panic_immediate_abort") { ] } } + +config("is_gtest_unittests") { + rustflags = [ + "--cfg", + "is_gtest_unittests", + ] +} diff --git a/build/rust/OWNERS b/build/rust/OWNERS index 0e7aca6..bb0de47 100644 --- a/build/rust/OWNERS +++ b/build/rust/OWNERS @@ -3,5 +3,4 @@ ajgo@chromium.org collinbaker@chromium.org danakj@chromium.org lukasza@chromium.org -rsesek@chromium.org thakis@chromium.org diff --git a/build/rust/cargo_crate.gni b/build/rust/cargo_crate.gni index 427fcf6..1c86569 100644 --- a/build/rust/cargo_crate.gni +++ b/build/rust/cargo_crate.gni @@ -147,10 +147,10 @@ template("cargo_crate") { # with build.rs and otherwise assuming that the target contains a # `crate/` subdirectory. if (defined(invoker.build_root)) { - manifest_dir = rebase_path(get_path_info(invoker.build_root, "dir"), "") + manifest_dir = "." } else { build_gn_dir = get_label_info(target_name, "dir") - manifest_dir = rebase_path(build_gn_dir + "/crate", "") + manifest_dir = rebase_path(build_gn_dir + "/crate", root_build_dir) } _rustenv += [ "CARGO_MANIFEST_DIR=${manifest_dir}" ] @@ -195,6 +195,24 @@ template("cargo_crate") { } } + if (defined(invoker.output_name)) { + _output_name = invoker.output_name + } else if (_crate_type != "bin") { + # Note that file names of libraries must start with the crate name in + # order for the compiler to find transitive dependencies in the + # directory search paths (since they are not all explicitly specified). + # + # For bin targets, we expect the target name to be unique, and the name + # of the exe should not add magic stuff to it. And bin crates can not be + # transitive dependencies. + _output_name = "${_crate_name}_${_orig_target_name}" + } + + _testonly = false + if (defined(invoker.testonly)) { + _testonly = invoker.testonly + } + # The main target, either a Rust source set or an executable. target(_target_type, target_name) { forward_variables_from(invoker, @@ -214,11 +232,23 @@ template("cargo_crate") { "rustenv", "dev_deps", ]) - forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) + + testonly = _testonly + if (defined(invoker.visibility)) { + visibility = invoker.visibility + } if (defined(crate_type) && crate_type == "cdylib") { # See comments above about cdylib. crate_type = "rlib" } + crate_name = _crate_name + + if (defined(_output_name)) { + output_name = _output_name + } + + # Don't import the `chromium` crate into third-party code. + no_chromium_prelude = true rustc_metadata = _rustc_metadata @@ -290,6 +320,9 @@ template("cargo_crate") { if (!defined(sources)) { sources = [] } + if (!defined(inputs)) { + inputs = [] + } # This... is a bit weird. We generate a file called cargo_flags.rs which # does not actually contain Rust code, but instead some flags to add @@ -309,7 +342,6 @@ template("cargo_crate") { filter_include(invoker.build_script_outputs, [ "*.rs" ])) { sources += [ "$_build_script_env_out_dir/$extra_source" ] } - inputs = [] foreach(extra_source, filter_exclude(invoker.build_script_outputs, [ "*.rs" ])) { inputs += [ "$_build_script_env_out_dir/$extra_source" ] @@ -325,6 +357,10 @@ template("cargo_crate") { script = rebase_path("//build/rust/run_build_script.py") build_script_target = ":${_build_script_name}($rust_macro_toolchain)" deps = [ build_script_target ] + testonly = _testonly + if (defined(invoker.visibility)) { + visibility = invoker.visibility + } # The build script may be built with a different toolchain when # cross-compiling (the host toolchain) so we must find the path relative @@ -387,11 +423,22 @@ template("cargo_crate") { # the rust_macro_toolchain for it to unblock building them while the # Chromium stdlib is still being compiled. rust_executable(_build_script_name) { + crate_name = _build_script_name sources = invoker.build_sources crate_root = invoker.build_root + testonly = _testonly + if (defined(invoker.visibility)) { + visibility = invoker.visibility + } if (defined(invoker.build_deps)) { deps = invoker.build_deps } + if (defined(invoker.build_script_inputs)) { + inputs = invoker.build_script_inputs + } + + # Don't import the `chromium` crate into third-party code. + no_chromium_prelude = true # The ${_build_script_name}_output target looks for the exe in this # location. Due to how the Windows component build works, this has to diff --git a/build/rust/chromium_prelude/BUILD.gn b/build/rust/chromium_prelude/BUILD.gn new file mode 100644 index 0000000..28e9a0a --- /dev/null +++ b/build/rust/chromium_prelude/BUILD.gn @@ -0,0 +1,50 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/rust/rust_executable.gni") +import("//build/rust/rust_macro.gni") +import("//build/rust/rust_static_library.gni") + +if (enable_chromium_prelude) { + rust_static_library("chromium_prelude") { + crate_name = "chromium" + crate_root = "chromium_prelude.rs" + sources = [ "chromium_prelude.rs" ] + deps = [ ":import_attribute" ] + + # Don't depend on ourselves. + no_chromium_prelude = true + } + + rust_macro("import_attribute") { + crate_name = "import_attribute" + crate_root = "import_attribute.rs" + sources = [ "import_attribute.rs" ] + deps = [ + "//third_party/rust/proc_macro2/v1:lib", + "//third_party/rust/quote/v1:lib", + "//third_party/rust/syn/v2:lib", + ] + visibility = [ ":*" ] + + # Don't depend on ourselves. + no_chromium_prelude = true + } + + rust_static_library("import_test_lib") { + testonly = true + crate_root = "import_test_lib.rs" + sources = [ "import_test_lib.rs" ] + } + + rust_executable("import_test") { + testonly = true + crate_root = "import_test.rs" + sources = [ "import_test.rs" ] + deps = [ + ":chromium_prelude", + ":import_test_lib", + ] + } +} diff --git a/build/rust/chromium_prelude/chromium_prelude.rs b/build/rust/chromium_prelude/chromium_prelude.rs new file mode 100644 index 0000000..94aeea5 --- /dev/null +++ b/build/rust/chromium_prelude/chromium_prelude.rs @@ -0,0 +1,95 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// The `chromium::import!{}` macro for importing crates from GN paths. +/// +/// This macro is used to access first-party crates in the Chromium project +/// (or other projects using Chromium's //build system) through the GN path +/// to the crate. All GN paths must be absolute paths. +/// +/// Third-party crates are accessed as usual by their name, which is available +/// whenever the Rust target depends on the third-party crate. The `import!` +/// macro does nothing, and will cause a compilation error if an attempt is +/// made to import a third-party crate with it. +/// +/// # Motivation +/// +/// Since first-party crates do not all have globally unique GN names, using +/// their GN target name as their crate name leads to ambiguity when multiple +/// crates with the same name are dependencies of the same crate. As such, we +/// produce mangled crate names that are unique, and depend on their full GN +/// path, but these names are not easy to spell. +/// +/// # Usage +/// +/// The `chromium` crate is automatically present in all first-party Rust +/// targets, which makes the `chromium::import!{}` macro available. The macro +/// should be given a list of GN paths (directory and target name) as quoted +/// strings to be imported into the current module, delineated with semicolons. +/// +/// When no target name is specified (e.g. `:name`) at the end of the GN path, +/// the target will be the same as the last directory name. This is the same +/// behaviour as within the GN `deps` list. +/// +/// The imported crates can be renamed by using the `as` keyword and reexported +/// using the `pub` keyword. These function in the same way as they do when +/// naming or reexporting with `use`, but the `import!` macro replaces the `use` +/// keyword for these purposes with first-party crates. +/// +/// # Examples +/// +/// ## Basic usage +/// Basic usage, importing a few targets. The name given to the imported crates +/// is their GN target name by default. In this example, there would be two +/// crates available in the Rust module below: `example` which is the +/// `example` GN target in `rust/example/BUILD.gn` and `other` which is the +/// `other` GN target in `rust/example/BUILD.gn`. +/// ``` +/// chromium::import! { +/// "//rust/example"; +/// "//rust/example:other"; +/// } +/// +/// use example::Goat; +/// +/// example::foo(Goat::new()); +/// other::foo(Goat::with_age(3)); +/// ``` +/// +/// ## Renaming an import +/// Since multiple GN targets may have the same local name, they can be given +/// a different name when imported by using `as`: +/// ``` +/// chromium::import! { +/// "//rust/example" as renamed; +/// "//rust/example:other" as very_renamed; +/// } +/// +/// use renamed::Goat; +/// +/// renamed::foo(Goat::new()); +/// very_renamed::foo(Goat::with_age(3)); +/// ``` +/// +/// ## Re-exporting +/// When importing and re-exporting a dependency, the usual syntax would be +/// `pub use my_dependency;`. For first-party crates, this must be done through +/// the `import!` macro by prepending the `pub` keyword where the crate is +/// imported. The exported name can be specified with `as`: +/// ``` +/// mod module { +/// +/// chromium::import! { +/// pub "//rust/example"; +/// pub "//rust/example:other" as exported_other; +/// } +/// +/// } +/// +/// use module::example::Goat; +/// +/// module::example::foo(Goat::new()) +/// module::exported_other::foo(Goat::with_age(3)); +/// ``` +pub use import_attribute::import; diff --git a/build/rust/chromium_prelude/import_attribute.rs b/build/rust/chromium_prelude/import_attribute.rs new file mode 100644 index 0000000..896510c --- /dev/null +++ b/build/rust/chromium_prelude/import_attribute.rs @@ -0,0 +1,172 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +use proc_macro2::Span; +use quote::quote; +use syn::parse::{Parse, ParseStream}; +use syn::{parse_macro_input, Error, Ident, Lit, Token}; + +#[proc_macro] +pub fn import(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let imports = parse_macro_input!(input as ImportList).imports; + + let mut stream = proc_macro2::TokenStream::new(); + for i in imports { + let public = &i.reexport; + let mangled_crate_name = &i.target.mangled_crate_name; + let name = i.alias.as_ref().unwrap_or(&i.target.gn_name); + stream.extend(quote! { + #public extern crate #mangled_crate_name as #name; + }); + } + stream.into() +} + +struct ImportList { + imports: Vec, +} + +struct Import { + target: GnTarget, + alias: Option, + reexport: Option, +} + +struct GnTarget { + mangled_crate_name: Ident, + gn_name: Ident, +} + +impl GnTarget { + fn parse(s: &str, span: Span) -> Result { + if !s.starts_with("//") { + return Err(String::from("expected absolute GN path (should start with //)")); + } + + let mut path: Vec<&str> = s[2..].split('/').collect(); + + let gn_name = { + if path[0..2] == ["third_party", "rust"] { + return Err(String::from( + "import! macro should not be used for third_party crates", + )); + } + + let last = path.pop().unwrap(); + let (split_last, gn_name) = match last.split_once(':') { + Some((last, name)) => (last, name), + None => (last, last), + }; + path.push(split_last); + + gn_name + }; + + for p in &path { + if p.contains(':') { + return Err(String::from("unexpected ':' in GN path component")); + } + if p.is_empty() { + return Err(String::from("unexpected empty GN path component")); + } + } + + let mangled_crate_name = + escape_non_identifier_chars(&format!("{}:{gn_name}", path.join("/")))?; + + Ok(GnTarget { + mangled_crate_name: Ident::new(&mangled_crate_name, span), + gn_name: syn::parse_str::(gn_name).map_err(|e| format!("{e}"))?, + }) + } +} + +impl Parse for ImportList { + fn parse(input: ParseStream) -> syn::Result { + let mut imports: Vec = Vec::new(); + + while !input.is_empty() { + let reexport = ::parse(input).ok(); + + let str_span = input.span(); + + let target = match Lit::parse(input) { + Err(_) => { + return Err(Error::new(str_span, "expected a GN path as a string literal")); + } + Ok(Lit::Str(label)) => match GnTarget::parse(&label.value(), str_span) { + Ok(target) => target, + Err(e) => { + return Err(Error::new( + str_span, + format!("invalid GN path {}: {}", quote::quote! {#label}, e), + )); + } + }, + Ok(lit) => { + return Err(Error::new( + str_span, + format!( + "expected a GN path as string literal, found '{}' literal", + quote::quote! {#lit} + ), + )); + } + }; + let alias = match ::parse(input) { + Ok(_) => Some(Ident::parse(input)?), + Err(_) => None, + }; + ::parse(input)?; + + imports.push(Import { target, alias, reexport }); + } + + Ok(Self { imports }) + } +} + +/// Escapes non-identifier characters in `symbol`. +/// +/// Importantly, this is +/// [an injective function](https://en.wikipedia.org/wiki/Injective_function) +/// which means that different inputs are never mapped to the same output. +/// +/// This is based on a similar function in +/// https://github.com/google/crubit/blob/22ab04aef9f7cc56d8600c310c7fe20999ffc41b/common/code_gen_utils.rs#L59-L71 +/// The main differences are: +/// +/// * Only a limited set of special characters is supported, because this makes +/// it easier to replicate the escaping algorithm in `.gni` files, using just +/// `string_replace` calls. +/// * No dependency on `unicode_ident` crate means that instead of +/// `is_xid_continue` a more restricted call to `char::is_ascii_alphanumeric` +/// is used. +/// * No support for escaping leading digits. +/// * The escapes are slightly different (e.g. `/` frequently appears in GN +/// paths and therefore here we map it to a nice `_s` rather than to `_x002f`) +fn escape_non_identifier_chars(symbol: &str) -> Result { + assert!(!symbol.is_empty()); // Caller is expected to verify. + if symbol.chars().next().unwrap().is_ascii_digit() { + return Err("Leading digits are not supported".to_string()); + } + + // Escaping every character can at most double the size of the string. + let mut result = String::with_capacity(symbol.len() * 2); + for c in symbol.chars() { + // NOTE: TargetName=>CrateName mangling algorithm should be updated + // simultaneously in 3 places: here, //build/rust/rust_target.gni, + // //build/rust/rust_static_library.gni. + match c { + '_' => result.push_str("_u"), + '/' => result.push_str("_s"), + ':' => result.push_str("_c"), + '-' => result.push_str("_d"), + c if c.is_ascii_alphanumeric() => result.push(c), + _ => return Err(format!("Unsupported character in GN path component: `{c}`")), + } + } + + Ok(result) +} diff --git a/build/rust/chromium_prelude/import_test.rs b/build/rust/chromium_prelude/import_test.rs new file mode 100644 index 0000000..a8ddcf4 --- /dev/null +++ b/build/rust/chromium_prelude/import_test.rs @@ -0,0 +1,35 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +mod test_direct { + chromium::import! { + "//build/rust/chromium_prelude:import_test_lib"; + } + + pub fn import_test() { + import_test_lib::import_test_lib(); + } +} + +mod test_as { + chromium::import! { + "//build/rust/chromium_prelude:import_test_lib" as library; + } + + pub fn import_test() { + library::import_test_lib(); + } +} + +mod test_pub { + chromium::import! { + pub "//build/rust/chromium_prelude:import_test_lib" as library; + } +} + +fn main() { + test_direct::import_test(); + test_as::import_test(); + test_pub::library::import_test_lib(); +} diff --git a/build/rust/chromium_prelude/import_test_lib.rs b/build/rust/chromium_prelude/import_test_lib.rs new file mode 100644 index 0000000..e202a6a --- /dev/null +++ b/build/rust/chromium_prelude/import_test_lib.rs @@ -0,0 +1,5 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +pub fn import_test_lib() {} diff --git a/build/rust/run_bindgen.py b/build/rust/run_bindgen.py index c9d192f..341e256 100755 --- a/build/rust/run_bindgen.py +++ b/build/rust/run_bindgen.py @@ -5,6 +5,7 @@ # found in the LICENSE file. import argparse +import contextlib import os import subprocess import sys @@ -18,18 +19,6 @@ from filter_clang_args import filter_clang_args -def atomic_copy(in_path, out_path): - with open(in_path, 'rb') as input: - with action_helpers.atomic_output(out_path) as output: - content = input.read() - output.write(content) - - -def copy_to_prefixed_filename(path, filename, prefix): - atomic_copy(os.path.join(path, filename), - os.path.join(path, prefix + "_" + filename)) - - def main(): parser = argparse.ArgumentParser("run_bindgen.py") parser.add_argument("--exe", help="Path to bindgen", required=True), @@ -39,6 +28,9 @@ def main(): parser.add_argument("--depfile", help="depfile to output with header dependencies") parser.add_argument("--output", help="output .rs bindings", required=True) + parser.add_argument( + "--wrap-static-fns", + help="output source file for `static` and `static inline` functions") parser.add_argument("--ld-library-path", help="LD_LIBRARY_PATH (or DYLD_LIBRARY_PATH on Mac) to " "set") @@ -56,47 +48,56 @@ def main(): nargs="*") args = parser.parse_args() - # Args passed to the actual bindgen cli - genargs = [] - genargs.append('--no-layout-tests') - if args.bindgen_flags is not None: - for flag in args.bindgen_flags: - genargs.append("--" + flag) + with contextlib.ExitStack() as stack: + # Args passed to the actual bindgen cli + genargs = [] + genargs.append('--no-layout-tests') + if args.bindgen_flags is not None: + for flag in args.bindgen_flags: + genargs.append("--" + flag) - # TODO(danakj): We need to point bindgen to - # //third_party/rust-toolchain/bin/rustfmt. - genargs.append('--no-rustfmt-bindings') - genargs += ['--rust-target', 'nightly'] + # TODO(danakj): We need to point bindgen to + # //third_party/rust-toolchain/bin/rustfmt. + genargs.append('--no-rustfmt-bindings') + genargs += ['--rust-target', 'nightly'] - if args.depfile: - genargs.append('--depfile') - genargs.append(args.depfile) - genargs.append('--output') - genargs.append(args.output) - genargs.append(args.header) - genargs.append('--') - genargs.extend(filter_clang_args(args.clangargs)) - env = os.environ - if args.ld_library_path: - if sys.platform == 'darwin': - env["DYLD_LIBRARY_PATH"] = args.ld_library_path - else: - env["LD_LIBRARY_PATH"] = args.ld_library_path - if args.libclang_path: - env["LIBCLANG_PATH"] = args.libclang_path - returncode = subprocess.run([args.exe, *genargs], env=env).returncode - if returncode != 0: - # Make sure we don't emit anything if bindgen failed. - try: - os.remove(args.output) - except FileNotFoundError: - pass + if args.depfile: + depfile = stack.enter_context(action_helpers.atomic_output(args.depfile)) + genargs.append('--depfile') + genargs.append(depfile.name) + # Ideally we would use action_helpers.atomic_output for the output file, but + # this would put the wrong name in the depfile. + genargs.append('--output') + genargs.append(args.output) + if args.wrap_static_fns: + wrap_static_fns = stack.enter_context( + action_helpers.atomic_output(args.wrap_static_fns)) + genargs.append('--experimental') + genargs.append('--wrap-static-fns') + genargs.append('--wrap-static-fns-path') + genargs.append(wrap_static_fns.name) + genargs.append(args.header) + genargs.append('--') + genargs.extend(filter_clang_args(args.clangargs)) + env = os.environ + if args.ld_library_path: + if sys.platform == 'darwin': + env["DYLD_LIBRARY_PATH"] = args.ld_library_path + else: + env["LD_LIBRARY_PATH"] = args.ld_library_path + if args.libclang_path: + env["LIBCLANG_PATH"] = args.libclang_path try: - os.remove(args.depfile) - except FileNotFoundError: - pass - return returncode + subprocess.check_call([args.exe, *genargs], env=env) + except: + # Make sure we don't emit anything if bindgen failed. The other files use + # action_helpers for this. + try: + os.remove(args.output) + except FileNotFoundError: + pass + raise if __name__ == '__main__': - sys.exit(main()) + main() diff --git a/build/rust/run_build_script.py b/build/rust/run_build_script.py index fe8eb10..b0a0ae3 100755 --- a/build/rust/run_build_script.py +++ b/build/rust/run_build_script.py @@ -124,6 +124,12 @@ def main(): else: print(f'Invalid TARGET {env["TARGET"]}') sys.exit(1) + # See https://crbug.com/325543500 for background. + # Cargo sets CARGO_CFG_TARGET_OS to "android" even when targeting *-androideabi. + if env["CARGO_CFG_TARGET_OS"].startswith("android"): + env["CARGO_CFG_TARGET_OS"] = "android" + elif env["CARGO_CFG_TARGET_OS"] == "darwin": + env["CARGO_CFG_TARGET_OS"] = "macos" if args.features: for f in args.features: feature_name = f.upper().replace("-", "_") diff --git a/build/rust/rust_bindgen.gni b/build/rust/rust_bindgen.gni index e57bf48..6caa58c 100644 --- a/build/rust/rust_bindgen.gni +++ b/build/rust/rust_bindgen.gni @@ -27,8 +27,9 @@ if (host_os == "win") { # Template to build Rust/C bindings with bindgen. # -# This template expands to a static_library containing the Rust side of the -# bindings. Simply treat it as a public dependency. +# This template expands to an action that generates the Rust side of the +# bindings. Add it as a dependency and then incorporate +# `get_target_outputs(target_name)[0]` into your Rust crate. # # Parameters: # @@ -44,14 +45,24 @@ if (host_os == "win") { # any configs here as if this were a C target. # # bindgen_flags: (optional) -# the additional bindgen flags which are passed to the executable +# The additional bindgen flags which are passed to the executable +# +# wrap_static_fns: (optional) +# If set to true, enables binding `static` and `static inline` functions in +# the header. Setting this causes the template to emit a source_set target +# named "${target_name}_static_fns", which must be incorporated into the +# build. Additionally, `get_target_outputs` will return both the Rust file and +# a generated C file, but callers can rely on the Rust file being first. # # Rust targets depending on the output must include! the generated file. # template("rust_bindgen") { assert(defined(invoker.header), "Must specify the C header file to make bindings for.") - action(target_name) { + wrap_static_fns = defined(invoker.wrap_static_fns) && invoker.wrap_static_fns + + bindgen_target_name = target_name + action(bindgen_target_name) { # bindgen relies on knowing the {{defines}} and {{include_dirs}} required # to build the C++ headers which it's parsing. These are passed to the # script's args and are populated using deps and configs. @@ -92,6 +103,15 @@ template("rust_bindgen") { rebase_path(_libclang_path, root_build_dir), ] + if (wrap_static_fns) { + out_gen_c = "$output_dir/${target_name}.c" + outputs += [ out_gen_c ] + args += [ + "--wrap-static-fns", + rebase_path(out_gen_c, root_build_dir), + ] + } + if (is_linux) { # Linux clang, and clang libs, use a shared libstdc++, which we must # point to. @@ -146,7 +166,7 @@ template("rust_bindgen") { } else { error("Unsupported host_cpu, add it to win_toolchain_data.gni") } - args += [ "${win_toolchain_data.include_flags_imsvc}" ] + args += win_toolchain_data.include_flags_imsvc_list } # Passes C comments through as rustdoc attributes. @@ -193,4 +213,22 @@ template("rust_bindgen") { args += [ "-fno-sanitize-ignorelist" ] } } + + if (wrap_static_fns) { + source_set("${target_name}_static_fns") { + forward_variables_from(invoker, + TESTONLY_AND_VISIBILITY + [ + "deps", + "configs", + ]) + bindgen_output = get_target_outputs(":${bindgen_target_name}") + + sources = filter_include(bindgen_output, [ "*.c" ]) + deps += [ ":${bindgen_target_name}" ] + + # bindgen generates a C file whose include is relative to the directory it + # runs from. + include_dirs = [ root_build_dir ] + } + } } diff --git a/build/rust/rust_executable.gni b/build/rust/rust_executable.gni index 478f529..a1f38fd 100644 --- a/build/rust/rust_executable.gni +++ b/build/rust/rust_executable.gni @@ -60,6 +60,14 @@ template("rust_executable") { executable_configs = invoker.configs target_type = "executable" assert(!defined(cxx_bindings)) + + # Executable targets should be unique names as they all get placed in the + # root output dir. We want their exe file name to be the same as the GN + # target, not a mangled name including the full GN path, and the exe file + # name comes from the crate name. + if (!defined(invoker.crate_name)) { + crate_name = target_name + } } } diff --git a/build/rust/rust_static_library.gni b/build/rust/rust_static_library.gni index 03d3366..f60ea6a 100644 --- a/build/rust/rust_static_library.gni +++ b/build/rust/rust_static_library.gni @@ -110,10 +110,13 @@ import("//build/rust/rust_target.gni") # This will automatically add appropriate dependencies: there's no # need to depend on the cxx crate or any generated bindings. # -# visibility (optional) -# rustflags (optional) +# data, testonly, visibility (optional) +# Same meaning as in other GN targets. +# # crate_name (optional) -# Per the usual gn meaning for Rust targets. +# Discouraged - first-party code should prefer to use the auto-generated, +# target-based crate name which is guaranteed to be globally unique (and +# still ergonomic to import and use via the `chromium::import!` macro). # # inputs (optional) # Additional input files needed for compilation (such as `include!`ed files) @@ -145,12 +148,76 @@ import("//build/rust/rust_target.gni") template("rust_static_library") { _target_name = target_name + _configs = [] + _all_dependent_configs = [] + + if (defined(invoker.configs)) { + _configs += invoker.configs + } + + # TODO(dcheng): Is there any value in allowing rust_shared_library() to also + # set `is_gtest_unittest` to true? + if (defined(invoker.is_gtest_unittests) && invoker.is_gtest_unittests) { + _output_dir = rebase_path(target_out_dir, root_build_dir) + + config("${_target_name}_alwayslink") { + # Targets using the #[gtest(...)] proc macro register their tests with + # static initializers. A rust library target generates a .rlib, which is + # a regular static library with extra metadata. However, if nothing + # outside the .rlib references functions in the .rlib—as is often the + # case with a target containing only tests—the linker will not pull in + # the .rlib into the final test binary at all, so the tests won't run. + # + # C++ works around this by using source sets and directly pass the .o + # files to the linker, but Rust does not have a parallel to this. Instead, + # force the linker to always include the whole archive. + + # NOTE: TargetName=>CrateName mangling algorithm should be updated + # simultaneously in 3 places: here, //build/rust/rust_target.gni, + # //build/rust/chromium_prelude/import_attribute.rs + if (defined(invoker.crate_name)) { + _crate_name = invoker.crate_name + } else { + # Not using `get_label_info(..., "label_no_toolchain")` to consistently + # use `//foo/bar:baz` instead of the alternative shorter `//foo/bar` form. + _dir = get_label_info(":${_target_name}", "dir") + _dir = string_replace(_dir, "//", "") + _crate_name = "${_dir}:${_target_name}" + + # The `string_replace` calls below replicate the escaping algorithm + # from the `escape_non_identifier_chars` function in + # //build/rust/chromium_prelude/import_attribute.rs. Note that the + # ordering of `match` branches within the Rust function doesn't matter, + # but the ordering of `string_replace` calls *does* matter - the escape + # character `_` needs to be handled first to meet the injectivity + # requirement (otherwise we would get `/` => `_s` => `_us` and the same + # result for `_s` => `_us`). + _crate_name = string_replace(_crate_name, "_", "_u") + _crate_name = string_replace(_crate_name, "/", "_s") + _crate_name = string_replace(_crate_name, ":", "_c") + _crate_name = string_replace(_crate_name, "-", "_d") + } + + _rlib_path = "${_output_dir}/lib${_crate_name}.rlib" + if (current_os == "aix") { + # The AIX linker does not implement an option for this. + } else if (is_win) { + ldflags = [ "/WHOLEARCHIVE:${_rlib_path}" ] + } else { + ldflags = [ "-LinkWrapper,add-whole-archive=${_rlib_path}" ] + } + } + _all_dependent_configs += [ ":${target_name}_alwayslink" ] + _configs += [ "//build/rust:is_gtest_unittests" ] + } + rust_target(_target_name) { forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY + [ "configs" ]) forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) - library_configs = invoker.configs + library_configs = _configs + all_dependent_configs = _all_dependent_configs target_type = "rust_library" } } diff --git a/build/rust/rust_target.gni b/build/rust/rust_target.gni index 1fdad63..439a8e9 100644 --- a/build/rust/rust_target.gni +++ b/build/rust/rust_target.gni @@ -33,9 +33,31 @@ if (build_with_chromium) { template("rust_target") { _target_name = target_name - _crate_name = target_name + + # NOTE: TargetName=>CrateName mangling algorithm should be updated + # simultaneously in 3 places: here, //build/rust/rust_static_library.gni, + # //build/rust/chromium_prelude/import_attribute.rs if (defined(invoker.crate_name)) { _crate_name = invoker.crate_name + } else { + # Not using `get_label_info(..., "label_no_toolchain")` to consistently + # use `//foo/bar:baz` instead of the alternative shorter `//foo/bar` form. + _dir = get_label_info(":${_target_name}", "dir") + _dir = string_replace(_dir, "//", "") + _crate_name = "${_dir}:${_target_name}" + + # The `string_replace` calls below replicate the escaping algorithm + # from the `escape_non_identifier_chars` function in + # //build/rust/chromium_prelude/import_attribute.rs. Note that the + # ordering of `match` branches within the Rust function doesn't matter, + # but the ordering of `string_replace` calls *does* matter - the escape + # character `_` needs to be handled first to meet the injectivity + # requirement (otherwise we would get `/` => `_s` => `_us` and the same + # result for `_s` => `_us`). + _crate_name = string_replace(_crate_name, "_", "_u") + _crate_name = string_replace(_crate_name, "/", "_s") + _crate_name = string_replace(_crate_name, ":", "_c") + _crate_name = string_replace(_crate_name, "-", "_d") } _generate_crate_root = defined(invoker.generate_crate_root) && invoker.generate_crate_root @@ -44,11 +66,6 @@ template("rust_target") { # neither. assert(!defined(invoker.crate_root) || !_generate_crate_root) - if (defined(invoker.output_dir) && invoker.output_dir != "") { - # This is where the build target (.exe, .rlib, etc) goes. - _output_dir = invoker.output_dir - } - # This is where the OUT_DIR environment variable points to when running a # build script and when compiling the build target, for consuming generated # files. @@ -133,9 +150,11 @@ template("rust_target") { } if (invoker.target_type == "rust_proc_macro") { - _main_target_suffix = "${target_name}__proc_macro" + _main_target_suffix = "__proc_macro" + } else if (invoker.target_type == "shared_library") { + _main_target_suffix = "__proc_macro" } else { - _main_target_suffix = "__rlib" + _main_target_suffix = "" } _deps = [] @@ -153,8 +172,6 @@ template("rust_target") { } } - _is_data_dep = defined(invoker.is_data_dep) && invoker.is_data_dep - _build_unit_tests = false if (defined(invoker.build_native_rust_unit_tests)) { _build_unit_tests = @@ -166,10 +183,10 @@ template("rust_target") { # generate Rust code internally, depending on what bindings are declared. If # set, it's a set of rust files that include Cxx bindings declarations. _cxx_bindings = [] + assert(!defined(invoker.cxx_bindings) || enable_cxx, + "cxx bindings are not supported when building rust targets " + + "outside the Chromium build.") if (defined(invoker.cxx_bindings)) { - assert(build_with_chromium, - "cxx bindings are not supported when building rust targets " + - "outside the Chromium build.") _cxx_bindings = invoker.cxx_bindings } _rustenv = [ "OUT_DIR=" + @@ -200,14 +217,13 @@ template("rust_target") { not_needed(invoker, "*") not_needed([ + "_aliased_deps", "_allow_unsafe", "_build_unit_tests", "_crate_root", "_crate_name", "_cxx_bindings", "_deps", - "_aliased_deps", - "_is_data_dep", "_rustc_metadata", "_out_dir", "_public_deps", @@ -215,50 +231,54 @@ template("rust_target") { "_rustflags", "_support_use_from_cpp", "_testonly", - "_visibility", ]) } else { - _rustc_metadata = "" - if (defined(invoker.rustc_metadata)) { - _rustc_metadata = invoker.rustc_metadata - } + # These are dependencies that must be included into the C++ target that + # depends on this Rust one, and into the Rust target itself, respectively. + # + # For an rlib or exe, it's enough to add all these as dependencies of the + # Rust target alone, and they will get included into the final link step. + # + # But when then Rust target is a shared library, the C++ target needs to + # link the C++ thunks that are used to call the cxx bridge functions. And + # Cxx library itself needs to be in both. + _cxx_generated_deps_for_cpp = [] + _cxx_generated_deps_for_rust = [] + if (_cxx_bindings != []) { + _cxx_generated_deps_for_cpp += [ + # The Cxx-generated thunks, which have the public C++ names and bounce + # over to the Rust code. + ":${_target_name}_cxx_generated", - # Add a metadata-influenced suffix to the output name for libraries only. - _output_suffix = "" - if (invoker.target_type == "rust_library" && _rustc_metadata != "") { - _output_suffix = "-${_rustc_metadata}" + # Additionally, C++ bindings generated by Cxx can include C++ types + # that come from the Cxx library, such as `rust::Str`. The header and + # implementation of these types are provided in the cxx_cppdeps target. + # The C++ targets depending on this Rust target need the headers, while + # the Rust target needs the implementation. + "//build/rust:cxx_cppdeps", + ] + _cxx_generated_deps_for_rust = [ + # The implementation of the Cxx library needs to be in the Rust target. + "//build/rust:cxx_cppdeps", + ] } - group(_target_name) { - testonly = _testonly - if (defined(_visibility)) { - visibility = _visibility - } - - # Both the C++ bindings (if present) and the Rust crate should be treated - # like direct dependencies, so we expose them both in public_deps. - public_deps = [ ":${_target_name}${_main_target_suffix}" ] - - # TODO(danakj): This would not be needed if we stopped forwarding through - # a group in the common (non-procmacro) case. - if (_is_data_dep) { - data_deps = [ ":${_target_name}${_main_target_suffix}" ] + # Proc macros and shared libraries have a group for the target name and + # redirect to a suffixed target for the actual library. + if (_main_target_suffix != "") { + group(_target_name) { + testonly = _testonly + if (defined(_visibility)) { + visibility = _visibility + } + public_deps = [ ":${_target_name}${_main_target_suffix}" ] + public_deps += _cxx_generated_deps_for_cpp } + } - if (_cxx_bindings != []) { - public_deps += [ ":${_target_name}_cxx_generated" ] - - # Additionally, C++ bindings generated by Cxx can include C++ types - # that come from the Cxx library, such as `rust::Str`. So any C++ - # target that depends on a rust target directly may need access to Cxx - # as well, which means it must appear in public_deps. - public_deps += [ "//build/rust:cxx_cppdeps" ] - } else if (!defined(invoker.no_std) || !invoker.no_std) { - # If C++ depends on and links in the library, we need to make sure C++ - # links in the Rust stdlib. This is orthogonal to if the library exports - # bindings for C++ to use. - deps = [ "//build/rust/std:stdlib_for_clang" ] - } + _rustc_metadata = "" + if (defined(invoker.rustc_metadata)) { + _rustc_metadata = invoker.rustc_metadata } _rust_deps = _deps @@ -266,24 +286,25 @@ template("rust_target") { _rust_public_deps = _public_deps _cxx_deps = _deps - # The Rust target (and unit tests) need the Cxx crate when using it to - # generate bindings. + # Include the `chromium` crate in all first-party code. Third-party code + # (and the `chromium` crate itself) opts out by setting + # `no_chromium_prelude`. + if (!defined(invoker.no_chromium_prelude) || !invoker.no_chromium_prelude) { + if (enable_chromium_prelude) { + _rust_deps += [ "//build/rust/chromium_prelude" ] + } + } + if (_cxx_bindings != []) { + # The Rust target (and unit tests) need the Cxx crate when using it to + # generate bindings. _rust_deps += [ "//build/rust:cxx_rustdeps" ] - - # C++ targets can depend on the Rust target from the BUILD.gn file to - # access the headers generated from it - _rust_public_deps += [ ":${_target_name}_cxx_generated" ] } if (!defined(invoker.no_std) || !invoker.no_std) { - _rust_deps += [ "//build/rust/std:stdlib_for_rustc" ] + _rust_deps += [ "//build/rust/std" ] } - # You must go through the groups above to get to these targets. - _visibility = [] - _visibility = [ ":${_target_name}" ] - if (_build_unit_tests) { _unit_test_target = "${_target_name}_unittests" if (defined(invoker.unit_test_target)) { @@ -292,6 +313,7 @@ template("rust_target") { rust_unit_test(_unit_test_target) { testonly = true + crate_name = _unit_test_target crate_root = _crate_root sources = invoker.sources + [ crate_root ] rustflags = _rustflags @@ -349,15 +371,28 @@ template("rust_target") { "test_inputs", ]) + if (_main_target_suffix != "") { + # There's a group that depends on this target, and dependencies must + # be through that group. + visibility = [ ":$_target_name" ] + not_needed([ "_visibility" ]) + } else if (defined(_visibility)) { + visibility = _visibility + } + testonly = _testonly - visibility = _visibility crate_name = _crate_name crate_root = _crate_root configs = [] configs = _configs - deps = _rust_deps + deps = _rust_deps + _cxx_generated_deps_for_rust aliased_deps = _rust_aliased_deps public_deps = _rust_public_deps + if (_main_target_suffix == "") { + # When these are not provided by a wrapper group target, they are added + # to the Rust target itself. + public_deps += _cxx_generated_deps_for_cpp + } rustflags = _rustflags if (_rustc_metadata != "") { rustflags += [ "-Cmetadata=${_rustc_metadata}" ] @@ -369,14 +404,24 @@ template("rust_target") { sources += [ _crate_root ] } - # The Rust tool() declarations, like C++ ones, use the output_name and - # output_dir, so that GN targets can override these if needed. Here we - # give them their default values, or allow them to be overridden. - if (defined(_output_dir)) { - output_dir = _output_dir - } - if (!defined(output_name) || output_name == "") { - output_name = "${crate_name}${_output_suffix}" + if (!defined(output_name)) { + # Note that file names of libraries must start with the crate name in + # order for the compiler to find transitive dependencies in the + # directory search paths (since they are not all explicitly specified). + # + # For bin targets, we expect the target name to be unique, and the name + # of the exe should not add magic stuff to it. And bin crates can not be + # transitive dependencies. + if (invoker.target_type == "executable") { + output_name = _target_name + } else { + # TODO(danakj): Since the crate name includes the whole path for 1p + # libraries, we could move the output_dir to `root_out_dir` here for + # them, which would make for shorter file paths. But we need to not + # do the same for 3p crates or those with a `crate_name` set + # explicitly. + output_name = _crate_name + } } if (!_allow_unsafe) { @@ -387,7 +432,7 @@ template("rust_target") { if (_cxx_bindings != []) { rust_cxx("${_target_name}_cxx_generated") { testonly = _testonly - visibility = [ ":${_target_name}${_main_target_suffix}" ] + visibility = [ ":${_target_name}" ] if (defined(_visibility)) { visibility += _visibility } diff --git a/build/rust/rust_unit_test.gni b/build/rust/rust_unit_test.gni index 6cfa827..15550ca 100644 --- a/build/rust/rust_unit_test.gni +++ b/build/rust/rust_unit_test.gni @@ -129,6 +129,17 @@ template("rust_unit_test") { # Consumed by "rust_unit_tests_group" gni template. rust_unit_test_executables = [ _crate_name ] } + + # Duplicated from rust_target since we didn't use the rust_executable + # template as it causes a GN cycle. + if (!defined(deps)) { + deps = [] + } + if (!defined(invoker.no_chromium_prelude) || !invoker.no_chromium_prelude) { + if (enable_chromium_prelude) { + deps += [ "//build/rust/chromium_prelude" ] + } + } } } diff --git a/build/rust/rustc_wrapper.py b/build/rust/rustc_wrapper.py index 1c61e9f..b8e490d 100755 --- a/build/rust/rustc_wrapper.py +++ b/build/rust/rustc_wrapper.py @@ -7,6 +7,7 @@ import argparse import pathlib import subprocess +import shlex import os import sys import re @@ -141,6 +142,7 @@ def main(): parser.add_argument('--depfile', required=True, type=pathlib.Path) parser.add_argument('--rsp', type=pathlib.Path, required=True) parser.add_argument('--target-windows', action='store_true') + parser.add_argument('-v', action='store_true') parser.add_argument('args', metavar='ARG', nargs='+') args = parser.parse_args() @@ -191,9 +193,13 @@ def main(): fixed_env_vars.append(k) try: + if args.v: + print(' '.join(f'{k}={shlex.quote(v)}' for k, v in env.items()), + args.rustc, shlex.join(rustc_args)) r = subprocess.run([args.rustc, *rustc_args], env=env, check=False) finally: - os.remove(out_rsp) + if not args.v: + os.remove(out_rsp) if r.returncode != 0: sys.exit(r.returncode) diff --git a/build/rust/std/BUILD.gn b/build/rust/std/BUILD.gn index b0f3134..9c3db1e 100644 --- a/build/rust/std/BUILD.gn +++ b/build/rust/std/BUILD.gn @@ -2,28 +2,18 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# This file provides the ability for our C++ toolchain to successfully -# link binaries containing arbitrary Rust code. +# This file provides the Rust standard library for GN targets. # -# By "arbitrary Rust code" I mean .rlib archives full of Rust code, which -# is actually a static archive. +# For Rust targets, it either copies a prebuilt stdlib or builds a stdlib, and +# then points rustc to it with `--sysroot`. # -# Those static libraries don't link as-is into a final executable because -# they're designed for downstream processing by further invocations of rustc -# which link into a final binary. That final invocation of rustc knows how -# to do two things: -# * Find the Rust standard library. -# * Remap some generic allocator symbols to the specific allocator symbols -# in use. -# This file takes care of equivalent tasks for our C++ toolchains. -# C++ targets should depend upon either local_stdlib_for_clang or -# prebuilt_stdlib_for_clang to ensure that Rust code can be linked into their -# C++ executables. +# When linking it ensures the libraries (and their C library dependencies) are +# part of the linker line. If Rust drives the linking, this is redundant but if +# Clang drives the linking it is required. # -# This is obviously a bit fragile - rustc might do other magic in future. -# But, linking with a final C++ toolchain is something often needed, and -# https://github.com/rust-lang/rust/issues/64191 aims to make this -# officially possible. +# Part of the standard library provided here is "remap_alloc" which maps +# allocator functions into the shim provided by PartitionAlloc so that Rust and +# C++ use the same allocator backend. import("//build/config/compiler/compiler.gni") import("//build/config/coverage/coverage.gni") @@ -55,19 +45,13 @@ if (toolchain_has_rust) { # library that needs to be added here in a newer stdlib. stdlib_files = [ "std", # List first because it makes depfiles more debuggable (see below) - "addr2line", - "adler", "alloc", "cfg_if", "compiler_builtins", "core", "getopts", - "gimli", "hashbrown", "libc", - "memchr", - "miniz_oxide", - "object", "panic_abort", "panic_unwind", "rustc_demangle", @@ -77,6 +61,18 @@ if (toolchain_has_rust) { "unwind", ] + if (!is_win) { + # These are no longer present in the Windows toolchain. + stdlib_files += [ + "addr2line", + "adler", + "gimli", + "memchr", + "miniz_oxide", + "object", + ] + } + if (toolchain_for_rust_host_build_tools) { # When building proc macros, include the proc_macro crate in what should be # copied with find_stdlib. Otherwise it is not copied since it will be @@ -286,17 +282,13 @@ if (toolchain_has_rust) { visibility = [ ":*" ] } - # Builds the stdlib and points the rustc `--sysroot` to them. Used by - # targets for which linking is driven by Rust (bins and dylibs). - group("stdlib_for_rustc") { - all_dependent_configs = [ ":local_stdlib_sysroot" ] - public_deps = [ ":local_stdlib_libs" ] - } - # Builds and links against the Rust stdlib. Used by targets for which # linking is driven by C++. - group("stdlib_for_clang") { - all_dependent_configs = [ ":stdlib_public_dependent_libs" ] + group("std") { + all_dependent_configs = [ + ":stdlib_public_dependent_libs", + ":local_stdlib_sysroot", + ] public_deps = [ ":local_stdlib_libs", ":remap_alloc", @@ -420,15 +412,7 @@ if (toolchain_has_rust) { visibility = [ ":*" ] } - # Use the sysroot generated by :prebuilt_rustc_copy_to_sysroot. - group("stdlib_for_rustc") { - all_dependent_configs = [ ":prebuilt_stdlib_sysroot" ] - deps = [ ":prebuilt_rustc_copy_to_sysroot" ] - } - - # Links the Rust stdlib. Used by targets for which linking is driven by - # C++. - group("stdlib_for_clang") { + group("std") { all_dependent_configs = [ ":prebuilt_stdlib_libs", ":stdlib_public_dependent_libs", diff --git a/build/rust/std/BUILD.gn.hbs b/build/rust/std/BUILD.gn.hbs index ec7b961..5900471 100644 --- a/build/rust/std/BUILD.gn.hbs +++ b/build/rust/std/BUILD.gn.hbs @@ -7,8 +7,8 @@ import("//build/rust/cargo_crate.gni") {{#each rules}} -cargo_crate("{{this.0}}") { - {{#with this.1.concrete}} +{{#with this.detail}} +cargo_crate("{{../name}}") { crate_type = "{{crate_type}}" crate_root = "{{crate_root}}" sources = [ @@ -71,15 +71,15 @@ cargo_crate("{{this.0}}") { {{/unless}} {{#each deps}} {{#if @first}} - {{#each this.rules}} - "{{this}}", + {{#each this.packages}} + ":{{this.name}}", {{/each}} ] {{else}} if ({{this.cond}}) { - deps = [ - {{#each this.rules}} - "{{this}}", + deps += [ + {{#each this.packages}} + ":{{this.name}}", {{/each}} ] } @@ -102,7 +102,42 @@ cargo_crate("{{this.0}}") { {{#unless extra_kv.skip_build_rs}} {{#if build_root}} build_root = "{{build_root}}" - build_sources = [ "{{build_root}}" ] + build_sources = [ + {{#each build_script_sources}} + "{{this}}", + {{/each}} + ] + {{#with build_script_inputs}} + build_script_inputs = [ + {{#each this}} + "{{this}}", + {{/each}} + ] + {{/with}} + {{#with build_script_outputs}} + build_script_outputs = [ + {{#each this}} + "{{this}}", + {{/each}} + ] + {{/with}} + {{#each build_deps}} + {{#if @first}} + build_deps = [ + {{#each this.packages}} + ":{{this.name}}", + {{/each}} + ] + {{else}} + if ({{this.cond}}) { + build_deps += [ + {{#each this.packages}} + ":{{this.name}}", + {{/each}} + ] + } + {{/if}} + {{/each}} {{/if}} {{/unless}} rustenv = [ @@ -117,6 +152,10 @@ cargo_crate("{{this.0}}") { {{/if}} ] output_dir = "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" + + {{#with extra_kv.raw_gn}} + {{this}} + {{/with}} {{/with}} } {{/each}} diff --git a/build/rust/std/gnrt_config.toml b/build/rust/std/gnrt_config.toml index 5e87d0c..f99685b 100644 --- a/build/rust/std/gnrt_config.toml +++ b/build/rust/std/gnrt_config.toml @@ -3,6 +3,12 @@ # found in the LICENSE file. # Provides per-crate and overall configuration options to gnrt. +# +# Most commonly needed configuration options can be found in the top-level doc +# comment in //third_party/rust/chromium_crates_io/gnrt_config.toml. As a +# fallback, one may also read the doc comments in +# `//tools/crates/gnrt/lib/config.rs` (e.g. `CrateConfig`'s fields correspond +# to per-crate options). [resolve] # There is a virtual "sysroot" crate that includes all sysroot libraries as @@ -35,13 +41,17 @@ extra_kv = { include_coverage = true } [crate.compiler_builtins] # Dependencies of profiler_builtins must have instrumentation disabled -extra_kv = { include_coverage = false } +# The build script conditionally generates a file; it's simplest to just paste +# raw GN into the output. (crbug.com/1470653) +extra_kv = { include_coverage = false, raw_gn = 'if (current_cpu == "arm64") { build_script_outputs = ["outlined_atomics.rs"] }' } + +# compiler_builtins depends on libm on windows crbug.com/1472681 +extra_src_roots = ['../libm'] [crate.core] # Dependencies of profiler_builtins must have instrumentation disabled extra_kv = { include_coverage = false, immediate_abort = true } extra_src_roots = ['../../portable-simd/crates/core_simd', '../../stdarch/crates/core_arch'] -extra_input_roots = ['../primitive_docs'] [crate.hashbrown] # Workaround for Cargo issue: hashbrown's Cargo.toml uses an unstable Cargo @@ -75,8 +85,8 @@ extra_kv = { include_coverage = false } extra_kv = { include_coverage = false } [crate.std] -extra_src_roots = ['../../backtrace/src', '../../portable-simd/crates/std_float/src'] -extra_input_roots = ['../primitive_docs', '../../core/src', '../../portable-simd/crates/core_simd/src', '../../stdarch/crates/core_arch/src'] +extra_src_roots = ['../../backtrace/src', '../../portable-simd/crates/std_float/src', '../../core/src/primitive_docs.rs'] +extra_input_roots = [ '../../portable-simd/crates/core_simd/src', '../../stdarch/crates/core_arch/src', '../../core/src'] # Remove this from std. It will be depended on directly when needed. exclude_deps_in_gn = ['profiler_builtins'] @@ -96,4 +106,4 @@ exclude_deps_in_gn = ['proc_macro'] # scripts. # # Suppress link directives since we specify the deps in GN configs. -extra_kv = { skip_build_rs = true, no_link_directives = true } \ No newline at end of file +extra_kv = { skip_build_rs = true, no_link_directives = true } diff --git a/build/rust/std/remap_alloc.cc b/build/rust/std/remap_alloc.cc index bfd39b7..024adb2 100644 --- a/build/rust/std/remap_alloc.cc +++ b/build/rust/std/remap_alloc.cc @@ -88,7 +88,7 @@ extern "C" { REMAP_ALLOC_ATTRIBUTES void* __rust_alloc(size_t size, size_t align) { // This mirrors kMaxSupportedAlignment from - // base/allocator/partition_allocator/partition_alloc_constants.h. + // base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h. // ParitionAlloc will crash if given an alignment larger than this. constexpr size_t max_align = (1 << 21) / 2; if (align > max_align) { @@ -101,11 +101,9 @@ REMAP_ALLOC_ATTRIBUTES void* __rust_alloc(size_t size, size_t align) { // Note: PartitionAlloc by default will route aligned allocations back to // malloc() (the fast path) if they are for a small enough alignment. So we // just unconditionally use aligned allocation functions here. - // https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc;l=219-226;drc=31d99ff4aa0cc0b75063325ff243e911516a5a6a + // https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc;l=219-226;drc=31d99ff4aa0cc0b75063325ff243e911516a5a6a #if defined(COMPILER_MSVC) - // Because we use PartitionAlloc() as the allocator, free() is able to find - // this allocation, instead of the usual requirement to use _aligned_free(). return _aligned_malloc(size, align); #elif BUILDFLAG(IS_ANDROID) // Android has no posix_memalign() exposed: @@ -130,7 +128,15 @@ REMAP_ALLOC_ATTRIBUTES void* __rust_alloc(size_t size, size_t align) { } REMAP_ALLOC_ATTRIBUTES void __rust_dealloc(void* p, size_t size, size_t align) { +#if defined(COMPILER_MSVC) + if (align <= alignof(std::max_align_t)) { + free(p); + } else { + _aligned_free(p); + } +#else free(p); +#endif } REMAP_ALLOC_ATTRIBUTES void* __rust_realloc(void* p, diff --git a/build/rust/std/rules/BUILD.gn b/build/rust/std/rules/BUILD.gn index cda6a66..207812e 100644 --- a/build/rust/std/rules/BUILD.gn +++ b/build/rust/std/rules/BUILD.gn @@ -8,19 +8,20 @@ import("//build/rust/cargo_crate.gni") cargo_crate("addr2line") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.19.0/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.21.0/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.19.0/src/function.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.19.0/src/lazy.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.19.0/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.21.0/src/builtin_split_dwarf_loader.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.21.0/src/function.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.21.0/src/lazy.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/addr2line-0.21.0/src/lib.rs", ] inputs = [] no_std = true # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false - edition = "2015" - cargo_pkg_version = "0.19.0" + edition = "2018" + cargo_pkg_version = "0.21.0" cargo_pkg_name = "addr2line" cargo_pkg_description = "A cross-platform symbolication library written in Rust, using `gimli`" @@ -37,8 +38,8 @@ cargo_crate("addr2line") { "//build/rust/std:std_build_deps", ] aliased_deps = { - alloc = ":rustc_std_workspace_alloc__rlib" - core = ":rustc_std_workspace_core__rlib" + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" } features = [ "alloc", @@ -86,7 +87,7 @@ cargo_crate("adler") { "//build/rust/std:std_build_deps", ] aliased_deps = { - core = ":rustc_std_workspace_core__rlib" + core = ":rustc_std_workspace_core" } features = [ "compiler_builtins", @@ -240,7 +241,7 @@ cargo_crate("cfg_if") { "//build/rust/std:std_build_deps", ] aliased_deps = { - core = ":rustc_std_workspace_core__rlib" + core = ":rustc_std_workspace_core" } features = [ "compiler_builtins", @@ -260,51 +261,175 @@ cargo_crate("cfg_if") { } cargo_crate("compiler_builtins") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/arm_linux.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/add.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/cmp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/conv.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/div.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/extend.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/mul.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/pow.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/sub.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/float/trunc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/addsub.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/leading_zeros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/mul.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/sdiv.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/shift.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/specialized_div_rem/asymmetric.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/specialized_div_rem/binary_long.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/specialized_div_rem/delegate.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/specialized_div_rem/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/specialized_div_rem/norm_shift.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/specialized_div_rem/trifecta.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/int/udiv.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/macros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/math.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/mem/impls.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/mem/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/mem/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/probestack.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/riscv.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/src/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/aarch64_linux.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/arm_linux.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/add.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/cmp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/conv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/div.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/extend.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/mul.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/pow.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/sub.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/float/trunc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/hexagon.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/addsub.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/leading_zeros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/mul.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/sdiv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/shift.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/specialized_div_rem/asymmetric.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/specialized_div_rem/binary_long.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/specialized_div_rem/delegate.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/specialized_div_rem/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/specialized_div_rem/norm_shift.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/specialized_div_rem/trifecta.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/int/udiv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/macros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/math.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/mem/impls.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/mem/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/mem/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/probestack.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/riscv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/x86_64.rs", + ] + inputs = [ + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/acos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/acosf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/acosh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/acoshf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/asin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/asinf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/asinh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/asinhf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/atan.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/atan2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/atan2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/atanf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/atanh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/atanhf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/cbrt.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/cbrtf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/ceil.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/ceilf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/copysign.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/copysignf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/cos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/cosf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/cosh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/coshf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/erf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/erff.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/exp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/exp10.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/exp10f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/exp2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/exp2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/expf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/expm1.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/expm1f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/expo2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fabs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fabsf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fdim.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fdimf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fenv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/floor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/floorf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fma.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fmaf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fmax.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fmaxf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fmin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fminf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fmod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/fmodf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/frexp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/frexpf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/hypot.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/hypotf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/ilogb.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/ilogbf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/j0.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/j0f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/j1.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/j1f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/jn.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/jnf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/k_cos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/k_cosf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/k_expo2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/k_expo2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/k_sin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/k_sinf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/k_tan.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/k_tanf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/ldexp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/ldexpf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/lgamma.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/lgamma_r.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/lgammaf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/lgammaf_r.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/log.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/log10.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/log10f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/log1p.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/log1pf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/log2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/log2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/logf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/modf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/modff.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/nextafter.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/nextafterf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/pow.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/powf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/rem_pio2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/rem_pio2_large.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/rem_pio2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/remainder.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/remainderf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/remquo.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/remquof.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/rint.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/rintf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/round.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/roundf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/scalbn.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/scalbnf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/sin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/sincos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/sincosf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/sinf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/sinh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/sinhf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/sqrt.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/sqrtf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/tan.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/tanf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/tanh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/tanhf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/tgamma.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/tgammaf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/trunc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/src/../libm/src/math/truncf.rs", ] - inputs = [] no_std = true # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false - edition = "2015" - cargo_pkg_version = "0.1.92" + edition = "2018" + cargo_pkg_version = "0.1.108" cargo_pkg_authors = "Jorge Aparicio " cargo_pkg_name = "compiler_builtins" cargo_pkg_description = "Compiler intrinsics used by the Rust compiler. Also available for other targets if necessary!" @@ -320,7 +445,7 @@ cargo_crate("compiler_builtins") { "//build/rust/std:std_build_deps", ] aliased_deps = { - core = ":rustc_std_workspace_core__rlib" + core = ":rustc_std_workspace_core" } features = [ "compiler-builtins", @@ -328,8 +453,8 @@ cargo_crate("compiler_builtins") { "rustc-dep-of-std", "weak-intrinsics", ] - build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/build.rs" - build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.92/build.rs" ] + build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/build.rs" + build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/compiler_builtins-0.1.108/build.rs" ] rustenv = [ "CFG_DISABLE_UNSTABLE_FEATURES=0", "STD_ENV_ARCH=$rust_target_arch", @@ -340,6 +465,10 @@ cargo_crate("compiler_builtins") { ] output_dir = "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" + + if (current_cpu == "arm64") { + build_script_outputs = [ "outlined_atomics.rs" ] + } } cargo_crate("core") { crate_type = "rlib" @@ -399,6 +528,9 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/internal_macros.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/intrinsics.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/intrinsics/mir.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/intrinsics/simd.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/io/borrowed_buf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/io/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/array_chunks.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/by_ref_sized.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/chain.rs", @@ -414,6 +546,7 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/intersperse.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/map.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/map_while.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/map_windows.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/peekable.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/adapters/rev.rs", @@ -428,8 +561,8 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/range.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/empty.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/from_coroutine.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/from_fn.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/from_generator.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/once.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/once_with.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/repeat.rs", @@ -481,6 +614,7 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/int_macros.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/nonzero.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/overflow_panic.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/saturating.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/i128.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/shells/i16.rs", @@ -498,12 +632,13 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/uint_macros.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/wrapping.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/arith.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/async_function.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/bit.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/control_flow.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/coroutine.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/deref.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/drop.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/function.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/generator.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/index.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/index_range.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ops/mod.rs", @@ -573,13 +708,6 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/alias.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/cast.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/core_simd_docs.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/elements/const_ptr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/elements/float.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/elements/int.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/elements/mut_ptr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/elements/uint.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/elements.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/eq.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/fmt.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/intrinsics.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/iter.rs", @@ -587,15 +715,25 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/lib.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/masks/bitmask.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/masks/full_masks.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/masks/to_bitmask.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/masks.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/ops/assign.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/ops/deref.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/ops/shift_scalar.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/ops/unary.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/ops.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/ord.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/select.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/cmp/eq.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/cmp/ord.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/cmp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/num/float.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/num/int.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/num/uint.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/num.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/prelude.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/ptr/const_ptr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/ptr/mut_ptr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/simd/ptr.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/swizzle.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/swizzle_dyn.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../portable-simd/crates/core_simd/src/to_bytes.rs", @@ -639,7 +777,6 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/README.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/avx512bw.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/avx512f.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/aarch64/armclang.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/aarch64/crc.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/aarch64/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/aarch64/neon/generated.rs", @@ -647,16 +784,11 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/aarch64/prefetch.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/aarch64/test_support.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/aarch64/tme.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/aarch64/v8.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/armclang.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/dsp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/ex.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/neon.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/sat.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/simd32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/v6.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm/v7.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/barrier/common.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/barrier/cp15.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/barrier/mod.rs", @@ -672,10 +804,6 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/neon/shift_and_insert_tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/neon/store_tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/neon/table_lookup_tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/registers/aarch32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/registers/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/registers/v6m.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/registers/v7m.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/arm_shared/test_support.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/core_arch_docs.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/lib.rs", @@ -689,9 +817,14 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/powerpc/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/powerpc/vsx.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/powerpc64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/riscv32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/riscv32/zk.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/riscv64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/riscv64/zk.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/riscv_shared/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/riscv_shared/p.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/riscv_shared/zb.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/riscv_shared/zk.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/simd.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/simd_llvm.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/v64.rs", @@ -763,15 +896,6 @@ cargo_crate("core") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/x86_64/sse41.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/x86_64/sse42.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../../stdarch/crates/core_arch/src/x86_64/xsave.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/box_into_raw.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/fs_file.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/io_bufread.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/io_read.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/io_seek.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/io_write.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/net_tosocketaddrs.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/process_exit.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/../primitive_docs/string_string.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/error.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ffi/c_char.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ffi/c_double.md", @@ -848,8 +972,8 @@ cargo_crate("getopts") { "//build/rust/std:std_build_deps", ] aliased_deps = { - core = ":rustc_std_workspace_core__rlib" - std = ":rustc_std_workspace_std__rlib" + core = ":rustc_std_workspace_core" + std = ":rustc_std_workspace_std" } features = [ "core", @@ -869,51 +993,50 @@ cargo_crate("getopts") { } cargo_crate("gimli") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/arch.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/constants.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/endianity.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/leb128.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/abbrev.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/addr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/aranges.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/cfi.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/dwarf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/endian_reader.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/endian_slice.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/index.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/lazy.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/line.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/lists.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/loclists.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/lookup.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/op.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/pubnames.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/pubtypes.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/reader.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/rnglists.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/str.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/unit.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/util.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/read/value.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/test_util.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/abbrev.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/cfi.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/dwarf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/endian_vec.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/line.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/loc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/op.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/range.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/str.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/unit.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.27.2/src/write/writer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/arch.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/common.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/constants.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/endianity.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/leb128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/abbrev.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/addr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/aranges.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/cfi.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/dwarf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/endian_reader.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/endian_slice.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/index.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/line.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/lists.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/loclists.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/lookup.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/op.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/pubnames.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/pubtypes.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/reader.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/rnglists.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/str.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/unit.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/util.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/read/value.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/test_util.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/abbrev.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/cfi.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/dwarf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/endian_vec.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/line.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/loc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/op.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/range.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/str.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/unit.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/gimli-0.28.1/src/write/writer.rs", ] inputs = [] no_std = true @@ -921,7 +1044,7 @@ cargo_crate("gimli") { # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false edition = "2018" - cargo_pkg_version = "0.27.2" + cargo_pkg_version = "0.28.1" cargo_pkg_name = "gimli" cargo_pkg_description = "A library for reading and writing the DWARF debugging format." @@ -937,13 +1060,10 @@ cargo_crate("gimli") { "//build/rust/std:std_build_deps", ] aliased_deps = { - alloc = ":rustc_std_workspace_alloc__rlib" - core = ":rustc_std_workspace_core__rlib" + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" } features = [ - "alloc", - "compiler_builtins", - "core", "read", "read-core", "rustc-dep-of-std", @@ -961,30 +1081,32 @@ cargo_crate("gimli") { } cargo_crate("hashbrown") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/rayon/helpers.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/rayon/map.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/rayon/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/rayon/raw.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/rayon/set.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/rkyv/hash_map.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/rkyv/hash_set.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/rkyv/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/external_trait_impls/serde.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/macros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/map.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/raw/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/raw/bitmask.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/raw/generic.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/raw/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/raw/neon.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/raw/sse2.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/rustc_entry.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/scopeguard.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.0/src/set.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rayon/helpers.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rayon/map.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rayon/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rayon/raw.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rayon/set.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rayon/table.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rkyv/hash_map.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rkyv/hash_set.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/rkyv/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/external_trait_impls/serde.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/macros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/map.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/raw/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/raw/bitmask.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/raw/generic.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/raw/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/raw/neon.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/raw/sse2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/rustc_entry.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/scopeguard.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/set.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/hashbrown-0.14.3/src/table.rs", ] inputs = [] no_std = true @@ -992,7 +1114,7 @@ cargo_crate("hashbrown") { # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false edition = "2021" - cargo_pkg_version = "0.14.0" + cargo_pkg_version = "0.14.3" cargo_pkg_authors = "Amanieu d'Antras " cargo_pkg_name = "hashbrown" cargo_pkg_description = "A Rust port of Google's SwissTable hash map" @@ -1008,8 +1130,8 @@ cargo_crate("hashbrown") { "//build/rust/std:std_build_deps", ] aliased_deps = { - alloc = ":rustc_std_workspace_alloc__rlib" - core = ":rustc_std_workspace_core__rlib" + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" } features = [ "alloc", @@ -1032,230 +1154,242 @@ cargo_crate("hashbrown") { } cargo_crate("libc") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/fixed_width_ints.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/fuchsia/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/fuchsia/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/fuchsia/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/fuchsia/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/fuchsia/riscv64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/fuchsia/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/hermit/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/hermit/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/hermit/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/macros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/psp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/sgx.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/solid/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/solid/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/solid/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/switch.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/aix/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/aix/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/b32/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/b32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/b64/aarch64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/b64/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/b64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/b64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/b64/x86_64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/b64/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/long_array.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/apple/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/dragonfly/errno.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/dragonfly/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/riscv64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/freebsdlike/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/netbsd/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/netbsd/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/netbsd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/netbsd/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/netbsd/sparc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/netbsd/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/netbsd/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/mips64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/riscv64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/sparc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/bsd/netbsdlike/openbsd/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/haiku/b32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/haiku/b64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/haiku/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/haiku/native.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/haiku/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/hermit/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/hermit/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/hermit/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b32/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b32/x86/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b32/x86/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b64/aarch64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b64/aarch64/int128.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b64/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b64/riscv64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b64/riscv64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b64/x86_64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/b64/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/android/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/emscripten/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/emscripten/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/emscripten/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/arch/generic/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/arch/mips/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/arch/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/arch/powerpc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/arch/sparc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/arm/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/arm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/m68k/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/mips/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/mips/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/sparc/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/x86/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b32/x86/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/mips64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/s390x.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/gnu/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/arm/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/arm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/hexagon.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/mips/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/mips/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/riscv32/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/x86/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b32/x86/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/aarch64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/mips64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/riscv64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/s390x.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/x86_64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/lfs64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/musl/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/non_exhaustive.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/arm/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/arm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/arm/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/mips/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/linux/uclibc/x86_64/other.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/linux_like/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/arm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/espidf/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/generic.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/horizon/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/powerpc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/newlib/vita/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/no_align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/nto/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/nto/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/nto/neutrino.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/nto/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/redox/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/solarish/compat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/solarish/illumos.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/solarish/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/solarish/solaris.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/solarish/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/solarish/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/unix/solarish/x86_common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/vxworks/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/vxworks/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/vxworks/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/vxworks/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/vxworks/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/vxworks/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/vxworks/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/wasi.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/windows/gnu/align.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/windows/gnu/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/windows/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/windows/msvc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/src/xous.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/fixed_width_ints.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/fuchsia/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/fuchsia/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/fuchsia/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/fuchsia/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/fuchsia/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/fuchsia/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/hermit/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/hermit/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/hermit/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/macros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/psp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/sgx.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/solid/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/solid/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/solid/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/switch.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/teeos/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/aix/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/aix/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/b32/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/b32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/b64/aarch64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/b64/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/b64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/b64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/b64/x86_64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/b64/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/long_array.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/apple/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/dragonfly/errno.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/dragonfly/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd15/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/freebsdlike/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/mips.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/sparc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/netbsd/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/mips64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/sparc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/bsd/netbsdlike/openbsd/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/haiku/b32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/haiku/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/haiku/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/haiku/native.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/haiku/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/hurd/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/hurd/b32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/hurd/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/hurd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/hurd/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b32/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b32/x86/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b32/x86/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b64/aarch64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b64/aarch64/int128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b64/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b64/riscv64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b64/riscv64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b64/x86_64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/b64/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/android/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/emscripten/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/emscripten/lfs64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/emscripten/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/emscripten/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/arch/generic/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/arch/mips/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/arch/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/arch/powerpc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/arch/sparc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/arm/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/arm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/csky/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/csky/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/m68k/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/mips/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/mips/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/riscv32/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/sparc/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/x86/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b32/x86/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/mips64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/riscv64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/s390x.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/sparc64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/x86_64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/gnu/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/arm/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/arm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/hexagon.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/mips/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/mips/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/riscv32/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/x86/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b32/x86/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/aarch64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/aarch64/int128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/mips64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/riscv64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/s390x.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/x86_64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/lfs64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/musl/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/non_exhaustive.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/arm/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/arm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/arm/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/mips/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/linux/uclibc/x86_64/other.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/linux_like/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/arm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/espidf/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/generic.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/horizon/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/powerpc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/newlib/vita/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/no_align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/nto/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/nto/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/nto/neutrino.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/nto/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/redox/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/solarish/compat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/solarish/illumos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/solarish/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/solarish/solaris.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/solarish/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/solarish/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/unix/solarish/x86_common.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/vxworks/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/vxworks/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/vxworks/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/vxworks/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/vxworks/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/vxworks/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/vxworks/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/wasi.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/windows/gnu/align.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/windows/gnu/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/windows/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/windows/msvc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/src/xous.rs", ] inputs = [] no_std = true @@ -1263,7 +1397,7 @@ cargo_crate("libc") { # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false edition = "2015" - cargo_pkg_version = "0.2.146" + cargo_pkg_version = "0.2.153" cargo_pkg_authors = "The Rust Project Developers" cargo_pkg_name = "libc" cargo_pkg_description = "Raw FFI bindings to platform libraries like libc." @@ -1283,8 +1417,8 @@ cargo_crate("libc") { "rustc-dep-of-std", "rustc-std-workspace-core", ] - build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/build.rs" - build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.146/build.rs" ] + build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/build.rs" + build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libc-0.2.153/build.rs" ] rustenv = [ "CFG_DISABLE_UNSTABLE_FEATURES=0", "STD_ENV_ARCH=$rust_target_arch", @@ -1359,7 +1493,7 @@ cargo_crate("memchr") { "//build/rust/std:std_build_deps", ] aliased_deps = { - core = ":rustc_std_workspace_core__rlib" + core = ":rustc_std_workspace_core" } features = [ "compiler_builtins", @@ -1381,18 +1515,18 @@ cargo_crate("memchr") { } cargo_crate("miniz_oxide") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/deflate/buffer.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/deflate/core.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/deflate/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/deflate/stream.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/inflate/core.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/inflate/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/inflate/output_buffer.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/inflate/stream.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.6.2/src/shared.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/deflate/buffer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/deflate/core.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/deflate/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/deflate/stream.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/inflate/core.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/inflate/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/inflate/output_buffer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/inflate/stream.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/miniz_oxide-0.7.2/src/shared.rs", ] inputs = [] no_std = true @@ -1400,7 +1534,7 @@ cargo_crate("miniz_oxide") { # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false edition = "2018" - cargo_pkg_version = "0.6.2" + cargo_pkg_version = "0.7.2" cargo_pkg_authors = "Frommi , oyvindln " cargo_pkg_name = "miniz_oxide" cargo_pkg_description = "DEFLATE compression and decompression library rewritten in Rust based on miniz" @@ -1417,8 +1551,8 @@ cargo_crate("miniz_oxide") { "//build/rust/std:std_build_deps", ] aliased_deps = { - alloc = ":rustc_std_workspace_alloc__rlib" - core = ":rustc_std_workspace_core__rlib" + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" } features = [ "alloc", @@ -1439,77 +1573,82 @@ cargo_crate("miniz_oxide") { } cargo_crate("object") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/archive.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/elf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/endian.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/macho.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/pe.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/pod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/any.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/archive.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/coff/comdat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/coff/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/coff/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/coff/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/coff/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/coff/symbol.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/comdat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/compression.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/dynamic.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/hash.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/note.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/segment.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/symbol.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/elf/version.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/dyld_cache.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/fat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/load_command.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/segment.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/macho/symbol.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/data_directory.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/export.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/import.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/resource.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/rich.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/pe/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/read_cache.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/read_ref.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/traits.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/util.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/wasm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/xcoff/comdat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/xcoff/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/xcoff/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/xcoff/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/xcoff/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/xcoff/segment.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/read/xcoff/symbol.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/coff.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/elf/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/elf/object.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/elf/writer.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/macho.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/pe.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/string.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/write/util.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.30.1/src/xcoff.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/archive.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/common.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/elf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/endian.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/macho.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/pe.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/pod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/any.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/archive.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/coff/comdat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/coff/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/coff/import.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/coff/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/coff/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/coff/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/coff/symbol.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/attributes.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/comdat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/compression.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/dynamic.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/hash.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/note.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/segment.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/symbol.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/elf/version.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/dyld_cache.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/fat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/load_command.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/segment.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/macho/symbol.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/data_directory.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/export.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/import.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/resource.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/rich.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/pe/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/read_cache.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/read_ref.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/traits.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/util.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/wasm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/xcoff/comdat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/xcoff/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/xcoff/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/xcoff/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/xcoff/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/xcoff/segment.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/read/xcoff/symbol.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/coff/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/coff/object.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/coff/writer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/elf/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/elf/object.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/elf/writer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/macho.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/pe.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/string.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/util.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/write/xcoff.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/object-0.32.2/src/xcoff.rs", ] inputs = [] no_std = true @@ -1517,7 +1656,7 @@ cargo_crate("object") { # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false edition = "2018" - cargo_pkg_version = "0.30.1" + cargo_pkg_version = "0.32.2" cargo_pkg_name = "object" cargo_pkg_description = "A unified interface for reading and writing object file formats." @@ -1534,8 +1673,8 @@ cargo_crate("object") { "//build/rust/std:std_build_deps", ] aliased_deps = { - alloc = ":rustc_std_workspace_alloc__rlib" - core = ":rustc_std_workspace_core__rlib" + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" } features = [ "alloc", @@ -1549,6 +1688,7 @@ cargo_crate("object") { "read_core", "rustc-dep-of-std", "unaligned", + "xcoff", ] rustenv = [ "CFG_DISABLE_UNSTABLE_FEATURES=0", @@ -1567,6 +1707,7 @@ cargo_crate("panic_abort") { sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/panic_abort/src/android.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/panic_abort/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/panic_abort/src/zkvm.rs", ] inputs = [] no_std = true @@ -1733,11 +1874,11 @@ cargo_crate("profiler_builtins") { } cargo_crate("rustc_demangle") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/rustc-demangle-0.1.21/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/rustc-demangle-0.1.23/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/rustc-demangle-0.1.21/src/legacy.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/rustc-demangle-0.1.21/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/rustc-demangle-0.1.21/src/v0.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/rustc-demangle-0.1.23/src/legacy.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/rustc-demangle-0.1.23/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/rustc-demangle-0.1.23/src/v0.rs", ] inputs = [] no_std = true @@ -1745,7 +1886,7 @@ cargo_crate("rustc_demangle") { # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false edition = "2015" - cargo_pkg_version = "0.1.21" + cargo_pkg_version = "0.1.23" cargo_pkg_authors = "Alex Crichton " cargo_pkg_name = "rustc-demangle" cargo_pkg_description = "Rust compiler symbol demangling." @@ -1760,7 +1901,7 @@ cargo_crate("rustc_demangle") { "//build/rust/std:std_build_deps", ] aliased_deps = { - core = ":rustc_std_workspace_core__rlib" + core = ":rustc_std_workspace_core" } features = [ "compiler_builtins", @@ -1909,6 +2050,8 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/ffi/os_str/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/fs.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/fs/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/hash/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/hash/random.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/buffered/bufreader.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/buffered/bufreader/buffer.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/buffered/bufwriter.rs", @@ -1928,8 +2071,6 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/impls/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/prelude.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/readbuf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/readbuf/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/stdio.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/stdio/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/io/tests.rs", @@ -1949,8 +2090,10 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/net/udp.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/net/udp/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num/benches.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/aix/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/aix/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/aix/raw.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/android/fs.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/android/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/android/net.rs", @@ -1989,6 +2132,9 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/horizon/fs.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/horizon/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/horizon/raw.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/hurd/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/hurd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/hurd/raw.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/illumos/fs.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/illumos/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/illumos/raw.rs", @@ -2032,6 +2178,8 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solid/ffi.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solid/io.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/solid/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/uefi/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/uefi/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/unix/ffi/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/unix/ffi/os_str.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/unix/fs.rs", @@ -2079,20 +2227,23 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/windows/process.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/windows/raw.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/windows/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/ffi.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/ffi/definitions.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/ffi/definitions/memoryflags.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/services.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/services/dns.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/services/log.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/services/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/services/systime.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/xous/services/ticktimer.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/panic.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/panic/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/panicking.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/path.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/path/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/personality.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/personality/dwarf/eh.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/personality/dwarf/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/personality/dwarf/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/personality/emcc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/personality/gcc.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/prelude/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/prelude/v1.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/primitive_docs.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/process.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/process/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/rt.rs", @@ -2127,221 +2278,278 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/remutex/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/rwlock.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sync/rwlock/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/common/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/common/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/common/small_c_string.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/common/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/common/thread_local/fast_local.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/common/thread_local/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/common/thread_local/os_local.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/common/thread_local/static_local.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/args.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/fd.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/fs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/futex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/net.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/os.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/stdio.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/thread_local_dtor.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/hermit/time.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/abi.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/condvar.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/error.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/mutex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/spin.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/task.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/thread_parking.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/time.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/itron/time/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/cmath.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/mem.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/panic.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/reloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/tls/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/tls/sync_bitset.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/tls/sync_bitset/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/usercalls/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/usercalls/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/usercalls/raw.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/abi/usercalls/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/args.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/condvar.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/fd.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/mutex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/net.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/os.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/path.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/rwlock.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/rwlock/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/stdio.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/thread_local_key.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/thread_parking.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/time.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/waitqueue/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/waitqueue/spin_mutex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/waitqueue/spin_mutex/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/waitqueue/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/waitqueue/unsafe_list.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/sgx/waitqueue/unsafe_list/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/abi/fs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/abi/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/abi/sockets.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/error.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/fs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/io.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/net.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/os.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/path.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/rwlock.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/stdio.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/thread_local_dtor.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/thread_local_key.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/solid/time.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/android.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/args.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/cmath.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/fd.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/fd/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/fs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/futex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/io.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/kernel_copy.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/kernel_copy/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/l4re.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/locks/fuchsia_mutex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/locks/futex_condvar.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/locks/futex_mutex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/locks/futex_rwlock.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/locks/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/locks/pthread_condvar.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/locks/pthread_mutex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/locks/pthread_rwlock.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/net.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/os.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/os/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/os_str.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/os_str/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/path.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/pipe.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/process_common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/process_common/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/process_fuchsia.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/process_unix.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/process_unix/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/process_unsupported.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/process_vxworks.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/process/zircon.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/rand.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/stack_overflow.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/stdio.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/thread_local_dtor.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/thread_local_key.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/thread_parking/darwin.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/thread_parking/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/thread_parking/netbsd.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/thread_parking/pthread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/time.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unix/weak.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/args.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/fs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/io.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/locks/condvar.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/locks/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/locks/mutex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/locks/rwlock.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/net.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/once.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/os.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/pipe.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/process.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/stdio.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/thread_local_dtor.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/thread_local_key.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/thread_parking.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/unsupported/time.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/args.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/fd.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/fs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/io.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/net.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/os.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/stdio.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasi/time.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasm/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasm/atomics/futex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasm/atomics/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasm/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/wasm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/alloc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/alloc/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/args.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/args/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/c.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/c/windows_sys.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/cmath.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/compat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/fs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/handle.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/handle/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/io.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/locks/condvar.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/locks/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/locks/mutex.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/locks/rwlock.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/net.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/os.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/os/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/os_str.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/path.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/path/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/pipe.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/process.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/process/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/rand.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/stack_overflow.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/stack_overflow_uwp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/stdio.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/stdio/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/thread.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/thread_local_dtor.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/thread_local_key.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/thread_local_key/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/thread_parking.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/windows/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/os_str/bytes.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/os_str/bytes/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/os_str/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/os_str/wtf8.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/common/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/common/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/common/small_c_string.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/common/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/common/thread_local/fast_local.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/common/thread_local/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/common/thread_local/os_local.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/common/thread_local/static_local.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/args.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/fd.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/futex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/thread_local_dtor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/hermit/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/abi.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/condvar.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/error.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/spin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/task.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/thread_parking.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/itron/time/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/mem.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/panic.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/reloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/tls/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/tls/sync_bitset.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/tls/sync_bitset/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/usercalls/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/usercalls/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/usercalls/raw.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/abi/usercalls/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/args.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/condvar.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/fd.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/rwlock.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/rwlock/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/thread_local_key.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/thread_parking.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/waitqueue/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/waitqueue/spin_mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/waitqueue/spin_mutex/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/waitqueue/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/waitqueue/unsafe_list.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/sgx/waitqueue/unsafe_list/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/abi/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/abi/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/abi/sockets.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/error.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/io.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/rwlock.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/thread_local_dtor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/thread_local_key.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/solid/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/locks/condvar.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/locks/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/locks/rwlock.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/rand.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/teeos/thread_local_dtor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/args.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/helpers.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/uefi/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/android.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/args.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/fd.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/fd/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/futex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/io.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/kernel_copy.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/kernel_copy/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/l4re.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/locks/fuchsia_mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/locks/futex_condvar.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/locks/futex_mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/locks/futex_rwlock.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/locks/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/locks/pthread_condvar.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/locks/pthread_mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/locks/queue_rwlock.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/os/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/pipe.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_common.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_common/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_fuchsia.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_unix.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_unix/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_unsupported.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_unsupported/wait_status.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_unsupported/wait_status/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/process_vxworks.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/process/zircon.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/rand.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/stack_overflow.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread_local_dtor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread_local_key.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread_parking/darwin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread_parking/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread_parking/netbsd.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread_parking/pthread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/weak.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/args.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/common.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/io.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/locks/condvar.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/locks/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/locks/mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/locks/rwlock.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/once.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/pipe.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/process.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/thread_local_dtor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/thread_local_key.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/thread_parking.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unsupported/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/args.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/fd.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/io.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasi/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasm/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasm/atomics/futex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasm/atomics/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasm/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/wasm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/alloc/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/api.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/args.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/args/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/c.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/c/windows_sys.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/compat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/fs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/handle.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/handle/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/io.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/locks/condvar.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/locks/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/locks/mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/locks/rwlock.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/net.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/os/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/pipe.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/process.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/process/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/rand.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/stack_overflow.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/stack_overflow_uwp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/stdio/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/thread_local_dtor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/thread_local_key.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/thread_local_key/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/thread_parking.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/windows/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/locks/condvar.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/locks/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/locks/mutex.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/locks/rwlock.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/net/dns.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/net/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/net/tcplistener.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/net/tcpstream.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/net/udp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/thread.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/thread_local_key.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/thread_parking.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/xous/time.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/abi.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/alloc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/args.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/os.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/stdio.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/zkvm/thread_local_key.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/path/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/path/sgx.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/path/unix.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/path/unsupported_backslash.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/path/windows.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/path/windows/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/dwarf/eh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/dwarf/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/dwarf/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/emcc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/gcc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/backtrace.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/fs.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/io.rs", @@ -2390,6 +2598,7 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/dbghelp.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/coff.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/elf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/libs_aix.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/libs_dl_iterate_phdr.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/libs_haiku.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/libs_illumos.rs", @@ -2402,6 +2611,7 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/mmap_windows.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/parse_running_mmaps_unix.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/stash.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/xcoff.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/miri.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/mod.rs", @@ -2424,18 +2634,10 @@ cargo_crate("std") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ffi/c_ushort.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ffi/c_void.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/macros/panic.md", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/primitive_docs.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../portable-simd/crates/core_simd/src/core_simd_docs.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../portable-simd/crates/std_float/src/lib.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../stdarch/crates/core_arch/src/core_arch_docs.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/box_into_raw.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/fs_file.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/io_bufread.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/io_read.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/io_seek.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/io_write.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/net_tosocketaddrs.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/process_exit.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../primitive_docs/string_string.md", ] no_std = true @@ -2453,15 +2655,12 @@ cargo_crate("std") { executable_configs -= [ "//build/config/compiler:chromium_code" ] executable_configs += [ "//build/config/compiler:no_chromium_code" ] deps = [ - ":addr2line", ":alloc", ":cfg_if", ":compiler_builtins", ":core", ":hashbrown", ":libc", - ":miniz_oxide", - ":object", ":panic_abort", ":panic_unwind", ":rustc_demangle", @@ -2470,6 +2669,13 @@ cargo_crate("std") { "//build/rust/std:profiler_builtins_group", "//build/rust/std:std_build_deps", ] + if (!is_win) { + deps += [ + ":addr2line", + ":miniz_oxide", + ":object", + ] + } features = [ "addr2line", "backtrace", @@ -2504,6 +2710,7 @@ cargo_crate("std_detect") { sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/aarch64.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/loongarch.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/mips.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/mips64.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/arch/mod.rs", @@ -2525,6 +2732,7 @@ cargo_crate("std_detect") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/arm.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/auxvec.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/cpuinfo.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/loongarch.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/mips.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/stdarch/crates/std_detect/src/detect/os/linux/powerpc.rs", @@ -2560,8 +2768,8 @@ cargo_crate("std_detect") { "//build/rust/std:std_build_deps", ] aliased_deps = { - alloc = ":rustc_std_workspace_alloc__rlib" - core = ":rustc_std_workspace_core__rlib" + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" } features = [ "alloc", @@ -2597,7 +2805,6 @@ cargo_crate("test") { "//third_party/rust-toolchain/lib/rustlib/src/rust/library/test/src/formatters/pretty.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/test/src/formatters/terse.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/test/src/helpers/concurrency.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/test/src/helpers/exit_code.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/test/src/helpers/metrics.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/test/src/helpers/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/test/src/helpers/shuffle.rs", @@ -2634,6 +2841,7 @@ cargo_crate("test") { deps = [ ":core", ":getopts", + ":libc", ":panic_abort", ":panic_unwind", ":std", @@ -2653,11 +2861,11 @@ cargo_crate("test") { } cargo_crate("unicode_width") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/unicode-width-0.1.10/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/unicode-width-0.1.11/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/unicode-width-0.1.10/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/unicode-width-0.1.10/src/tables.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/unicode-width-0.1.10/src/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/unicode-width-0.1.11/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/unicode-width-0.1.11/src/tables.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/vendor/unicode-width-0.1.11/src/tests.rs", ] inputs = [] no_std = true @@ -2665,7 +2873,7 @@ cargo_crate("unicode_width") { # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false edition = "2015" - cargo_pkg_version = "0.1.10" + cargo_pkg_version = "0.1.11" cargo_pkg_authors = "kwantam , Manish Goregaokar " cargo_pkg_name = "unicode-width" @@ -2682,8 +2890,8 @@ cargo_crate("unicode_width") { "//build/rust/std:std_build_deps", ] aliased_deps = { - core = ":rustc_std_workspace_core__rlib" - std = ":rustc_std_workspace_std__rlib" + core = ":rustc_std_workspace_core" + std = ":rustc_std_workspace_std" } features = [ "compiler_builtins", @@ -2708,6 +2916,7 @@ cargo_crate("unwind") { sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/unwind/src/lib.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/unwind/src/libunwind.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/unwind/src/unwinding.rs", ] inputs = [] no_std = true diff --git a/build/rust/tests/BUILD.gn b/build/rust/tests/BUILD.gn index ff61553..81e95c5 100644 --- a/build/rust/tests/BUILD.gn +++ b/build/rust/tests/BUILD.gn @@ -23,22 +23,19 @@ group("deps") { # All the rest require Rust. if (toolchain_has_rust) { deps += [ - "bindgen_test", - "test_aliased_deps", - "test_aliased_deps:test_aliased_deps_exe", - "test_bin_crate", - "test_cpp_including_rust", - "test_rlib_crate:target1", - "test_rlib_crate:target2", - "test_rlib_crate:test_rlib_crate_associated_bin", - "test_rust_calling_cpp", - "test_rust_exe", - "test_rust_metadata:test_rust_metadata_cc_exe", - "test_rust_metadata:test_rust_metadata_exe", - "test_rust_multiple_dep_versions_exe", - "test_rust_static_library", - "test_serde_json_lenient", - "test_simple_rust_exe", + "//build/rust/tests/bindgen_static_fns_test", + "//build/rust/tests/bindgen_test", + "//build/rust/tests/test_aliased_deps", + "//build/rust/tests/test_aliased_deps:test_aliased_deps_exe", + "//build/rust/tests/test_bin_crate", + "//build/rust/tests/test_rlib_crate:target1", + "//build/rust/tests/test_rlib_crate:target2", + "//build/rust/tests/test_rlib_crate:test_rlib_crate_associated_bin", + "//build/rust/tests/test_rlib_crate_testonly:testonly_target", + "//build/rust/tests/test_rust_metadata:test_rust_metadata_cc_exe", + "//build/rust/tests/test_rust_metadata:test_rust_metadata_exe", + "//build/rust/tests/test_rust_multiple_dep_versions_exe", + "//build/rust/tests/test_simple_rust_exe", # TODO(https://crbug.com/1329611): Enable the additional target below # once `rs_bindings_from_cc` is distributed via `gclient sync`. In the @@ -46,20 +43,35 @@ group("deps") { # `//build/rust/run_rs_bindings_from_cc.py`. #"test_rs_bindings_from_cc:test_rs_bindings_from_cc", ] + + if (enable_chromium_prelude) { + deps += [ "//build/rust/chromium_prelude:import_test" ] + } + if (enable_cxx) { + deps += [ + "//build/rust/tests/test_cpp_including_rust", + "//build/rust/tests/test_rust_calling_cpp", + "//build/rust/tests/test_rust_exe", + "//build/rust/tests/test_rust_static_library", + ] + } + if (build_with_chromium) { + # This tests integration with a 3p library that downstream projects + # don't need to have. + deps += [ "//build/rust/tests/test_serde_json_lenient" ] + } + if (can_build_rust_unit_tests) { deps += [ - "bindgen_test:bindgen_test_lib_unittests", - "test_aliased_deps:test_aliased_deps_unittests", - "test_cpp_including_rust:test_cpp_including_rust_unittests", - "test_rlib_crate:target1_test_rlib_crate_v0_2_unittests", - "test_rlib_crate:target2_test_rlib_crate_v0_2_unittests", - "test_rust_exe:test_rust_exe_unittests", - "test_rust_metadata:test_rust_metadata_unittests", - "test_rust_multiple_dep_versions_exe/v1:test_lib_v1_unittests", - "test_rust_multiple_dep_versions_exe/v2:test_lib_v2_unittests", - "test_rust_static_library:test_rust_static_library_unittests", - "test_rust_static_library_non_standard_arrangement:foo_tests", - "test_rust_unittests", + "//build/rust/tests/bindgen_static_fns_test:bindgen_static_fns_test_lib_unittests", + "//build/rust/tests/bindgen_test:bindgen_test_lib_unittests", + "//build/rust/tests/test_aliased_deps:test_aliased_deps_unittests", + "//build/rust/tests/test_rlib_crate:target1_test_rlib_crate_v0_2_unittests", + "//build/rust/tests/test_rlib_crate:target2_test_rlib_crate_v0_2_unittests", + "//build/rust/tests/test_rust_metadata:test_rust_metadata_unittests", + "//build/rust/tests/test_rust_multiple_dep_versions_exe/v1:test_lib_v1_unittests", + "//build/rust/tests/test_rust_multiple_dep_versions_exe/v2:test_lib_v2_unittests", + "//build/rust/tests/test_rust_static_library_non_standard_arrangement:foo_tests", # TODO(https://crbug.com/1329611): Enable the additional target below # once `rs_bindings_from_cc` is distributed via `gclient sync`. In the @@ -67,29 +79,35 @@ group("deps") { # `//build/rust/run_rs_bindings_from_cc.py`. #"test_rs_bindings_from_cc:test_rs_bindings_from_cc_unittests", ] + + if (enable_cxx) { + deps += [ + "//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_unittests", + "//build/rust/tests/test_rust_exe:test_rust_exe_unittests", + "//build/rust/tests/test_rust_static_library:test_rust_static_library_unittests", + "//build/rust/tests/test_rust_unittests", + ] + } } # Dylibs should only be built in component builds. We turn on flags which # are incompatible with shared library compilation in non-component builds # (such as code coverage https://crbug.com/1457533). - if (is_component_build) { - deps += [ "test_rust_shared_library" ] + if (is_component_build && enable_cxx) { + deps += [ "//build/rust/tests/test_rust_shared_library" ] if (can_build_rust_unit_tests) { - deps += [ - "test_cpp_including_rust:test_cpp_including_rust_dylib_unittests", - ] + deps += [ "//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_dylib_unittests" ] # TODO(crbug.com/1442273): The shared library unittest EXE ends up # requiring the DLL to run, even though it does not use the DLL. if (!is_win && !is_mac) { - deps += - [ "test_rust_shared_library:test_rust_shared_library_unittests" ] + deps += [ "//build/rust/tests/test_rust_shared_library:test_rust_shared_library_unittests" ] } } } if (is_win) { - deps += [ "test_control_flow_guard" ] + deps += [ "//build/rust/tests/test_control_flow_guard" ] } } } diff --git a/build/rust/tests/bindgen_static_fns_test/BUILD.gn b/build/rust/tests/bindgen_static_fns_test/BUILD.gn new file mode 100644 index 0000000..e2c93ca --- /dev/null +++ b/build/rust/tests/bindgen_static_fns_test/BUILD.gn @@ -0,0 +1,48 @@ +# Copyright 2024 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/rust/rust_bindgen.gni") +import("//build/rust/rust_executable.gni") +import("//build/rust/rust_static_library.gni") + +source_set("c_lib_headers") { + sources = [ "lib.h" ] +} + +component("c_lib") { + sources = [ "lib.c" ] + + deps = [ ":c_lib_headers" ] + + defines = [ "COMPONENT_IMPLEMENTATION" ] +} + +rust_bindgen("c_lib_bindgen") { + header = "lib.h" + deps = [ ":c_lib_headers" ] + wrap_static_fns = true +} + +rust_static_library("bindgen_static_fns_test_lib") { + allow_unsafe = true + deps = [ + ":c_lib", + ":c_lib_bindgen", + ":c_lib_bindgen_static_fns", + ] + sources = [ "src/lib.rs" ] + build_native_rust_unit_tests = true + crate_root = "src/lib.rs" + + bindgen_output = get_target_outputs(":c_lib_bindgen") + inputs = bindgen_output + rustenv = [ "BINDGEN_RS_FILE=" + + rebase_path(bindgen_output[0], get_path_info(crate_root, "dir")) ] +} + +rust_executable("bindgen_static_fns_test") { + deps = [ ":bindgen_static_fns_test_lib" ] + sources = [ "main.rs" ] + crate_root = "main.rs" +} diff --git a/build/rust/tests/bindgen_static_fns_test/lib.c b/build/rust/tests/bindgen_static_fns_test/lib.c new file mode 100644 index 0000000..2b9fa81 --- /dev/null +++ b/build/rust/tests/bindgen_static_fns_test/lib.c @@ -0,0 +1,11 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "build/rust/tests/bindgen_static_fns_test/lib.h" + +#include + +COMPONENT_EXPORT uint32_t mul_two_numbers(uint32_t a, uint32_t b) { + return a * b; +} diff --git a/build/rust/tests/bindgen_static_fns_test/lib.h b/build/rust/tests/bindgen_static_fns_test/lib.h new file mode 100644 index 0000000..eb070af --- /dev/null +++ b/build/rust/tests/bindgen_static_fns_test/lib.h @@ -0,0 +1,49 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BUILD_RUST_TESTS_BINDGEN_STATIC_FNS_TEST_LIB_H_ +#define BUILD_RUST_TESTS_BINDGEN_STATIC_FNS_TEST_LIB_H_ + +#include + +// The following is equivalent to //base/base_export.h. + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(COMPONENT_IMPLEMENTATION) +#define COMPONENT_EXPORT __declspec(dllexport) +#else +#define COMPONENT_EXPORT __declspec(dllimport) +#endif // defined(COMPONENT_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(COMPONENT_IMPLEMENTATION) +#define COMPONENT_EXPORT __attribute__((visibility("default"))) +#else +#define COMPONENT_EXPORT +#endif // defined(COMPONENT_IMPLEMENTATION) +#endif + +#else // defined(COMPONENT_BUILD) +#define COMPONENT_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +COMPONENT_EXPORT uint32_t mul_two_numbers(uint32_t a, uint32_t b); + +[[maybe_unused]] static inline uint32_t mul_three_numbers(uint32_t a, + uint32_t b, + uint32_t c) { + return mul_two_numbers(mul_two_numbers(a, b), c); +} + +#ifdef __cplusplus +} +#endif + +#endif // BUILD_RUST_TESTS_BINDGEN_STATIC_FNS_TEST_LIB_H_ diff --git a/build/rust/tests/bindgen_static_fns_test/main.rs b/build/rust/tests/bindgen_static_fns_test/main.rs new file mode 100644 index 0000000..3258345 --- /dev/null +++ b/build/rust/tests/bindgen_static_fns_test/main.rs @@ -0,0 +1,13 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +chromium::import! { + "//build/rust/tests/bindgen_static_fns_test:bindgen_static_fns_test_lib"; +} + +use bindgen_static_fns_test_lib::mul_three_numbers_in_c; + +fn main() { + println!("{} * {} * {} = {}", 3, 7, 11, mul_three_numbers_in_c(3, 7, 11)); +} diff --git a/build/rust/tests/bindgen_static_fns_test/src/lib.rs b/build/rust/tests/bindgen_static_fns_test/src/lib.rs new file mode 100644 index 0000000..0bb50a3 --- /dev/null +++ b/build/rust/tests/bindgen_static_fns_test/src/lib.rs @@ -0,0 +1,25 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +mod c_ffi { + #![allow(dead_code)] + #![allow(non_snake_case)] + #![allow(non_camel_case_types)] + #![allow(non_upper_case_globals)] + include!(env!("BINDGEN_RS_FILE")); +} + +pub fn mul_three_numbers_in_c(a: u32, b: u32, c: u32) -> u32 { + unsafe { c_ffi::mul_three_numbers(a, b, c) } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_mul_three_numbers() { + assert_eq!(mul_three_numbers_in_c(5, 10, 15), 750); + } +} diff --git a/build/rust/tests/bindgen_test/main.rs b/build/rust/tests/bindgen_test/main.rs index 499d93d..0e30fa6 100644 --- a/build/rust/tests/bindgen_test/main.rs +++ b/build/rust/tests/bindgen_test/main.rs @@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +chromium::import! { + "//build/rust/tests/bindgen_test:bindgen_test_lib"; +} + use bindgen_test_lib::add_two_numbers_in_c; fn main() { diff --git a/build/rust/tests/test_aliased_deps/BUILD.gn b/build/rust/tests/test_aliased_deps/BUILD.gn index 45ad73f..98deeb0 100644 --- a/build/rust/tests/test_aliased_deps/BUILD.gn +++ b/build/rust/tests/test_aliased_deps/BUILD.gn @@ -17,14 +17,15 @@ rust_static_library("test_aliased_deps") { sources = [ crate_root ] deps = [ ":real_name" ] aliased_deps = { - # Unfortunately we have to know the `__rlib` suffix which is attached to the - # actual rlib in `rust_static_library()`. - other_name = ":real_name__rlib" + other_name = ":real_name" } build_native_rust_unit_tests = true } rust_static_library("real_name") { + # Using a fixed crate_name here which does not work with `import!` because + # we're testing `aliased_deps` which also does not work with `import!`. + crate_name = "real_name" crate_root = "real_name.rs" sources = [ crate_root ] } diff --git a/build/rust/tests/test_aliased_deps/main.rs b/build/rust/tests/test_aliased_deps/main.rs index 8f33abe..2d66598 100644 --- a/build/rust/tests/test_aliased_deps/main.rs +++ b/build/rust/tests/test_aliased_deps/main.rs @@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +chromium::import! { + "//build/rust/tests/test_aliased_deps"; +} + fn main() { test_aliased_deps::other_name::hello_world(); } diff --git a/build/rust/tests/test_control_flow_guard/BUILD.gn b/build/rust/tests/test_control_flow_guard/BUILD.gn index 202c5b0..3340121 100644 --- a/build/rust/tests/test_control_flow_guard/BUILD.gn +++ b/build/rust/tests/test_control_flow_guard/BUILD.gn @@ -8,7 +8,4 @@ rust_executable("test_control_flow_guard") { allow_unsafe = true crate_root = "test_control_flow_guard.rs" sources = [ crate_root ] - - # Used as a data dep by base_unittests. - is_data_dep = true } diff --git a/build/rust/tests/test_cpp_including_rust/shared_unittests.cc b/build/rust/tests/test_cpp_including_rust/shared_unittests.cc index b207196..eb86c92 100644 --- a/build/rust/tests/test_cpp_including_rust/shared_unittests.cc +++ b/build/rust/tests/test_cpp_including_rust/shared_unittests.cc @@ -7,8 +7,8 @@ #include #include "base/allocator/buildflags.h" -#include "base/allocator/partition_allocator/address_pool_manager_bitmap.h" -#include "base/allocator/partition_allocator/partition_address_space.h" +#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h" +#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h" #include "build/build_config.h" #include "build/buildflag.h" #include "testing/gtest/include/gtest/gtest.h" @@ -29,3 +29,7 @@ TEST(RustSharedTest, RustComponentUsesPartitionAlloc) { reinterpret_cast(cpp_allocated_int.get()))); rust::Box::from_raw(rust_allocated_ptr); } + +TEST(RustSharedTest, AllocAligned) { + alloc_aligned(); +} diff --git a/build/rust/tests/test_cpp_including_rust/static_unittests.cc b/build/rust/tests/test_cpp_including_rust/static_unittests.cc index 77efd8d..b83e7e5 100644 --- a/build/rust/tests/test_cpp_including_rust/static_unittests.cc +++ b/build/rust/tests/test_cpp_including_rust/static_unittests.cc @@ -7,8 +7,8 @@ #include #include "base/allocator/buildflags.h" -#include "base/allocator/partition_allocator/address_pool_manager_bitmap.h" -#include "base/allocator/partition_allocator/partition_address_space.h" +#include "base/allocator/partition_allocator/src/partition_alloc/address_pool_manager_bitmap.h" +#include "base/allocator/partition_allocator/src/partition_alloc/partition_address_space.h" #include "build/build_config.h" #include "build/buildflag.h" #include "testing/gtest/include/gtest/gtest.h" @@ -29,3 +29,7 @@ TEST(RustStaticTest, RustComponentUsesPartitionAlloc) { reinterpret_cast(cpp_allocated_int.get()))); rust::Box::from_raw(rust_allocated_ptr); } + +TEST(RustStaticTest, AllocAligned) { + alloc_aligned(); +} diff --git a/build/rust/tests/test_rlib_crate/crate/build.rs b/build/rust/tests/test_rlib_crate/crate/build.rs index 037e263..95340e3 100644 --- a/build/rust/tests/test_rlib_crate/crate/build.rs +++ b/build/rust/tests/test_rlib_crate/crate/build.rs @@ -40,7 +40,14 @@ fn main() { } // Some tests as to whether we're properly emulating various cargo features. - assert!(Path::new(&env::var_os("CARGO_MANIFEST_DIR").unwrap()).join("build.rs").exists()); + let cargo_manifest_dir = &env::var_os("CARGO_MANIFEST_DIR").unwrap(); + let manifest_dir_path = Path::new(cargo_manifest_dir); + assert!( + !manifest_dir_path.is_absolute(), + "CARGO_MANIFEST_DIR={} should be relative path for build cache sharing.", + manifest_dir_path.display() + ); + assert!(manifest_dir_path.join("build.rs").exists()); assert!(Path::new("build.rs").exists()); assert!(Path::new(&env::var_os("OUT_DIR").unwrap()).exists()); // Confirm the following env var is set, but do not attempt to validate content diff --git a/build/rust/tests/test_rlib_crate_testonly/BUILD.gn b/build/rust/tests/test_rlib_crate_testonly/BUILD.gn new file mode 100644 index 0000000..d246702 --- /dev/null +++ b/build/rust/tests/test_rlib_crate_testonly/BUILD.gn @@ -0,0 +1,22 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/rust/cargo_crate.gni") + +cargo_crate("testonly_target") { + testonly = true + crate_root = "crate/src/main.rs" + crate_type = "bin" + sources = [ "crate/src/main.rs" ] + build_sources = [ "crate/build.rs" ] + build_root = "crate/build.rs" + build_deps = [ ":testonly_build_dep" ] +} + +cargo_crate("testonly_build_dep") { + testonly = true + crate_name = "test_only_build_dep" + crate_root = "crate/src/lib.rs" + sources = [ "crate/src/lib.rs" ] +} diff --git a/build/rust/tests/test_rlib_crate_testonly/crate/build.rs b/build/rust/tests/test_rlib_crate_testonly/crate/build.rs new file mode 100644 index 0000000..6d03310 --- /dev/null +++ b/build/rust/tests/test_rlib_crate_testonly/crate/build.rs @@ -0,0 +1,5 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +fn main() {} diff --git a/build/rust/tests/test_rlib_crate_testonly/crate/src/lib.rs b/build/rust/tests/test_rlib_crate_testonly/crate/src/lib.rs new file mode 100644 index 0000000..2c54a52 --- /dev/null +++ b/build/rust/tests/test_rlib_crate_testonly/crate/src/lib.rs @@ -0,0 +1,3 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. diff --git a/build/rust/tests/test_rlib_crate_testonly/crate/src/main.rs b/build/rust/tests/test_rlib_crate_testonly/crate/src/main.rs new file mode 100644 index 0000000..9d78366 --- /dev/null +++ b/build/rust/tests/test_rlib_crate_testonly/crate/src/main.rs @@ -0,0 +1,5 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +pub fn main() {} diff --git a/build/rust/tests/test_rust_calling_cpp/rust_calling_cpp_rlib.rs b/build/rust/tests/test_rust_calling_cpp/rust_calling_cpp_rlib.rs index 9a3bd17..54557e4 100644 --- a/build/rust/tests/test_rust_calling_cpp/rust_calling_cpp_rlib.rs +++ b/build/rust/tests/test_rust_calling_cpp/rust_calling_cpp_rlib.rs @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#[allow(unsafe_op_in_unsafe_fn)] #[cxx::bridge] mod ffi { extern "Rust" { diff --git a/build/rust/tests/test_rust_exe/BUILD.gn b/build/rust/tests/test_rust_exe/BUILD.gn index 493854a..cd8f4a5 100644 --- a/build/rust/tests/test_rust_exe/BUILD.gn +++ b/build/rust/tests/test_rust_exe/BUILD.gn @@ -11,7 +11,7 @@ rust_executable("test_rust_exe") { "//build/rust/tests/test_proc_macro_crate", "//build/rust/tests/test_rlib_crate:target1", "//build/rust/tests/test_rust_static_library", - "//build/rust/tests/test_rust_static_library_non_standard_arrangement", + "//build/rust/tests/test_rust_static_library_non_standard_arrangement:lib", ] build_native_rust_unit_tests = true } diff --git a/build/rust/tests/test_rust_exe/main.rs b/build/rust/tests/test_rust_exe/main.rs index 0409901..ed6cd07 100644 --- a/build/rust/tests/test_rust_exe/main.rs +++ b/build/rust/tests/test_rust_exe/main.rs @@ -2,6 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +chromium::import! { + "//build/rust/tests/test_rust_static_library"; + "//build/rust/tests/test_rust_static_library_non_standard_arrangement:lib" as + test_rust_static_library_non_standard_arrangement; +} + +// To mimic third-party, test_rlib_crate has a short crate_name which we do not +// need to import!. use test_rlib_crate::say_hello_from_crate; fn main() { diff --git a/build/rust/tests/test_rust_metadata/BUILD.gn b/build/rust/tests/test_rust_metadata/BUILD.gn index 95171aa..2491879 100644 --- a/build/rust/tests/test_rust_metadata/BUILD.gn +++ b/build/rust/tests/test_rust_metadata/BUILD.gn @@ -3,14 +3,14 @@ # found in the LICENSE file. import("//build/config/rust.gni") +import("//build/rust/cargo_crate.gni") import("//build/rust/rust_executable.gni") import("//build/rust/rust_static_library.gni") import("//build/rust/rust_unit_test.gni") # This target depends on two variants of the same crate: one directly, and one # transitively. With correct metadata handling, this will work. -rust_static_library("test_rust_metadata_lib") { - crate_name = "lib" +rust_static_library("lib") { crate_root = "lib.rs" sources = [ "lib.rs" ] deps = [ @@ -36,24 +36,24 @@ if (can_build_rust_unit_tests) { rust_unit_test("test_rust_metadata_unittests") { crate_root = "tests.rs" sources = [ "tests.rs" ] - deps = [ ":test_rust_metadata_lib" ] + deps = [ ":lib" ] } } rust_executable("test_rust_metadata_exe") { crate_root = "main.rs" sources = [ "main.rs" ] - deps = [ ":test_rust_metadata_lib" ] + deps = [ ":lib" ] } # Check that the metadata handling works when linking into a C++ binary too. executable("test_rust_metadata_cc_exe") { sources = [ "main.cc" ] - deps = [ ":test_rust_metadata_lib" ] + deps = [ ":lib" ] } # A source file whose behavior depends on cfg options. -rust_static_library("transitive_dep_1") { +cargo_crate("transitive_dep_1") { crate_name = "transitive_dep" crate_root = "transitive_dep.rs" sources = [ "transitive_dep.rs" ] @@ -63,7 +63,7 @@ rust_static_library("transitive_dep_1") { # Build the same source again, but with a feature enabled. The metadata should # disambiguate the symbols when linking. -rust_static_library("transitive_dep_2") { +cargo_crate("transitive_dep_2") { crate_name = "transitive_dep" crate_root = "transitive_dep.rs" sources = [ "transitive_dep.rs" ] diff --git a/build/rust/tests/test_rust_metadata/lib.rs b/build/rust/tests/test_rust_metadata/lib.rs index 4081c4d..bfe2e1b 100644 --- a/build/rust/tests/test_rust_metadata/lib.rs +++ b/build/rust/tests/test_rust_metadata/lib.rs @@ -11,6 +11,10 @@ // what, rustc will see the conflict. extern crate transitive_dep; +chromium::import! { + "//build/rust/tests/test_rust_metadata:foo_dependency"; +} + pub use foo_dependency::say_foo; pub use foo_dependency::say_foo_directly; pub use transitive_dep::say_something; diff --git a/build/rust/tests/test_rust_metadata/main.rs b/build/rust/tests/test_rust_metadata/main.rs index a0d3866..451910f 100644 --- a/build/rust/tests/test_rust_metadata/main.rs +++ b/build/rust/tests/test_rust_metadata/main.rs @@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +chromium::import! { + "//build/rust/tests/test_rust_metadata:lib"; +} + fn main() { lib::print_foo_bar(); println!("{} from re-exported function", lib::say_foo_directly()); diff --git a/build/rust/tests/test_rust_metadata/tests.rs b/build/rust/tests/test_rust_metadata/tests.rs index 2652ce0..4dd9199 100644 --- a/build/rust/tests/test_rust_metadata/tests.rs +++ b/build/rust/tests/test_rust_metadata/tests.rs @@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +chromium::import! { + "//build/rust/tests/test_rust_metadata:lib"; +} + #[test] fn test_expected_outputs() { assert_eq!(lib::say_foo(), "foo"); diff --git a/build/rust/tests/test_rust_multiple_dep_versions_exe/BUILD.gn b/build/rust/tests/test_rust_multiple_dep_versions_exe/BUILD.gn index c4d4785..4ebccae 100644 --- a/build/rust/tests/test_rust_multiple_dep_versions_exe/BUILD.gn +++ b/build/rust/tests/test_rust_multiple_dep_versions_exe/BUILD.gn @@ -5,7 +5,7 @@ import("//build/rust/rust_executable.gni") import("//build/rust/rust_static_library.gni") -# The exe depends on lib v1.But it also transitively depends on lib v2. +# The exe depends on lib v1. But it also transitively depends on lib v2. # The code in the exe should use v1, and the code in the transitive lib should # use v2. rust_executable("test_rust_multiple_dep_versions_exe") { diff --git a/build/rust/tests/test_rust_multiple_dep_versions_exe/main.rs b/build/rust/tests/test_rust_multiple_dep_versions_exe/main.rs index e5471db..fdf730d 100644 --- a/build/rust/tests/test_rust_multiple_dep_versions_exe/main.rs +++ b/build/rust/tests/test_rust_multiple_dep_versions_exe/main.rs @@ -2,6 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +chromium::import! { + "//build/rust/tests/test_rust_multiple_dep_versions_exe:transitive_v2"; +} + +// To mimic third-party, the `test_lib` crate has a short name which does not +// need to be import!ed. + fn main() { test_lib::say_hello_from_v1(); transitive_v2::transitively_say_hello(); diff --git a/build/rust/tests/test_rust_multiple_dep_versions_exe/transitive_lib.rs b/build/rust/tests/test_rust_multiple_dep_versions_exe/transitive_lib.rs index 51806d7..30d9c89 100644 --- a/build/rust/tests/test_rust_multiple_dep_versions_exe/transitive_lib.rs +++ b/build/rust/tests/test_rust_multiple_dep_versions_exe/transitive_lib.rs @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// To mimic third-party, the `test_lib` crate has a short name which does not +// need to be import!ed. + pub fn transitively_say_hello() { test_lib::say_hello_from_v2(); } diff --git a/build/rust/tests/test_rust_multiple_dep_versions_exe/v1/BUILD.gn b/build/rust/tests/test_rust_multiple_dep_versions_exe/v1/BUILD.gn index 0704a16..5532b77 100644 --- a/build/rust/tests/test_rust_multiple_dep_versions_exe/v1/BUILD.gn +++ b/build/rust/tests/test_rust_multiple_dep_versions_exe/v1/BUILD.gn @@ -5,6 +5,8 @@ import("//build/rust/cargo_crate.gni") cargo_crate("test_lib") { + crate_name = "test_lib" + # This crate has the same name as v2/test_lib, but a different epoch. The GN # target for the unit tests should not collide. epoch = "1" diff --git a/build/rust/tests/test_rust_multiple_dep_versions_exe/v2/BUILD.gn b/build/rust/tests/test_rust_multiple_dep_versions_exe/v2/BUILD.gn index 3fada7b..bda02c5 100644 --- a/build/rust/tests/test_rust_multiple_dep_versions_exe/v2/BUILD.gn +++ b/build/rust/tests/test_rust_multiple_dep_versions_exe/v2/BUILD.gn @@ -5,6 +5,8 @@ import("//build/rust/cargo_crate.gni") cargo_crate("test_lib") { + crate_name = "test_lib" + # This crate has the same name as v1/test_lib, but a different epoch. The GN # target for the unit tests should not collide. epoch = "2" diff --git a/build/rust/tests/test_rust_shared_library/src/lib.rs b/build/rust/tests/test_rust_shared_library/src/lib.rs index 2fa77c3..c2440b9 100644 --- a/build/rust/tests/test_rust_shared_library/src/lib.rs +++ b/build/rust/tests/test_rust_shared_library/src/lib.rs @@ -2,10 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Requires this allow since cxx generates unsafe code. -// -// TODO(crbug.com/1422745): patch upstream cxx to generate compatible code. -#[allow(unsafe_op_in_unsafe_fn)] +use std::alloc::{alloc, dealloc, Layout}; + #[cxx::bridge] mod ffi { pub struct SomeStruct { @@ -13,6 +11,7 @@ mod ffi { } extern "Rust" { fn say_hello(); + fn alloc_aligned(); fn allocate_via_rust() -> Box; fn add_two_ints_via_rust(x: i32, y: i32) -> i32; } @@ -25,6 +24,13 @@ pub fn say_hello() { ); } +pub fn alloc_aligned() { + let layout = unsafe { Layout::from_size_align_unchecked(1024, 512) }; + let ptr = unsafe { alloc(layout) }; + println!("Alloc aligned ptr: {:p}", ptr); + unsafe { dealloc(ptr, layout) }; +} + #[test] fn test_hello() { assert_eq!(7, add_two_ints_via_rust(3, 4)); diff --git a/build/rust/tests/test_rust_static_library/src/lib.rs b/build/rust/tests/test_rust_static_library/src/lib.rs index 1fcabe3..a5a1e90 100644 --- a/build/rust/tests/test_rust_static_library/src/lib.rs +++ b/build/rust/tests/test_rust_static_library/src/lib.rs @@ -2,10 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Requires this allow since cxx generates unsafe code. -// -// TODO(crbug.com/1422745): patch upstream cxx to generate compatible code. -#[allow(unsafe_op_in_unsafe_fn)] +use std::alloc::{alloc, dealloc, Layout}; + #[cxx::bridge] mod ffi { pub struct SomeStruct { @@ -13,6 +11,7 @@ mod ffi { } extern "Rust" { fn say_hello(); + fn alloc_aligned(); fn allocate_via_rust() -> Box; fn add_two_ints_via_rust(x: i32, y: i32) -> i32; } @@ -25,6 +24,13 @@ pub fn say_hello() { ); } +pub fn alloc_aligned() { + let layout = unsafe { Layout::from_size_align_unchecked(1024, 512) }; + let ptr = unsafe { alloc(layout) }; + println!("Alloc aligned ptr: {:p}", ptr); + unsafe { dealloc(ptr, layout) }; +} + #[test] fn test_hello() { assert_eq!(7, add_two_ints_via_rust(3, 4)); diff --git a/build/rust/tests/test_rust_static_library_non_standard_arrangement/BUILD.gn b/build/rust/tests/test_rust_static_library_non_standard_arrangement/BUILD.gn index 6a85557..8f1a6c0 100644 --- a/build/rust/tests/test_rust_static_library_non_standard_arrangement/BUILD.gn +++ b/build/rust/tests/test_rust_static_library_non_standard_arrangement/BUILD.gn @@ -4,7 +4,7 @@ import("//build/rust/rust_static_library.gni") -rust_static_library("test_rust_static_library_non_standard_arrangement") { +rust_static_library("lib") { sources = [ "foo.rs" ] crate_root = "foo.rs" unit_test_target = "foo_tests" diff --git a/build/rust/tests/test_rust_unittests/main.rs b/build/rust/tests/test_rust_unittests/main.rs index a10b006..43ca4f2 100644 --- a/build/rust/tests/test_rust_unittests/main.rs +++ b/build/rust/tests/test_rust_unittests/main.rs @@ -5,6 +5,10 @@ #![feature(test)] extern crate test; +chromium::import! { + "//build/rust/tests/test_rust_static_library"; +} + use test::Bencher; use test_rust_static_library::add_two_ints_via_rust; diff --git a/build/rust/tests/test_simple_rust_exe/BUILD.gn b/build/rust/tests/test_simple_rust_exe/BUILD.gn index 9f6ee20..9d4dcf7 100644 --- a/build/rust/tests/test_simple_rust_exe/BUILD.gn +++ b/build/rust/tests/test_simple_rust_exe/BUILD.gn @@ -9,5 +9,5 @@ executable("test_simple_rust_exe") { crate_root = "main.rs" sources = [ crate_root ] - deps = [ "//build/rust/std:stdlib_for_rustc" ] + deps = [ "//build/rust/std" ] } diff --git a/build/sanitizers/asan_suppressions.cc b/build/sanitizers/asan_suppressions.cc index 32027dd..314fc24 100644 --- a/build/sanitizers/asan_suppressions.cc +++ b/build/sanitizers/asan_suppressions.cc @@ -18,7 +18,10 @@ char kASanDefaultSuppressions[] = // https://crbug.com/1471542 false positive odr violations from Rust code. "odr_violation:^core::\n" "odr_violation:^object::\n" + "odr_violation:^std::io::\n" "odr_violation:^std::panicking::\n" + "odr_violation:^read_fonts::tables::\n" + "odr_violation:^std_detect::detect::cache::\n" // End of suppressions. // PLEASE READ ABOVE BEFORE ADDING NEW SUPPRESSIONS. diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc index d90546e..2f3b382 100644 --- a/build/sanitizers/tsan_suppressions.cc +++ b/build/sanitizers/tsan_suppressions.cc @@ -16,7 +16,8 @@ // for the instructions on writing suppressions. char kTSanDefaultSuppressions[] = // False positives in libdbus.so, libdconfsettings.so, libflashplayer.so, - // libgio.so, libglib.so, libgobject.so, and libfontconfig.so.1. + // libgio.so, libglib.so, libgobject.so, libfontconfig.so.1 and + // swrast_dri.so. // Since we don't instrument them, we cannot reason about the // synchronization in them. "race:libdbus*.so\n" @@ -26,6 +27,7 @@ char kTSanDefaultSuppressions[] = "race:libglib*.so\n" "race:libgobject*.so\n" "race:libfontconfig.so.1\n" + "race:swrast_dri.so\n" // Intentional race in ToolsSanityTest.DataRace in base_unittests. "race:base/tools_sanity_unittest.cc\n" @@ -90,6 +92,11 @@ char kTSanDefaultSuppressions[] = // single global mutex. "deadlock:GlobalSafepoint::EnterGlobalSafepointScope\n" + // Logging crash keys is inherently unsafe. We suppress this rather than fix + // it because OutputCrashKeysToStream is only enabled in non-official builds + // and the race is therefore not present in released builds. + "race:crash_reporter::*::OutputCrashKeysToStream\n" + // End of suppressions. ; // Please keep this semicolon. diff --git a/build/skia_gold_common/skia_gold_session.py b/build/skia_gold_common/skia_gold_session.py index ff4ff2e..1b39eae 100644 --- a/build/skia_gold_common/skia_gold_session.py +++ b/build/skia_gold_common/skia_gold_session.py @@ -144,21 +144,33 @@ def RunComparison(self, SkiaGoldSession.StatusCodes signifying the result of the comparison. |error| is an error message describing the status if not successful. """ + # TODO(b/295350872): Remove this and other timestamp logging in this code + # once the source of flaky slowness is tracked down. + logging.info('Starting Gold auth') + start_time = time.time() auth_rc, auth_stdout = self.Authenticate(use_luci=use_luci, service_account=service_account) + logging.info('Gold auth took %fs', time.time() - start_time) if auth_rc: return self.StatusCodes.AUTH_FAILURE, auth_stdout + logging.info('Starting Gold initialization') + start_time = time.time() init_rc, init_stdout = self.Initialize() + logging.info('Gold initialization took %fs', time.time() - start_time) if init_rc: return self.StatusCodes.INIT_FAILURE, init_stdout + logging.info('Starting Gold comparison in shared code') + start_time = time.time() compare_rc, compare_stdout = self.Compare( name=name, png_file=png_file, inexact_matching_args=inexact_matching_args, optional_keys=optional_keys, force_dryrun=force_dryrun) + logging.info('Gold comparison in shared code took %fs', + time.time() - start_time) if not compare_rc: return self.StatusCodes.SUCCESS, None @@ -334,8 +346,15 @@ def Compare(self, '%s:%s' % (k, v), ]) + logging.info('Starting Gold triage link file clear') + start_time = time.time() self._ClearTriageLinkFile() + logging.info('Gold triage link file clear took %fs', + time.time() - start_time) + logging.info('Starting Gold comparison command') + start_time = time.time() rc, stdout = self._RunCmdForRcAndOutput(compare_cmd) + logging.info('Gold comparison command took %fs', time.time() - start_time) self._comparison_results[name] = self.ComparisonResults() if rc == 0: @@ -352,8 +371,11 @@ def Compare(self, self._GeneratePublicTriageLink(cl_triage_link) else: try: + logging.info('Starting triage link file read') + start_time = time.time() with open(self._triage_link_file) as tlf: triage_link = tlf.read().strip() + logging.info('Triage link file read took %fs', time.time() - start_time) if not triage_link: self._comparison_results[name].triage_link_omission_reason = ( 'Gold did not provide a triage link. This is likely a bug on ' diff --git a/build/toolchain/android/BUILD.gn b/build/toolchain/android/BUILD.gn index cf347f4..6a0c23a 100644 --- a/build/toolchain/android/BUILD.gn +++ b/build/toolchain/android/BUILD.gn @@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/android/config.gni") +import("//build/config/chrome_build.gni") import("//build/config/clang/clang.gni") import("//build/config/compiler/compiler.gni") import("//build/config/ozone.gni") @@ -24,6 +25,7 @@ template("android_clang_toolchain") { forward_variables_from(invoker.toolchain_args, "*") current_os = "android" use_debug_fission = false + is_high_end_android = is_high_end_android_secondary_toolchain } # Output linker map files for binary size analysis. @@ -135,4 +137,8 @@ clang_toolchain("robolectric_$host_cpu") { current_cpu = host_cpu is_robolectric = true } + + # TODO(crbug.com/1487407): Figure out why robolectric tests fail with component builds. + toolchain_args.is_component_build = false + shlib_extension = ".so" } diff --git a/build/toolchain/apple/toolchain.gni b/build/toolchain/apple/toolchain.gni index bdc8eda..18566a3 100644 --- a/build/toolchain/apple/toolchain.gni +++ b/build/toolchain/apple/toolchain.gni @@ -286,7 +286,11 @@ template("single_apple_toolchain") { default_output_extension = ".a" output_prefix = "lib" - default_output_dir = "{{root_out_dir}}" + + # Static libraries go in the target out directory by default so we can + # generate different targets with the same name and not have them + # collide. + default_output_dir = "{{target_out_dir}}" description = "RUST(STATICLIB) {{output}}" outputs = [ libname ] @@ -311,7 +315,11 @@ template("single_apple_toolchain") { # This is prefixed unconditionally in `rlibname`. # output_prefix = "lib" - default_output_dir = "{{root_out_dir}}" + + # Static libraries go in the target out directory by default so we can + # generate different targets with the same name and not have them + # collide. + default_output_dir = "{{target_out_dir}}" description = "RUST {{output}}" outputs = [ rlibname ] @@ -771,6 +779,7 @@ template("single_apple_toolchain") { "-depfile {{target_out_dir}}/{{module_name}}.d " + "-bridge-header {{bridge_header}} $_extra_flags " + "{{swiftflags}} {{include_dirs}} {{module_dirs}} {{inputs}}" + description = "SWIFT {{output}}" } } @@ -856,6 +865,7 @@ template("apple_toolchain") { use_clang_coverage = false use_sanitizer_coverage = false generate_linker_map = false + use_thin_lto = false } } } diff --git a/build/toolchain/check_rewrapper_cfg.py b/build/toolchain/check_rewrapper_cfg.py new file mode 100755 index 0000000..f58f958 --- /dev/null +++ b/build/toolchain/check_rewrapper_cfg.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import sys + + +def missing_cfg_error_message(): + """This assumes that corp machine has gcert binary in known location.""" + import shutil + if shutil.which("gcert") is not None: + return """ +To build with gn arg 'use_remoteexec=true' as a googler on a corp machine +set "download_remoteexec_cfg" in .gclient like + +solutions = [ + { + "name" : "src", + # ... + "custom_vars" : { + "download_remoteexec_cfg": True, + }, + }, +] + +and re-run `gclient sync`. + +See http://go/chrome-linux-build#setup-remote-execution +for more details.""" + elif sys.platform == 'linux': + return """ +To build with gn arg 'use_remoteexec=true' as a googler on a non corp machine +see http://go/chrome-linux-build#setup-remote-execution for setup instructions. + +To build with gn arg 'use_remoteexec=true' as a non-googler set the appropriate +`rbe_cfg_dir` value in args.gn. +See +https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md#use-reclient +for more details.""" + else: + return """ +To build with gn arg 'use_remoteexec=true' as a googler on a non corp machine +see http://go/chrome-linux-build#setup-remote-execution for setup instructions. + +Building with gn arg 'use_remoteexec=true' as a non-googler is not currently +supported on your os (%s). +""" % sys.platform + + +def main(): + if len(sys.argv) != 2: + print("This should have a path to reclient config file in its args.", + file=sys.stderr) + return 1 + + # Check path to rbe_cc_cfg_file. + if os.path.isfile(sys.argv[1]): + return 0 + + print("reclient config file '%s' doesn't exist" % + (os.path.abspath(sys.argv[1])), + file=sys.stderr) + print(missing_cfg_error_message(), file=sys.stderr) + + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/build/toolchain/clang_code_coverage_wrapper.py b/build/toolchain/clang_code_coverage_wrapper.py index 5490582..28b9539 100755 --- a/build/toolchain/clang_code_coverage_wrapper.py +++ b/build/toolchain/clang_code_coverage_wrapper.py @@ -63,6 +63,8 @@ _COVERAGE_FLAGS = [ '-fprofile-instr-generate', '-fcoverage-mapping', + '-mllvm', + '-runtime-counter-relocation=true', # Following experimental flags remove unused header functions from the # coverage mapping data embedded in the test binaries, and the reduction # of binary size enables building Chrome's large unit test targets on @@ -85,7 +87,7 @@ 'fuchsia': [ # TODO(crbug.com/1174725): These files caused clang to crash while # compiling them. - '../../base/allocator/partition_allocator/pcscan.cc', + '../../base/allocator/partition_allocator/src/partition_alloc/pcscan.cc', '../../third_party/skia/src/core/SkOpts.cpp', '../../third_party/skia/src/opts/SkOpts_hsw.cpp', '../../third_party/skia/third_party/skcms/skcms.cc', diff --git a/build/toolchain/concurrent_links.gni b/build/toolchain/concurrent_links.gni index e359022..c3275b4 100644 --- a/build/toolchain/concurrent_links.gni +++ b/build/toolchain/concurrent_links.gni @@ -82,6 +82,13 @@ if (concurrent_links == -1) { # could be optimized (maybe to 12GB or for different configs like # component build). _args = [ "--mem_per_link_gb=16" ] + } else if (is_chromeos && is_msan) { + # crbug.com/1505350 - CrOS MSan builder consumes more memory and crushes. + # Max 25.2GB, Avg: 9.4GB, Median: 7.9GB + _args = [ "--mem_per_link_gb=12" ] + } else if (is_chromeos && is_debug) { + # b/315102033, b/312072730: Large links use 9GB-13.5GB. + _args = [ "--mem_per_link_gb=10" ] } else { _args = [] } diff --git a/build/toolchain/cros/BUILD.gn b/build/toolchain/cros/BUILD.gn index 12b82ee..17ed380 100644 --- a/build/toolchain/cros/BUILD.gn +++ b/build/toolchain/cros/BUILD.gn @@ -4,15 +4,10 @@ import("//build/config/compiler/compiler.gni") import("//build/config/sysroot.gni") +import("//build/toolchain/cros/cros_config.gni") import("//build/toolchain/cros_toolchain.gni") import("//build/toolchain/gcc_toolchain.gni") -declare_args() { - # If set, build lacros with Chromium's toolchain instead of with Chrome OS's. - # TODO(thakis): Set this to `= chromeos_is_browser_only` once that works. - lacros_use_chromium_toolchain = false -} - # This is mostly identical to gcc_toolchain, but handles relativizing toolchain # paths. This is needed for CrOS since these paths often change based on the # environment. For example, cxx is a relative path picked up on $PATH in the @@ -33,10 +28,10 @@ template("cros_toolchain") { # it the gomacc path via cmd-line arg. Otherwise, for both CrOS's host # wrapper (used in the ebuild) and Chrome's clang (used in Simple Chrome), # prepend gomacc like normal. - if (use_goma && toolchain_args.needs_gomacc_path_arg) { + if (use_goma && invoker.needs_gomacc_path_arg) { extra_cppflags += " --gomacc-path $goma_dir/gomacc" } - if (use_remoteexec && toolchain_args.needs_gomacc_path_arg) { + if (use_remoteexec && invoker.needs_gomacc_path_arg) { extra_cppflags += "--rewrapper-path $rbe_cros_cc_wrapper --rewrapper-cfg ${rbe_cc_cfg_file}" } @@ -87,7 +82,7 @@ cros_toolchain("target") { extra_cxxflags = cros_target_extra_cxxflags extra_ldflags = cros_target_extra_ldflags - toolchain_args.needs_gomacc_path_arg = true + needs_gomacc_path_arg = true } } @@ -125,7 +120,7 @@ cros_toolchain("nacl_bootstrap") { extra_cxxflags = cros_nacl_bootstrap_extra_cxxflags extra_ldflags = cros_nacl_bootstrap_extra_ldflags - toolchain_args.needs_gomacc_path_arg = true + needs_gomacc_path_arg = true } # We build for ARM32, even when the rest of the build targets ARM64. @@ -171,7 +166,7 @@ cros_toolchain("nacl_helper_arm32") { extra_ldflags = "" if (!lacros_use_chromium_toolchain) { - toolchain_args.needs_gomacc_path_arg = true + needs_gomacc_path_arg = true } } @@ -200,7 +195,7 @@ cros_toolchain("host") { extra_cxxflags = cros_host_extra_cxxflags extra_ldflags = cros_host_extra_ldflags - toolchain_args.needs_gomacc_path_arg = false + needs_gomacc_path_arg = false } } @@ -234,7 +229,7 @@ cros_toolchain("v8_snapshot") { extra_cxxflags = cros_v8_snapshot_extra_cxxflags extra_ldflags = cros_v8_snapshot_extra_ldflags - toolchain_args.needs_gomacc_path_arg = false + needs_gomacc_path_arg = false } } @@ -251,6 +246,10 @@ if (also_build_lacros_chrome_for_architecture != "") { lacros_args = read_file("//build/args/chromeos/arm-generic-crostoolchain.gni", "scope") + } else if (also_build_lacros_chrome_for_architecture == "arm64") { + lacros_args = + read_file("//build/args/chromeos/arm64-generic-crostoolchain.gni", + "scope") } else { assert(false, "also_build_lacros_chrome_for_architecture is not " + @@ -306,7 +305,7 @@ if (also_build_lacros_chrome_for_architecture != "") { extra_cxxflags = lacros_args.cros_target_extra_cxxflags extra_ldflags = lacros_args.cros_target_extra_ldflags - toolchain_args.needs_gomacc_path_arg = true + needs_gomacc_path_arg = true } } } diff --git a/build/toolchain/cros/cros_config.gni b/build/toolchain/cros/cros_config.gni new file mode 100644 index 0000000..c379207 --- /dev/null +++ b/build/toolchain/cros/cros_config.gni @@ -0,0 +1,9 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +declare_args() { + # If set, build lacros with Chromium's toolchain instead of with Chrome OS's. + # TODO(thakis): Set this to `= chromeos_is_browser_only` once that works. + lacros_use_chromium_toolchain = false +} diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni index 20c1066..94592ec 100644 --- a/build/toolchain/gcc_toolchain.gni +++ b/build/toolchain/gcc_toolchain.gni @@ -7,6 +7,7 @@ import("//build/config/compiler/compiler.gni") import("//build/config/coverage/coverage.gni") import("//build/config/rust.gni") import("//build/config/sanitizers/sanitizers.gni") +import("//build/config/sysroot.gni") import("//build/config/v8_target_cpu.gni") import("//build/toolchain/cc_wrapper.gni") import("//build/toolchain/goma.gni") @@ -30,8 +31,11 @@ declare_args() { (target_os == "android" || target_os == "win") # Use -MD instead of -MMD for compiler commands. This is useful for tracking - # the comprehensive set of dependencies. - system_headers_in_deps = false + # the comprehensive set of dependencies. It's also required when building + # without the sysroot so that updates to system header files trigger a + # rebuild (when using the sysroot, the CR_SYSROOT_KEY define takes care of + # this already). + system_headers_in_deps = !use_sysroot } # When the arg is set via args.gn, it applies to all toolchains. In order to not @@ -201,9 +205,8 @@ template("single_gcc_toolchain") { # wrapper will have picked up gomacc via cmd-line arg. So need to prepend # gomacc in that case. goma_path = "$goma_dir/gomacc" - if (toolchain_uses_remoteexec && - (!defined(invoker_toolchain_args.needs_gomacc_path_arg) || - !invoker_toolchain_args.needs_gomacc_path_arg)) { + if (toolchain_uses_remoteexec && (!defined(invoker.needs_gomacc_path_arg) || + !invoker.needs_gomacc_path_arg)) { if (defined(toolchain_args.rbe_cc_cfg_file)) { toolchain_rbe_cc_cfg_file = toolchain_args.rbe_cc_cfg_file } else { @@ -213,14 +216,18 @@ template("single_gcc_toolchain") { # C/C++ (clang) rewrapper prefix to use when use_remoteexec is true. compiler_prefix = "${rbe_bin_dir}/rewrapper -cfg=${toolchain_rbe_cc_cfg_file} -exec_root=${rbe_exec_root} " } else if (toolchain_uses_goma && - (!defined(invoker_toolchain_args.needs_gomacc_path_arg) || - !invoker_toolchain_args.needs_gomacc_path_arg)) { + (!defined(invoker.needs_gomacc_path_arg) || + !invoker.needs_gomacc_path_arg)) { compiler_prefix = "${goma_path} " if (use_goma_rust) { rust_compiler_prefix = compiler_prefix } } else { compiler_prefix = "${toolchain_cc_wrapper} " + + # Prevent warning about unused variable since it is not read in the code + # paths when goma is not needed. + not_needed(invoker, [ "needs_gomacc_path_arg" ]) } if (toolchain_uses_remoteexec_links) { @@ -289,6 +296,7 @@ template("single_gcc_toolchain") { cc = compiler_prefix + invoker.cc cxx = compiler_prefix + invoker.cxx + # "asm" doesn't support any of toolchain_cc_wrapper, toolchain_uses_goma and # toolchain_uses_remoteexec. The coverage flags are also nonsensical on # assembler runs. @@ -429,7 +437,7 @@ template("single_gcc_toolchain") { description = "AR {{output}}" outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ] - # Shared libraries go in the target out directory by default so we can + # Static libraries go in the target out directory by default so we can # generate different targets with the same name and not have them collide. default_output_dir = "{{target_out_dir}}" default_output_extension = ".a" @@ -716,7 +724,11 @@ template("single_gcc_toolchain") { default_output_extension = ".a" output_prefix = "lib" - default_output_dir = "{{root_out_dir}}" + + # Static libraries go in the target out directory by default so we can + # generate different targets with the same name and not have them + # collide. + default_output_dir = "{{target_out_dir}}" description = "RUST(STATICLIB) {{output}}" outputs = [ libname ] @@ -738,7 +750,10 @@ template("single_gcc_toolchain") { # This is prefixed unconditionally in `rlibname`. # output_prefix = "lib" - default_output_dir = "{{root_out_dir}}" + # Static libraries go in the target out directory by default so we can + # generate different targets with the same name and not have them + # collide. + default_output_dir = "{{target_out_dir}}" description = "RUST {{output}}" outputs = [ rlibname ] @@ -856,6 +871,7 @@ template("gcc_toolchain") { use_clang_coverage = false use_sanitizer_coverage = false generate_linker_map = false + use_thin_lto = false } # When cross-compiling we don't want to use the target platform's file @@ -891,16 +907,7 @@ template("clang_toolchain") { ar = "${prefix}/llvm-ar" nm = "${prefix}/llvm-nm" - forward_variables_from(invoker, - [ - "strip", - "default_shlib_subdir", - "dwp", - "enable_linker_map", - "loadable_module_extension", - "propagates_configs", - "use_unstripped_as_runtime_outputs", - ]) + forward_variables_from(invoker, "*", [ "toolchain_args" ]) toolchain_args = { if (defined(invoker.toolchain_args)) { diff --git a/build/toolchain/goma.gni b/build/toolchain/goma.gni index 9e0e547..71f3e05 100644 --- a/build/toolchain/goma.gni +++ b/build/toolchain/goma.gni @@ -4,15 +4,12 @@ # Defines the configuration of Goma. +import("//build/toolchain/siso.gni") + declare_args() { # Set to true to enable distributed compilation using Goma. use_goma = false - # This flag is for ChromeOS compiler wrapper. - # By passing gomacc path via cmd-line arg, ChromeOS' compiler wrapper - # invokes gomacc inside it. - needs_gomacc_path_arg = false - # Absolute directory containing the gomacc binary. goma_dir = "" } @@ -21,10 +18,10 @@ if (use_goma && goma_dir == "") { goma_dir = exec_script("get_goma_dir.py", [], "string") } -declare_args() { - # TODO(crbug.com/726475): true if use_goma = true in the future. - use_java_goma = false -} - assert(!is_win || !use_goma || is_clang, "cl.exe does not work on goma, use clang") + +if (use_goma && current_toolchain == default_toolchain) { + assert(!use_siso, + "Siso does not support Goma. Use use_remoteexec=true instead.") +} diff --git a/build/toolchain/nacl/BUILD.gn b/build/toolchain/nacl/BUILD.gn index 2f159a1..08cde5e 100644 --- a/build/toolchain/nacl/BUILD.gn +++ b/build/toolchain/nacl/BUILD.gn @@ -250,6 +250,19 @@ template("nacl_irt_toolchain") { # so we need to link w/ the C++ linker. ld = "${python_path} ${link_irt} --tls-edit=${tls_edit} --link-cmd=${cxx} --readelf-cmd=${readelf}" + # reclient requires explicit upload of toolchain lib + if (is_chromeos_ash && use_remoteexec) { + if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != "") { + extra_cppflags = " " + invoker.extra_cppflags + } else { + extra_cppflags = "" + } + + libdir = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/lib", + root_build_dir) + extra_cppflags += " -B${libdir}" + } + toolchain_args = { current_cpu = toolchain_cpu is_clang = true diff --git a/build/toolchain/nacl_toolchain.gni b/build/toolchain/nacl_toolchain.gni index cfa820a..3385342 100644 --- a/build/toolchain/nacl_toolchain.gni +++ b/build/toolchain/nacl_toolchain.gni @@ -56,17 +56,21 @@ template("nacl_toolchain") { if (use_remoteexec) { if (is_win) { - rbe_cc_cfg_file = "${rbe_cfg_dir}/nacl/rewrapper_windows.cfg" + rbe_cc_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/nacl/rewrapper_windows.cfg" } else if (is_mac) { - rbe_cc_cfg_file = "${rbe_cfg_dir}/nacl/rewrapper_mac.cfg" + rbe_cc_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/nacl/rewrapper_mac.cfg" } else { # TODO(ukai): non linux? - rbe_cc_cfg_file = "${rbe_cfg_dir}/nacl/rewrapper_linux.cfg" + rbe_cc_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/nacl/rewrapper_linux.cfg" } } if (use_remoteexec_links) { - rbe_link_cfg_file = "${rbe_cfg_dir}/nacl/rewrapper_linux_link.cfg" + rbe_link_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/nacl/rewrapper_linux_link.cfg" } # TODO(b/282032209): Re-enable remote nacl links once mismatches due to diff --git a/build/toolchain/rbe.gni b/build/toolchain/rbe.gni index cd86e22..7975b49 100644 --- a/build/toolchain/rbe.gni +++ b/build/toolchain/rbe.gni @@ -1,9 +1,9 @@ # Defines the configuration of Remote Build Execution (RBE). -# The directory where the re-client tooling binaries are. -rbe_bin_dir = rebase_path("//buildtools/reclient", root_build_dir) - declare_args() { + # The directory where the re-client tooling binaries are. + rbe_bin_dir = rebase_path("//buildtools/reclient", root_build_dir) + # Execution root - this should be the root of the source tree. # This is defined here instead of in the config file because # this will vary depending on where the user has placed the @@ -17,26 +17,30 @@ declare_args() { use_remoteexec_links = false # The directory where the re-client configuration files are. - rbe_cfg_dir = rebase_path("//buildtools/reclient_cfgs", root_build_dir) + rbe_cfg_dir = "//buildtools/reclient_cfgs" } declare_args() { # Set to the path of the RBE reclient configuration files. # Configuration file selection based on operating system. - if (is_linux || is_android || is_chromeos || is_fuchsia) { - rbe_py_cfg_file = "${rbe_cfg_dir}/python/rewrapper_linux.cfg" - rbe_cc_cfg_file = - "${rbe_cfg_dir}/chromium-browser-clang/rewrapper_linux.cfg" - rbe_link_cfg_file = - "${rbe_cfg_dir}/chromium-browser-clang/rewrapper_linux_link.cfg" - } else if (is_win) { - rbe_py_cfg_file = "${rbe_cfg_dir}/python/rewrapper_windows.cfg" - rbe_cc_cfg_file = - "${rbe_cfg_dir}/chromium-browser-clang/rewrapper_windows.cfg" + if (host_os == "linux") { + rbe_py_cfg_file = + rebase_path(rbe_cfg_dir, root_build_dir) + "/python/rewrapper_linux.cfg" + rbe_cc_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/chromium-browser-clang/rewrapper_linux.cfg" + rbe_link_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/chromium-browser-clang/rewrapper_linux_link.cfg" + } else if (host_os == "win") { + rbe_py_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/python/rewrapper_windows.cfg" + rbe_cc_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/chromium-browser-clang/rewrapper_windows.cfg" rbe_link_cfg_file = "" - } else if (is_mac || is_ios) { - rbe_py_cfg_file = "${rbe_cfg_dir}/python/rewrapper_mac.cfg" - rbe_cc_cfg_file = "${rbe_cfg_dir}/chromium-browser-clang/rewrapper_mac.cfg" + } else if (host_os == "mac") { + rbe_py_cfg_file = + rebase_path(rbe_cfg_dir, root_build_dir) + "/python/rewrapper_mac.cfg" + rbe_cc_cfg_file = rebase_path(rbe_cfg_dir, root_build_dir) + + "/chromium-browser-clang/rewrapper_mac.cfg" rbe_link_cfg_file = "" } else { rbe_linkcfg_file = "" @@ -48,6 +52,15 @@ declare_args() { rbe_cros_cc_wrapper = "${rbe_bin_dir}/rewrapper" } +if (use_remoteexec && current_toolchain == default_toolchain) { + # Check existence of reclient configs and show user friendly error message if + # it doesn't. + exec_script(rebase_path("//build/toolchain/check_rewrapper_cfg.py"), + [ rbe_cc_cfg_file ], + "", + [ rebase_path(rbe_cc_cfg_file, ".", root_build_dir) ]) +} + if (is_win) { if (use_remoteexec_links) { print("For now, remote linking is not available for Windows.") diff --git a/build/toolchain/toolchain.gni b/build/toolchain/toolchain.gni index 1ab0622..4aeceb5 100644 --- a/build/toolchain/toolchain.gni +++ b/build/toolchain/toolchain.gni @@ -5,8 +5,8 @@ # Toolchain-related configuration that may be needed outside the context of the # toolchain() rules themselves. +import("//build/config/cast.gni") import("//build/config/chrome_build.gni") -import("//build/config/chromecast_build.gni") import("//build_overrides/build.gni") declare_args() { @@ -21,6 +21,12 @@ declare_args() { # version shipped with the build. use_xcode_clang = is_apple + # Cronet is shipped in AOSP, where it is built using the Android Mainline + # Clang. Please refer to go/cronet-builders-with-mainline-clang-design for + # more information. + # If this arg is set to true, we use the Android Mainline LLVM. + llvm_android_mainline = false + # Used for binary size analysis. generate_linker_map = is_android && is_official_build @@ -42,21 +48,16 @@ if (generate_linker_map) { } declare_args() { - if (llvm_force_head_revision) { - clang_version = "18" - } else { - # TODO(crbug.com/1467585): Remove in the next clang roll + if (llvm_android_mainline) { # https://crbug.com/1481060 clang_version = "17" + } else { + clang_version = "19" } } # Extension for shared library files (including leading dot). if (is_apple) { shlib_extension = ".dylib" -} else if (is_android && is_component_build) { - # By appending .cr, we prevent name collisions with libraries already - # loaded by the Android zygote. - shlib_extension = ".cr.so" } else if (is_posix || is_fuchsia) { shlib_extension = ".so" } else if (is_win) { diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn index fe09790..d7f3484 100644 --- a/build/toolchain/win/BUILD.gn +++ b/build/toolchain/win/BUILD.gn @@ -43,8 +43,8 @@ if (target_cpu == "arm64") { win_toolchains("arm64") { toolchain_arch = "arm64" } - win_toolchains(host_cpu) { - toolchain_arch = host_cpu + win_toolchains("x64") { + toolchain_arch = "x64" } } diff --git a/build/toolchain/win/setup_toolchain.py b/build/toolchain/win/setup_toolchain.py index f3d5ca3..945b309 100644 --- a/build/toolchain/win/setup_toolchain.py +++ b/build/toolchain/win/setup_toolchain.py @@ -285,34 +285,46 @@ def q(s): # Quote s if it contains spaces or other weird characters. lib = [p.replace('"', r'\"') for p in env['LIB'].split(';') if p] lib = list(map(relflag, lib)) - include_I = ' '.join([q('/I' + i) for i in include]) - include_imsvc = ' '.join([q('-imsvc' + i) for i in include]) - libpath_flags = ' '.join([q('-libpath:' + i) for i in lib]) + include_I = ['/I' + i for i in include] + include_imsvc = ['-imsvc' + i for i in include] + libpath_flags = ['-libpath:' + i for i in lib] if (environment_block_name != ''): env_block = _FormatAsEnvironmentBlock(env) with open(environment_block_name, 'w', encoding='utf8') as f: f.write(env_block) + def ListToArgString(x): + return gn_helpers.ToGNString(' '.join(q(i) for i in x)) + + def ListToArgList(x): + return f'[{", ".join(gn_helpers.ToGNString(i) for i in x)}]' + print('vc_bin_dir = ' + gn_helpers.ToGNString(vc_bin_dir)) assert include_I - print('include_flags_I = ' + gn_helpers.ToGNString(include_I)) + print(f'include_flags_I = {ListToArgString(include_I)}') + print(f'include_flags_I_list = {ListToArgList(include_I)}') assert include_imsvc # PATCH(build-gn): Do not assume depot_tools by default. if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 0))) and win_sdk_path: - print('include_flags_imsvc = ' + - gn_helpers.ToGNString(q('/winsysroot' + relflag(toolchain_root)))) + flags = ['/winsysroot' + relflag(toolchain_root)] + print(f'include_flags_imsvc = {ListToArgString(flags)}') + print(f'include_flags_imsvc_list = {ListToArgList(flags)}') else: - print('include_flags_imsvc = ' + gn_helpers.ToGNString(include_imsvc)) + print(f'include_flags_imsvc = {ListToArgString(include_imsvc)}') + print(f'include_flags_imsvc_list = {ListToArgList(include_imsvc)}') print('paths = ' + gn_helpers.ToGNString(env['PATH'])) assert libpath_flags - print('libpath_flags = ' + gn_helpers.ToGNString(libpath_flags)) + print(f'libpath_flags = {ListToArgString(libpath_flags)}') + print(f'libpath_flags_list = {ListToArgList(libpath_flags)}') # PATCH(build-gn): Do not assume depot_tools by default. if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 0))) and win_sdk_path: - print('libpath_lldlink_flags = ' + - gn_helpers.ToGNString(q('/winsysroot:' + relflag(toolchain_root)))) + flags = ['/winsysroot:' + relflag(toolchain_root)] + print(f'libpath_lldlink_flags = {ListToArgString(flags)}') + print(f'libpath_lldlink_flags_list = {ListToArgList(flags)}') else: - print('libpath_lldlink_flags = ' + gn_helpers.ToGNString(libpath_flags)) + print(f'libpath_lldlink_flags = {ListToArgString(libpath_flags)}') + print(f'libpath_lldlink_flags_list = {ListToArgList(libpath_flags)}') if __name__ == '__main__': diff --git a/build/toolchain/win/toolchain.gni b/build/toolchain/win/toolchain.gni index b296cfb..9a70191 100644 --- a/build/toolchain/win/toolchain.gni +++ b/build/toolchain/win/toolchain.gni @@ -81,7 +81,7 @@ template("msvc_toolchain") { if (toolchain_uses_remoteexec) { if (toolchain_is_clang) { - cl_prefix = "${rbe_bin_dir}/rewrapper -cfg=${rbe_cc_cfg_file} -exec_root=${rbe_exec_root} " + cl_prefix = "${rbe_bin_dir}/rewrapper -cfg=${rbe_cc_cfg_file} -exec_root=${rbe_exec_root} -labels=type=compile,compiler=clang-cl,lang=cpp " } else { cl_prefix = "" } @@ -315,15 +315,17 @@ template("msvc_toolchain") { ml_py = rebase_path("//build/toolchain/win/ml.py", root_build_dir) ml = "\"$python_path\" $ml_py $ml" } - } - if (toolchain_args.current_cpu != "arm64" || toolchain_is_clang) { - # TODO(thakis): Stop using asm-wrapper when using clang. - command = "\"$python_path\" $_tool_wrapper_path asm-wrapper $env $ml {{defines}} {{include_dirs}} {{asmflags}} {{source}}" + + if (toolchain_args.current_cpu == "arm64") { + # armasm64.exe does not support definitions passed via the command + # line. (Fortunately, they're not needed for compiling the V8 + # snapshot, which is the only time this assembler is required.) + command = "\"$python_path\" $_tool_wrapper_path asm-wrapper $env $ml {{include_dirs}} {{asmflags}} {{source}}" + } else { + command = "\"$python_path\" $_tool_wrapper_path asm-wrapper $env $ml {{defines}} {{include_dirs}} {{asmflags}} {{source}}" + } } else { - # armasm64.exe does not support definitions passed via the command - # line. (Fortunately, they're not needed for compiling the V8 - # snapshot, which is the only time this assembler is required.) - command = "\"$python_path\" $_tool_wrapper_path asm-wrapper $env $ml {{include_dirs}} {{asmflags}} {{source}}" + command = "$ml {{defines}} {{include_dirs}} {{asmflags}} {{source}}" } description = "ASM {{output}}" @@ -344,7 +346,11 @@ template("msvc_toolchain") { default_output_extension = ".lib" output_prefix = "lib" - default_output_dir = "{{root_out_dir}}" + + # Static libraries go in the target out directory by default so we can + # generate different targets with the same name and not have them + # collide. + default_output_dir = "{{target_out_dir}}" description = "RUST(STATICLIB) {{output}}" outputs = [ libname ] @@ -366,7 +372,11 @@ template("msvc_toolchain") { # This is prefixed unconditionally in `rlibname`. # output_prefix = "lib" - default_output_dir = "{{root_out_dir}}" + + # Static libraries go in the target out directory by default so we can + # generate different targets with the same name and not have them + # collide. + default_output_dir = "{{target_out_dir}}" description = "RUST {{output}}" outputs = [ rlibname ] @@ -615,6 +625,7 @@ template("msvc_rust_host_build_tools_toolchain") { use_clang_coverage = false use_sanitizer_coverage = false generate_linker_map = false + use_thin_lto = false } } } else { diff --git a/build/util/LASTCHANGE b/build/util/LASTCHANGE index b842661..6d8328d 100644 --- a/build/util/LASTCHANGE +++ b/build/util/LASTCHANGE @@ -1,2 +1,2 @@ -LASTCHANGE=2d662a1dbdfff9eb44e08ea4c93b31d25e5557be-refs/branch-heads/5949@{#1} -LASTCHANGE_YEAR=2023 +LASTCHANGE=022dd052c74fa4b33e4e4fb162fad73c9daecced-refs/branch-heads/6315@{#4} +LASTCHANGE_YEAR=2024 diff --git a/build/util/LASTCHANGE.committime b/build/util/LASTCHANGE.committime index 4281dca..6e4696b 100644 --- a/build/util/LASTCHANGE.committime +++ b/build/util/LASTCHANGE.committime @@ -1 +1 @@ -1692068681 \ No newline at end of file +1708628833 \ No newline at end of file diff --git a/build/util/action_remote.py b/build/util/action_remote.py index ea2e132..040d511 100755 --- a/build/util/action_remote.py +++ b/build/util/action_remote.py @@ -26,8 +26,13 @@ def __str__(self): return self.value -def _process_build_metadata_json(bm_file, input_roots, output_root, re_outputs, - processed_inputs): +def _normalize_path(path): + # Always use posix-style directory separators as GN does it. + return os.path.normpath(path).replace("\\", "/") + + +def _process_build_metadata_json(bm_file, input_roots, output_root, + output_files, processed_inputs): """Recursively find mojom_parser inputs from a build_metadata file.""" # Import Mojo-specific dep here so non-Mojo remote actions don't need it. if _MOJOM_DIR not in sys.path: @@ -46,21 +51,22 @@ def _process_build_metadata_json(bm_file, input_roots, output_root, re_outputs, # All sources and corresponding module files are inputs. for s in bm["sources"]: - src = os.path.normpath(os.path.join(bm_dir, s)) + src = _normalize_path(os.path.join(bm_dir, s)) if src not in processed_inputs and os.path.exists(src): processed_inputs.add(src) - src_module = os.path.join( - output_root, - RebaseAbsolutePath(os.path.abspath(src), input_roots) + "-module") - if src_module in re_outputs: + src_module = _normalize_path( + os.path.join( + output_root, + RebaseAbsolutePath(os.path.abspath(src), input_roots) + "-module")) + if src_module in output_files: continue if src_module not in processed_inputs and os.path.exists(src_module): processed_inputs.add(src_module) # Recurse into build_metadata deps. for d in bm["deps"]: - dep = os.path.normpath(os.path.join(bm_dir, d)) - _process_build_metadata_json(dep, input_roots, output_root, re_outputs, + dep = _normalize_path(os.path.join(bm_dir, d)) + _process_build_metadata_json(dep, input_roots, output_root, output_files, processed_inputs) @@ -89,7 +95,7 @@ def _get_mojom_parser_inputs(exec_root, output_files, extra_args): output_root, output_files, processed_inputs) # Rebase paths onto rewrapper exec root. - return map(lambda dep: os.path.normpath(os.path.relpath(dep, exec_root)), + return map(lambda dep: _normalize_path(os.path.relpath(dep, exec_root)), processed_inputs) @@ -113,7 +119,10 @@ def main(): output_files = set() with open(parsed_args.output_list_paths, 'r') as file: for line in file: - output_files.add(line.rstrip('\n')) + # Output files are relative to exec_root. + output_file = _normalize_path( + os.path.join(parsed_args.exec_root, line.rstrip('\n'))) + output_files.add(output_file) # Scan for and add explicit inputs for rewrapper if necessary. # These should be in a new input list paths file, as using --inputs can fail diff --git a/build/util/android_chrome_version.py b/build/util/android_chrome_version.py index 16cf8d0..ebd8cf4 100755 --- a/build/util/android_chrome_version.py +++ b/build/util/android_chrome_version.py @@ -85,6 +85,7 @@ ('CHROME_MODERN', 'CHROME_MODERN', '32'), ('MONOCHROME', 'MONOCHROME', '32'), ('TRICHROME', 'TRICHROME', '32'), + ('TRICHROME_AUTO', 'TRICHROME_AUTO', '32'), ('TRICHROME_BETA', 'TRICHROME_BETA', '32'), ('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '32'), ('WEBVIEW_BETA', 'WEBVIEW_BETA', '32'), @@ -95,6 +96,7 @@ ('CHROME_MODERN', 'CHROME_MODERN', '64'), ('MONOCHROME', 'MONOCHROME', '64'), ('TRICHROME', 'TRICHROME', '64'), + ('TRICHROME_AUTO', 'TRICHROME_AUTO', '64'), ('TRICHROME_BETA', 'TRICHROME_BETA', '64'), ('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '64'), ('WEBVIEW_BETA', 'WEBVIEW_BETA', '64'), @@ -102,6 +104,7 @@ ], 'hybrid': [ ('CHROME', 'CHROME', '64'), + ('CHROME_32', 'CHROME', '32'), ('CHROME_MODERN', 'CHROME_MODERN', '64'), ('MONOCHROME', 'MONOCHROME', '32_64'), ('MONOCHROME_32', 'MONOCHROME', '32'), @@ -114,6 +117,10 @@ ('TRICHROME_64_32', 'TRICHROME', '64_32'), ('TRICHROME_64_32_HIGH', 'TRICHROME', '64_32_high'), ('TRICHROME_64', 'TRICHROME', '64'), + ('TRICHROME_AUTO', 'TRICHROME_AUTO', '32_64'), + ('TRICHROME_AUTO_32', 'TRICHROME_AUTO', '32'), + ('TRICHROME_AUTO_32_64', 'TRICHROME_AUTO', '32_64'), + ('TRICHROME_AUTO_64', 'TRICHROME_AUTO', '64'), ('TRICHROME_AUTO_64_32', 'TRICHROME_AUTO', '64_32'), ('TRICHROME_AUTO_64_32_HIGH', 'TRICHROME_AUTO', '64_32_high'), ('TRICHROME_BETA', 'TRICHROME_BETA', '32_64'), diff --git a/build/util/android_chrome_version_test.py b/build/util/android_chrome_version_test.py index a28e5c6..3650e81 100644 --- a/build/util/android_chrome_version_test.py +++ b/build/util/android_chrome_version_test.py @@ -63,8 +63,10 @@ def testGenerateVersionCodesAndroidTrichrome(self): is_next_build=False) trichrome_version_code = output['TRICHROME_VERSION_CODE'] + trichrome_auto_version_code = output['TRICHROME_AUTO_VERSION_CODE'] self.assertEqual(trichrome_version_code, '484400030') + self.assertEqual(trichrome_auto_version_code, '484400050') def testGenerateVersionCodesAndroidWebviewStable(self): """Assert it gives correct values for standard/example inputs""" @@ -179,6 +181,11 @@ def testGenerateVersionCodesAndroidArchArm64Variants(self): arch_trichrome_64_32_high_version_code = output[ 'TRICHROME_64_32_HIGH_VERSION_CODE'] arch_trichrome_64_version_code = output['TRICHROME_64_VERSION_CODE'] + arch_trichrome_auto_version_code = output['TRICHROME_AUTO_VERSION_CODE'] + arch_trichrome_auto_32_version_code = output['TRICHROME_AUTO_32_VERSION_CODE'] + arch_trichrome_auto_32_64_version_code = output['TRICHROME_AUTO_32_64_VERSION_CODE'] + arch_trichrome_auto_64_version_code = output[ + 'TRICHROME_AUTO_64_VERSION_CODE'] arch_trichrome_auto_64_32_version_code = output[ 'TRICHROME_AUTO_64_32_VERSION_CODE'] @@ -193,6 +200,10 @@ def testGenerateVersionCodesAndroidArchArm64Variants(self): self.assertEqual(arch_trichrome_64_32_version_code, '484400034') self.assertEqual(arch_trichrome_64_32_high_version_code, '484400039') self.assertEqual(arch_trichrome_64_version_code, '484400035') + self.assertEqual(arch_trichrome_auto_version_code, '484400053') + self.assertEqual(arch_trichrome_auto_32_version_code, '484400050') + self.assertEqual(arch_trichrome_auto_32_64_version_code, '484400053') + self.assertEqual(arch_trichrome_auto_64_version_code, '484400055') self.assertEqual(arch_trichrome_auto_64_32_version_code, '484400054') def testGenerateVersionCodesAndroidArchX64(self): @@ -229,6 +240,11 @@ def testGenerateVersionCodesAndroidArchX64Variants(self): arch_trichrome_version_code = output['TRICHROME_VERSION_CODE'] arch_trichrome_64_32_version_code = output['TRICHROME_64_32_VERSION_CODE'] arch_trichrome_64_version_code = output['TRICHROME_64_VERSION_CODE'] + arch_trichrome_auto_version_code = output['TRICHROME_AUTO_VERSION_CODE'] + arch_trichrome_auto_32_version_code = output['TRICHROME_AUTO_32_VERSION_CODE'] + arch_trichrome_auto_32_64_version_code = output['TRICHROME_AUTO_32_64_VERSION_CODE'] + arch_trichrome_auto_64_version_code = output[ + 'TRICHROME_AUTO_64_VERSION_CODE'] arch_trichrome_auto_64_32_version_code = output[ 'TRICHROME_AUTO_64_32_VERSION_CODE'] @@ -242,6 +258,10 @@ def testGenerateVersionCodesAndroidArchX64Variants(self): self.assertEqual(arch_trichrome_version_code, '484400036') self.assertEqual(arch_trichrome_64_32_version_code, '484400037') self.assertEqual(arch_trichrome_64_version_code, '484400038') + self.assertEqual(arch_trichrome_auto_version_code, '484400056') + self.assertEqual(arch_trichrome_auto_32_version_code, '484400051') + self.assertEqual(arch_trichrome_auto_32_64_version_code, '484400056') + self.assertEqual(arch_trichrome_auto_64_version_code, '484400058') self.assertEqual(arch_trichrome_auto_64_32_version_code, '484400057') def testGenerateVersionCodesAndroidArchOrderArm(self): @@ -502,6 +522,11 @@ def testGenerateVersionCodesAndroidArchArm64Variants(self): arch_trichrome_64_32_version_code = output['TRICHROME_64_32_VERSION_CODE'] arch_trichrome_64_32_high_version_code = output[ 'TRICHROME_64_32_HIGH_VERSION_CODE'] + arch_trichrome_auto_version_code = output['TRICHROME_AUTO_VERSION_CODE'] + arch_trichrome_auto_32_version_code = output['TRICHROME_AUTO_32_VERSION_CODE'] + arch_trichrome_auto_32_64_version_code = output['TRICHROME_AUTO_32_64_VERSION_CODE'] + arch_trichrome_auto_64_version_code = output[ + 'TRICHROME_AUTO_64_VERSION_CODE'] arch_trichrome_64_version_code = output['TRICHROME_64_VERSION_CODE'] arch_trichrome_auto_64_32_version_code = output[ 'TRICHROME_AUTO_64_32_VERSION_CODE'] @@ -521,6 +546,10 @@ def testGenerateVersionCodesAndroidArchArm64Variants(self): self.assertEqual(arch_trichrome_64_version_code, '575000034') self.assertEqual(arch_trichrome_auto_64_32_version_code, '575000052') self.assertEqual(arch_trichrome_auto_64_32_high_version_code, '575000053') + self.assertEqual(arch_trichrome_auto_64_version_code, '575000054') + self.assertEqual(arch_trichrome_auto_version_code, '575000051') + self.assertEqual(arch_trichrome_auto_32_version_code, '575000050') + self.assertEqual(arch_trichrome_auto_32_64_version_code, '575000051') def testGenerateVersionCodesAndroidArchX64(self): """Assert it handles different architectures correctly. @@ -558,6 +587,14 @@ def testGenerateVersionCodesAndroidArchX64Variants(self): arch_trichrome_64_version_code = output['TRICHROME_64_VERSION_CODE'] arch_trichrome_auto_64_32_version_code = output[ 'TRICHROME_AUTO_64_32_VERSION_CODE'] + arch_trichrome_auto_version_code = output['TRICHROME_AUTO_VERSION_CODE'] + arch_trichrome_auto_32_version_code = output['TRICHROME_AUTO_32_VERSION_CODE'] + arch_trichrome_auto_32_64_version_code = output['TRICHROME_AUTO_32_64_VERSION_CODE'] + arch_trichrome_64_version_code = output['TRICHROME_64_VERSION_CODE'] + arch_trichrome_auto_64_32_version_code = output[ + 'TRICHROME_AUTO_64_32_VERSION_CODE'] + arch_trichrome_auto_64_version_code = output[ + 'TRICHROME_AUTO_64_VERSION_CODE'] self.assertEqual(arch_monochrome_32_version_code, '575000026') self.assertEqual(arch_monochrome_32_64_version_code, '575000027') @@ -569,6 +606,10 @@ def testGenerateVersionCodesAndroidArchX64Variants(self): self.assertEqual(arch_trichrome_version_code, '575000037') self.assertEqual(arch_trichrome_64_32_version_code, '575000038') self.assertEqual(arch_trichrome_64_version_code, '575000039') + self.assertEqual(arch_trichrome_auto_version_code, '575000057') + self.assertEqual(arch_trichrome_auto_32_version_code, '575000056') + self.assertEqual(arch_trichrome_auto_32_64_version_code, '575000057') + self.assertEqual(arch_trichrome_auto_64_version_code, '575000059') self.assertEqual(arch_trichrome_auto_64_32_version_code, '575000058') def testGenerateVersionCodesAndroidArchRiscv64(self): @@ -814,6 +855,16 @@ def testArm_32_64Translate(self): self.assertEqual(abi, 'arm_32_64') self.assertEqual(is_next_build, False) + def testArm_Auto_32_64Translate(self): + """Test for an auto build with Trichrome and arm_32_64.""" + build, patch, package, abi, is_next_build = TranslateVersionCode( + '499900053') + self.assertEqual(build, 4999) + self.assertEqual(patch, 0) + self.assertEqual(package, 'TRICHROME_AUTO') + self.assertEqual(abi, 'arm_32_64') + self.assertEqual(is_next_build, False) + def testArm_64_32Translate(self): """Test for a build with Trichrome and arm_64_32.""" build, patch, package, abi, is_next_build = TranslateVersionCode( @@ -895,6 +946,16 @@ def testX86_32_64Translate(self): self.assertEqual(abi, 'x86_32_64') self.assertEqual(is_next_build, False) + def testX86_Auto_32_64Translate(self): + """Test for an auto build with x86_32_64.""" + build, patch, package, abi, is_next_build = TranslateVersionCode( + '499900056') + self.assertEqual(build, 4999) + self.assertEqual(patch, 0) + self.assertEqual(package, 'TRICHROME_AUTO') + self.assertEqual(abi, 'x86_32_64') + self.assertEqual(is_next_build, False) + def testX86_64_32Translate(self): """Test for a build with x86_64_32.""" build, patch, package, abi, is_next_build = TranslateVersionCode( @@ -915,6 +976,16 @@ def testX86_Auto_64_32Translate(self): self.assertEqual(abi, 'x86_64_32') self.assertEqual(is_next_build, False) + def testX86_Auto_64Translate(self): + """Test for an auto build with x86_64.""" + build, patch, package, abi, is_next_build = TranslateVersionCode( + '499900058') + self.assertEqual(build, 4999) + self.assertEqual(patch, 0) + self.assertEqual(package, 'TRICHROME_AUTO') + self.assertEqual(abi, 'x86_64') + self.assertEqual(is_next_build, False) + def testWebviewTranslate(self): """Test for a build with Webview.""" build, patch, package, abi, is_next_build = TranslateVersionCode( diff --git a/build/util/generate_wrapper.py b/build/util/generate_wrapper.py index b45f5f3..c106bd3 100755 --- a/build/util/generate_wrapper.py +++ b/build/util/generate_wrapper.py @@ -40,7 +40,7 @@ } -PY_TEMPLATE = textwrap.dedent("""\ +PY_TEMPLATE = textwrap.dedent(r""" import os import re import shlex diff --git a/build/util/ide_query b/build/util/ide_query new file mode 100755 index 0000000..80536c1 --- /dev/null +++ b/build/util/ide_query @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +# Copyright 2024 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 script gets the information needed by lDE language services. + +Expected to run it at repository root, where top DEP, .gn etc exists. +Not intended to run by user. +See go/reqs-for-peep +""" + +import argparse +import os +import re +import subprocess +import sys + +def _gn_lines(output_dir, path): + """ + Generator function that returns args.gn lines one at a time, following + import directives as needed. + """ + import_re = re.compile(r'\s*import\("(.*)"\)') + with open(path, encoding="utf-8") as f: + for line in f: + match = import_re.match(line) + if match: + raw_import_path = match.groups()[0] + if raw_import_path[:2] == "//": + import_path = os.path.normpath( + os.path.join(output_dir, "..", "..", + raw_import_path[2:])) + else: + import_path = os.path.normpath( + os.path.join(os.path.dirname(path), raw_import_path)) + for import_line in _gn_lines(output_dir, import_path): + yield import_line + else: + yield line + +def _use_reclient(outdir): + args_gn = os.path.join(outdir, 'args.gn') + if not os.path.exists(args_gn): + return False + for line in _gn_lines(outdir, args_gn): + line_without_comment = line.split('#')[0] + if re.search(r"(^|\s)(use_remoteexec)\s*=\s*true($|\s)", + line_without_comment): + return True + return False + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--source', action='append', + help=('The source file being analyzed.' + 'Multiple --source arguments can be passed in order to batch ' + 'process is desired. ')) + parser.add_argument('--perform-build', action='store_true', + help=('If specified, actually build the target, including any generated ' + 'prerequisite files. ' + 'If --perform-build is not passed, the contents of ' + 'the GeneratedFile results will only be returned if a build has ' + 'been previously completed, and may be stale.')) + parser.add_argument('--out-dir', + help=('Output directory, containing args.gn, which specifies the build ' + 'configuration.')) + options = parser.parse_args() + + this_dir = os.path.dirname(__file__) + repo_root = os.path.join(this_dir, '..', '..') + + targets = [] + for source in options.source: + # source is repo root (cwd) relative, + # but siso uses out dir relative target. + target = os.path.relpath(source, start=options.out_dir) + "^" + targets.append(target) + + if options.perform_build: + if _use_reclient(options.out_dir): + args = ['autoninja', '-C', options.out_dir] + else: + args = ['siso', 'ninja', '-C', options.out_dir] + args.extend(targets) + p = subprocess.run(args, cwd=repo_root, capture_output=True) + if p.returncode != 0: + # TODO: report error in IdeAnalysis.Status? + sys.stderr.write('build failed with %d\n%s\n%s' % ( + p.returncode, p.stdout, p.stderr)) + return 1 + + args = ['siso', 'query', 'ideanalysis', '-C', options.out_dir] + args.extend(targets) + subprocess.run(args, cwd=repo_root, check=True) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/build/util/lastchange.gni b/build/util/lastchange.gni index 909b978..8ed577a 100644 --- a/build/util/lastchange.gni +++ b/build/util/lastchange.gni @@ -6,7 +6,7 @@ # reproducible binaries. declare_args() { - use_dummy_lastchange = false + use_dummy_lastchange = !is_official_build } if (use_dummy_lastchange) { diff --git a/build/util/lastchange.py b/build/util/lastchange.py index 98a6360..457c0da 100755 --- a/build/util/lastchange.py +++ b/build/util/lastchange.py @@ -78,6 +78,7 @@ def _RunGitCommand(directory, command): stdout, stderr = tuple(x.decode(encoding='utf_8') for x in proc.communicate()) stdout = stdout.strip() + stderr = stderr.strip() logging.debug("returncode: %d", proc.returncode) logging.debug("stdout: %s", stdout) logging.debug("stderr: %s", stderr) @@ -276,14 +277,16 @@ def main(argv=None): sys.exit(2) source_dir = args.source_dir or os.path.dirname(os.path.abspath(__file__)) + + git_top_dir = None try: git_top_dir = GetGitTopDirectory(source_dir) except GitError as e: - logging.error("Failed to get git top directory from '%s': %s", - source_dir, e) - return 2 + logging.warning("Failed to get git top directory from '%s': %s", source_dir, + e) - if args.merge_base_ref: + merge_base_sha = 'HEAD' + if git_top_dir and args.merge_base_ref: try: merge_base_sha = GetMergeBase(git_top_dir, args.merge_base_ref) except GitError as e: @@ -291,18 +294,24 @@ def main(argv=None): "merge base could be found between it and HEAD. Git " "reports: %s", args.merge_base_ref, e) return 3 - else: - merge_base_sha = 'HEAD' - try: - version_info = FetchGitRevision(git_top_dir, commit_filter, merge_base_sha) - except GitError as e: - logging.error("Failed to get version info: %s", e) - logging.info(("Falling back to a version of 0.0.0 to allow script to " + version_info = None + if git_top_dir: + try: + version_info = FetchGitRevision(git_top_dir, commit_filter, + merge_base_sha) + except GitError as e: + logging.error("Failed to get version info: %s", e) + + if not version_info: + logging.warning( + "Falling back to a version of 0.0.0 to allow script to " "finish. This is normal if you are bootstrapping a new environment " "or do not have a git repository for any other reason. If not, this " - "could represent a serious error.")) - version_info = VersionInfo('0', '0', 0) + "could represent a serious error.") + # Use a dummy revision that has the same length as a Git commit hash, + # same as what we use in build/util/LASTCHANGE.dummy. + version_info = VersionInfo('0' * 40, '0' * 40, 0) revision_string = version_info.revision if args.revision_id_only: @@ -314,8 +323,8 @@ def main(argv=None): if args.print_only: print(revision_string) else: - lastchange_year = datetime.datetime.utcfromtimestamp( - version_info.timestamp).year + lastchange_year = datetime.datetime.fromtimestamp( + version_info.timestamp, datetime.timezone.utc).year contents_lines = [ "LASTCHANGE=%s" % revision_string, "LASTCHANGE_YEAR=%s" % lastchange_year, diff --git a/build/util/lib/results/DIR_METADATA b/build/util/lib/results/DIR_METADATA index aea61c0..e5c30e4 100644 --- a/build/util/lib/results/DIR_METADATA +++ b/build/util/lib/results/DIR_METADATA @@ -1,11 +1,6 @@ -# Metadata information for this directory. -# -# For more information on DIR_METADATA files, see: -# https://source.chromium.org/chromium/infra/infra/+/main:go/src/infra/tools/dirmd/README.md -# -# For the schema of this file, see Metadata message: -# https://source.chromium.org/chromium/infra/infra/+/main:go/src/infra/tools/dirmd/proto/dir_metadata.proto - -monorail { +monorail: { component: "Infra>Client>Chrome" } +buganizer_public: { + component_id: 1456211 +} diff --git a/build/util/process_version.gni b/build/util/process_version.gni index cd9671c..90d921e 100644 --- a/build/util/process_version.gni +++ b/build/util/process_version.gni @@ -40,6 +40,9 @@ import("//build/util/lastchange.gni") # doesn't attempt to link the result into a source set. This is for if # you are processing the version as data only. # +# executable (optional, defaults to false) +# Sets the executable bit on the output file (POSIX only). +# # visibility (optional) # # Example: @@ -92,6 +95,10 @@ template("process_version") { } } + if (defined(invoker.executable) && invoker.executable) { + args += [ "-x" ] + } + if (defined(invoker.extra_args)) { args += invoker.extra_args } diff --git a/build/util/version.py b/build/util/version.py index 9bf51cd..d593f20 100755 --- a/build/util/version.py +++ b/build/util/version.py @@ -10,6 +10,7 @@ import argparse import os +import stat import sys import android_chrome_version @@ -95,25 +96,30 @@ def SubstFile(file_name, values): This is like SubstTemplate, except it operates on a file. """ - template = open(file_name, 'r').read() + with open(file_name, 'r') as f: + template = f.read() return SubstTemplate(template, values) -def WriteIfChanged(file_name, contents): +def WriteIfChanged(file_name, contents, mode): """ Writes the specified contents to the specified file_name. Does nothing if the contents aren't different than the current contents. """ try: - old_contents = open(file_name, 'r').read() + with open(file_name, 'r') as f: + old_contents = f.read() except EnvironmentError: pass else: - if contents == old_contents: + if contents == old_contents and mode == stat.S_IMODE( + os.lstat(file_name).st_mode): return os.unlink(file_name) - open(file_name, 'w').write(contents) + with open(file_name, 'w') as f: + f.write(contents) + os.chmod(file_name, mode) def BuildParser(): @@ -127,6 +133,11 @@ def BuildParser(): help='Write substituted strings to FILE.') parser.add_argument('-t', '--template', default=None, help='Use TEMPLATE as the strings to substitute.') + parser.add_argument('-x', + '--executable', + default=False, + action='store_true', + help='Set the executable bit on the output (on POSIX).') parser.add_argument( '-e', '--eval', @@ -231,6 +242,18 @@ def GenerateOutputContents(options, values): """ % values +def GenerateOutputMode(options): + """Construct output mode (e.g. from template). + + Arguments: + options -- argparse parsed arguments + """ + if options.executable: + return 0o755 + else: + return 0o644 + + def BuildOutput(args): """Gets all input and output values needed for writing output.""" # Build argparse parser with arguments @@ -245,17 +268,18 @@ def BuildOutput(args): # Get the raw values that will be used the generate the output values = GenerateValues(options, evals) - # Get the output string + # Get the output string and mode contents = GenerateOutputContents(options, values) + mode = GenerateOutputMode(options) - return {'options': options, 'contents': contents} + return {'options': options, 'contents': contents, 'mode': mode} -def main(): - output = BuildOutput(sys.argv[1:]) +def main(args): + output = BuildOutput(args) if output['options'].output is not None: - WriteIfChanged(output['options'].output, output['contents']) + WriteIfChanged(output['options'].output, output['contents'], output['mode']) else: print(output['contents']) @@ -263,4 +287,4 @@ def main(): if __name__ == '__main__': - sys.exit(main()) + sys.exit(main(sys.argv[1:])) diff --git a/build/util/version_test.py b/build/util/version_test.py index f9b468f..33ed7d5 100644 --- a/build/util/version_test.py +++ b/build/util/version_test.py @@ -3,6 +3,8 @@ # found in the LICENSE file. import os +import tempfile +import time import unittest import mock @@ -159,6 +161,68 @@ def testBuildOutputAndroidChromeArchInput(self): self.assertEqual(cm.exception.code, 2) + def testSetExecutable(self): + """Assert that -x sets executable on POSIX and is harmless on Windows.""" + with tempfile.TemporaryDirectory() as tmpdir: + in_file = os.path.join(tmpdir, "in") + out_file = os.path.join(tmpdir, "out") + with open(in_file, "w") as f: + f.write("") + self.assertEqual(version.main(['-i', in_file, '-o', out_file, '-x']), 0) + + # Whether lstat(out_file).st_mode has the executable bits set is + # platform-specific. Therefore, test that out_file has the same + # permissions that in_file would have after chmod(in_file, 0o755). + # On Windows: both files will have 0o666. + # On POSIX: both files will have 0o755. + os.chmod(in_file, 0o755) # On Windows, this sets in_file to 0o666. + self.assertEqual(os.lstat(in_file).st_mode, os.lstat(out_file).st_mode) + + def testWriteIfChangedUpdateWhenContentChanged(self): + """Assert it updates mtime of file when content is changed.""" + with tempfile.TemporaryDirectory() as tmpdir: + file_name = os.path.join(tmpdir, "version.h") + old_contents = "old contents" + with open(file_name, "w") as f: + f.write(old_contents) + os.chmod(file_name, 0o644) + mtime = os.lstat(file_name).st_mtime + time.sleep(0.1) + contents = "new contents" + version.WriteIfChanged(file_name, contents, 0o644) + with open(file_name) as f: + self.assertEqual(contents, f.read()) + self.assertNotEqual(mtime, os.lstat(file_name).st_mtime) + + def testWriteIfChangedUpdateWhenModeChanged(self): + """Assert it updates mtime of file when mode is changed.""" + with tempfile.TemporaryDirectory() as tmpdir: + file_name = os.path.join(tmpdir, "version.h") + contents = "old contents" + with open(file_name, "w") as f: + f.write(contents) + os.chmod(file_name, 0o644) + mtime = os.lstat(file_name).st_mtime + time.sleep(0.1) + version.WriteIfChanged(file_name, contents, 0o755) + with open(file_name) as f: + self.assertEqual(contents, f.read()) + self.assertNotEqual(mtime, os.lstat(file_name).st_mtime) + + def testWriteIfChangedNoUpdate(self): + """Assert it does not update mtime of file when nothing is changed.""" + with tempfile.TemporaryDirectory() as tmpdir: + file_name = os.path.join(tmpdir, "version.h") + contents = "old contents" + with open(file_name, "w") as f: + f.write(contents) + os.chmod(file_name, 0o644) + mtime = os.lstat(file_name).st_mtime + time.sleep(0.1) + version.WriteIfChanged(file_name, contents, 0o644) + with open(file_name) as f: + self.assertEqual(contents, f.read()) + self.assertEqual(mtime, os.lstat(file_name).st_mtime) if __name__ == '__main__': unittest.main() diff --git a/build/whitespace_file.txt b/build/whitespace_file.txt index 0b23301..30daae2 100644 --- a/build/whitespace_file.txt +++ b/build/whitespace_file.txt @@ -194,7 +194,7 @@ And you know you're going to fall Tell 'em a hookah-smoking caterpillar Isn't it supposed to be a whitespace file? -Let's add some " ". +Let's add some " ". I'll join to add my first commit here. P. S. It has stopped being a story long long ago. diff --git a/build/win/reorder-imports.py b/build/win/reorder-imports.py index 7dd8e1d..8885160 100755 --- a/build/win/reorder-imports.py +++ b/build/win/reorder-imports.py @@ -7,7 +7,6 @@ import optparse import os import shutil -import subprocess import sys sys.path.insert( diff --git a/build/write_build_date_header.py b/build/write_build_date_header.py deleted file mode 100755 index 4929e04..0000000 --- a/build/write_build_date_header.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2016 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Takes a timestamp and writes it in as readable text to a .h file.""" - -import argparse -import datetime -import os -import sys - - -def main(): - argument_parser = argparse.ArgumentParser() - argument_parser.add_argument('output_file', help='The file to write to') - argument_parser.add_argument('timestamp') - args = argument_parser.parse_args() - - date = datetime.datetime.utcfromtimestamp(int(args.timestamp)) - output = ('// Generated by //build/write_build_date_header.py\n' - '#ifndef BUILD_DATE\n' - '#define BUILD_DATE "{:%b %d %Y %H:%M:%S}"\n' - '#endif // BUILD_DATE\n'.format(date)) - - current_contents = '' - if os.path.isfile(args.output_file): - with open(args.output_file, 'r') as current_file: - current_contents = current_file.read() - - if current_contents != output: - with open(args.output_file, 'w') as output_file: - output_file.write(output) - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/build/write_buildflag_header.py b/build/write_buildflag_header.py index 89a0737..a8b68f9 100755 --- a/build/write_buildflag_header.py +++ b/build/write_buildflag_header.py @@ -44,7 +44,7 @@ def GetOptions(): header_guard = cmdline_options.output.upper() if header_guard[0].isdigit(): header_guard = '_' + header_guard - header_guard = re.sub('[^\w]', '_', header_guard) + header_guard = re.sub(r'[^\w]', '_', header_guard) header_guard += '_' # The actual output file is inside the gen dir. diff --git a/build/xcode_binaries.yaml b/build/xcode_binaries.yaml index 6619757..5ebb4dc 100644 --- a/build/xcode_binaries.yaml +++ b/build/xcode_binaries.yaml @@ -6,7 +6,7 @@ # ln -s /Applications/Xcode.app build/xcode_binaries # 2) Call `cipd create --pkg-def build/xcode_binaries.yaml` # To deploy the newly created cipd package across the fleet, modify -# mac_toolchain.py to point to the new cipd hash. +# ./mac_toolchain.py to point to the new cipd hash. # # Note that runhooks extracts the cipd file to build/mac_files/xcode_binaries # -- your build/xcode_binaries you're creating in step 1 above isn't used as @@ -59,5 +59,5 @@ data: - dir: Contents/SharedFrameworks/SymbolicationDT.framework - file: Contents/version.plist # llvm-size and size are run on swarming, those are symlinked to out of -# isolated tree and produce invdalid symlink if we don't use copy mode here. +# isolated tree and produce invalid symlinks if we don't use copy mode here. install_mode: copy diff --git a/build_overrides/build.gni b/build_overrides/build.gni index 01433d8..63d1abc 100644 --- a/build_overrides/build.gni +++ b/build_overrides/build.gni @@ -2,7 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") +import("//build/config/features.gni") import("//build/config/gclient_args.gni") # Uncomment these to specify a different NDK location and version in @@ -14,6 +15,10 @@ import("//build/config/gclient_args.gni") # PATCH(build-gn): No Java. enable_java_templates = false +# Variable that can be used to support multiple build scenarios, like when +# V8 is embedded within a target. +build_with_v8_embedder = build_with_chromium + # Enables assertions on safety checks in libc++. # # This should be set to true whenever building with Chrome's custom libc++ in @@ -39,7 +44,9 @@ declare_args() { # Switches the TRACE_EVENT instrumentation from base's TraceLog implementation # to //third_party/perfetto's client library. # TODO(crbug/1006541): Switch to perfetto's client library on all platforms. - use_perfetto_client_library = (is_linux || is_android) && !is_castos + use_perfetto_client_library = + (is_linux || is_android || (use_blink && is_ios) || is_win || + is_chromeos || is_mac) && !is_castos # Limits the defined //third_party/android_deps targets to only "buildCompile" # and "buildCompileNoDeps" targets. This is useful for third-party @@ -52,10 +59,6 @@ declare_args() { # to lack of toolchain support. gtest_enable_absl_printers = !is_nacl - # Allows third-party repositories to use C++17 for MSVC builds - # TODO(https://crbug.com/pdfium/1932) Remove once pdfium builds on MSVC C++20 - msvc_use_cxx17 = false - # Allow projects that wish to stay on C++17 to override Chromium's default. # TODO(crbug.com/1402249): evaluate removing this end of 2023 use_cxx17 = false diff --git a/build_overrides/partition_alloc.gni b/build_overrides/partition_alloc.gni index c3d3aa1..ab1211a 100644 --- a/build_overrides/partition_alloc.gni +++ b/build_overrides/partition_alloc.gni @@ -12,7 +12,6 @@ # - use_allocator_shim # - use_partition_alloc_as_malloc # - enable_backup_ref_ptr_support -# - put_ref_count_in_previous_slot # - enable_backup_ref_ptr_slow_checks # - enable_dangling_raw_ptr_checks # - backup_ref_ptr_poison_oob_ptr @@ -24,10 +23,9 @@ # # {variable}_default works as the default value of {variable}. -import("//build/config/chromecast_build.gni") +import("//build/config/cast.gni") import("//build/config/sanitizers/sanitizers.gni") if (is_ios) { - import("//build/config/ios/ios_sdk.gni") import("//ios/features.gni") } @@ -38,15 +36,15 @@ _is_using_sanitizers = is_asan || is_hwasan || is_lsan || is_tsan || is_msan # known to cause issues on some (e.g. Windows with shims, Android with # non-universal symbol wrapping), and has not been validated on others. # - Windows: debug CRT is not compatible, see below. -# PATCH(build-gn): No custom allocator. -_disable_partition_alloc_everywhere = true +_disable_partition_alloc_everywhere = + (!is_linux && is_component_build) || (is_win && is_debug) # - NaCl: No plans to support it. # - iOS: Depends on ios_partition_alloc_enabled. if (is_ios) { _is_partition_alloc_everywhere_platform = ios_partition_alloc_enabled } else { - _is_partition_alloc_everywhere_platform = !is_nacl && !is_mac + _is_partition_alloc_everywhere_platform = !is_nacl } # Under Windows debug build, the allocator shim is not compatible with CRT. @@ -75,13 +73,16 @@ if (_default_use_allocator_shim && _is_partition_alloc_everywhere_platform && use_partition_alloc_as_malloc_default = _default_allocator == "partition" use_allocator_shim_default = _default_use_allocator_shim -_is_brp_supported = (is_win || is_android || is_linux || is_mac || +_is_brp_supported = (is_win || is_android || is_linux || is_mac || is_ios || is_chromeos) && use_partition_alloc_as_malloc_default enable_backup_ref_ptr_support_default = _is_brp_supported -put_ref_count_in_previous_slot_default = true enable_backup_ref_ptr_slow_checks_default = false enable_dangling_raw_ptr_checks_default = enable_backup_ref_ptr_support_default && is_linux && !is_official_build && (is_debug || dcheck_always_on) + +raw_ptr_zero_on_construct_default = true +raw_ptr_zero_on_move_default = true +raw_ptr_zero_on_destruct_default = false diff --git a/scripts/bootstrap.js b/scripts/bootstrap.js index 17e409a..15ef96a 100755 --- a/scripts/bootstrap.js +++ b/scripts/bootstrap.js @@ -24,7 +24,6 @@ execSync('git submodule update --init --recursive') const commonConfig = [ 'use_jumbo_build=true', - 'use_cxx17=true', 'treat_warnings_as_errors=false', `target_cpu="${targetCpu}"`, ] diff --git a/testing b/testing index 24e7bab..ea5668e 160000 --- a/testing +++ b/testing @@ -1 +1 @@ -Subproject commit 24e7bab4fd4c2b6e69e2527c7a917d92960ad4e3 +Subproject commit ea5668efef36a14b6a0b7060524a30249d983662 diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index 82f9c4f..ad5c871 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py @@ -35,12 +35,11 @@ # https://chromium.googlesource.com/chromium/src/+/main/docs/updating_clang.md # Reverting problematic clang rolls is safe, though. # This is the output of `git describe` and is usable as a commit-ish. -CLANG_REVISION = 'llvmorg-17-init-16420-g0c545a44' -CLANG_SUB_REVISION = 8 +CLANG_REVISION = 'llvmorg-19-init-2319-g7c4c2746' +CLANG_SUB_REVISION = 1 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION) -RELEASE_VERSION = '17' -# TODO(crbug.com/1467585): Bump to 18 in next Clang roll. +RELEASE_VERSION = '19' CDS_URL = os.environ.get('CDS_CLANG_BUCKET_OVERRIDE', 'https://commondatastorage.googleapis.com/chromium-browser-clang') @@ -335,11 +334,6 @@ def main(): help='Verify that clang has the passed-in version.') args = parser.parse_args() - # TODO(crbug.com/1467585): Remove in next Clang roll. - if args.llvm_force_head_revision: - global RELEASE_VERSION - RELEASE_VERSION = '18' - if args.verify_version and args.verify_version != RELEASE_VERSION: print('RELEASE_VERSION is %s but --verify-version argument was %s.' % ( RELEASE_VERSION, args.verify_version)) diff --git a/tools/gn b/tools/gn index e96b1bb..a0e3796 160000 --- a/tools/gn +++ b/tools/gn @@ -1 +1 @@ -Subproject commit e96b1bb71f81a65b00ad1736154aa71b12744a08 +Subproject commit a0e37966dca7d75b6c9228487753c629da253f11