diff --git a/.github/workflows/grapheneos-update.yml b/.github/workflows/grapheneos-update.yml index edff36e2..26ab09f1 100644 --- a/.github/workflows/grapheneos-update.yml +++ b/.github/workflows/grapheneos-update.yml @@ -17,19 +17,19 @@ jobs: # buildNumber is the only quoted string inside upstream-params.nix so we can # just use grep to extract the first quoted string and use xargs to strip the # quotes - OLD_BUILD_NUMBER=$(grep -o -m 1 '"[^"]*"' ./flavors/grapheneos/upstream-params.nix | xargs) - echo "OLD_BUILD_NUMBER=$OLD_BUILD_NUMBER" | tee -a $GITHUB_ENV + OLD_BUILD_NUMBER="$(grep -o -m 1 '"[^"]*"' ./flavors/grapheneos/upstream-params.nix | xargs)" + echo "OLD_BUILD_NUMBER=$OLD_BUILD_NUMBER" | tee -a "$GITHUB_ENV" nix develop -c ./flavors/grapheneos/extract-upstream-params.sh - NEW_BUILD_NUMBER=$(grep -o -m 1 '"[^"]*"' ./flavors/grapheneos/upstream-params.nix | xargs) - echo "NEW_BUILD_NUMBER=$NEW_BUILD_NUMBER" | tee -a $GITHUB_ENV + NEW_BUILD_NUMBER="$(grep -o -m 1 '"[^"]*"' ./flavors/grapheneos/upstream-params.nix | xargs)" + echo "NEW_BUILD_NUMBER=$NEW_BUILD_NUMBER" | tee -a "$GITHUB_ENV" - name: "Update devices" if: env.OLD_BUILD_NUMBER != env.NEW_BUILD_NUMBER run: | for DEVICE in crosshatch sunfish oriole; do - METADATA=$(curl -sSfL "https://releases.grapheneos.org/$DEVICE-beta") - BUILD_PREFIX=$(echo "$METADATA" | cut -d" " -f3) + METADATA="(curl -sSfL "https://releases.grapheneos.org/$DEVICE-beta")" + BUILD_PREFIX="$(echo "$METADATA" | cut -d" " -f3)" git mv "./flavors/grapheneos/repo-$BUILD_PREFIX.$OLD_BUILD_NUMBER.json" \ "./flavors/grapheneos/repo-$BUILD_PREFIX.$NEW_BUILD_NUMBER.json" nix develop -c ./flavors/grapheneos/update.sh "$BUILD_PREFIX.$NEW_BUILD_NUMBER" diff --git a/.github/workflows/instantiate.yml b/.github/workflows/instantiate.yml index 3ae6c7be..f4c97487 100644 --- a/.github/workflows/instantiate.yml +++ b/.github/workflows/instantiate.yml @@ -15,19 +15,19 @@ jobs: extra_nix_config: | experimental-features = nix-command flakes - run: | - nix run github:nix-community/nix-eval-jobs/3f305f4538e056e6f6f775e1f75410b6d4d8d9aa -- --workers $(nproc) --option allow-import-from-derivation false --show-trace ./release.nix | tee eval.json + nix run github:nix-community/nix-eval-jobs/3f305f4538e056e6f6f775e1f75410b6d4d8d9aa -- --workers "$(nproc)" --option allow-import-from-derivation false --show-trace ./release.nix | tee eval.json jq -c 'select(.error)' eval.json | tee errors.json - if [[ "$(wc -l < errors.json)" > 0 ]]; then exit 1; fi + if [[ "$(wc -l < errors.json)" -gt 0 ]]; then exit 1; fi robotnix-eval-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2.3.5 - uses: cachix/install-nix-action@v12 - run: | - OUTPUT=$(nix-instantiate --eval --strict tests/eval.nix) + OUTPUT="$(nix-instantiate --eval --strict tests/eval.nix)" if [[ "$OUTPUT" != "[ ]" ]]; then echo "Instantiation tests failed:" - echo $OUTPUT + echo "$OUTPUT" fi nixos-tests: runs-on: ubuntu-latest @@ -55,10 +55,10 @@ jobs: experimental-features = nix-command flakes - run: | nix flake check - export ORIG_DIR=$PWD - cd $(mktemp -d) - nix flake init -t $ORIG_DIR - nix flake check --override-input robotnix $ORIG_DIR + export ORIG_DIR="$PWD" + cd "$(mktemp -d)" + nix flake init -t "$ORIG_DIR" + nix flake check --override-input robotnix "$ORIG_DIR" checks: runs-on: ubuntu-latest steps: diff --git a/apks/auditor/default.nix b/apks/auditor/default.nix index 2a482a38..d2d64254 100644 --- a/apks/auditor/default.nix +++ b/apks/auditor/default.nix @@ -2,18 +2,34 @@ # SPDX-License-Identifier: MIT # https://www.reddit.com/r/GrapheneOS/comments/bpcttk/avb_key_auditor_app/ -{ callPackage, lib, stdenv, pkgs, substituteAll, fetchFromGitHub, - androidPkgs, jdk11_headless, gradle, gradleToNixPatchedFetchers, +{ + callPackage, + lib, + stdenv, + pkgs, + substituteAll, + fetchFromGitHub, + androidPkgs, + jdk11_headless, + gradle, + gradleToNixPatchedFetchers, domain ? "example.org", applicationName ? "Robotnix Auditor", applicationId ? "org.robotnix.auditor", signatureFingerprint ? "", # Signature that this app will be signed by. device ? "", - avbFingerprint ? "" + avbFingerprint ? "", }: let - androidsdk = androidPkgs.sdk (p: with p; [ cmdline-tools-latest platform-tools platforms-android-30 build-tools-30-0-3 ]); - buildGradle = callPackage ./gradle-env.nix {}; + androidsdk = androidPkgs.sdk ( + p: with p; [ + cmdline-tools-latest + platform-tools + platforms-android-30 + build-tools-30-0-3 + ] + ); + buildGradle = callPackage ./gradle-env.nix { }; supportedDevices = import ./supported-devices.nix; in buildGradle rec { @@ -31,12 +47,16 @@ buildGradle rec { patches = [ # TODO: Enable support for passing multiple device fingerprints - (substituteAll ({ - src = ./customized-auditor.patch; - inherit domain applicationName applicationId ; - signatureFingerprint = lib.toUpper signatureFingerprint; - } - // lib.genAttrs supportedDevices (d: if (device == d) then avbFingerprint else "DISABLED_CUSTOM_${d}"))) + (substituteAll ( + { + src = ./customized-auditor.patch; + inherit domain applicationName applicationId; + signatureFingerprint = lib.toUpper signatureFingerprint; + } + // lib.genAttrs supportedDevices ( + d: if (device == d) then avbFingerprint else "DISABLED_CUSTOM_${d}" + ) + )) # TODO: Ugly downgrades due to not being able to update to gradle 7.0.2, since its not working with gradle2nix ./build-hacks.patch diff --git a/apks/auditor/gradle-env.nix b/apks/auditor/gradle-env.nix index 3469da22..a3bf7a8f 100644 --- a/apks/auditor/gradle-env.nix +++ b/apks/auditor/gradle-env.nix @@ -19,183 +19,232 @@ # ''; # } -{ lib -, stdenv -, buildEnv -, fetchs3 -, fetchurl -, gradleGen -, writeText -, writeTextDir +{ + lib, + stdenv, + buildEnv, + fetchs3, + fetchurl, + gradleGen, + writeText, + writeTextDir, }: { -# Path to the environment spec generated by gradle2nix (e.g. gradle-env.json). - envSpec -, pname ? null -, version ? null -, enableParallelBuilding ? true -# Arguments to Gradle used to build the project in buildPhase. -, gradleFlags ? [ "build" ] -# Gradle package to use instead of the one generated by gradle2nix. -, gradlePackage ? null -# Enable debugging for the Gradle build; this will cause Gradle to run a debug server -# and wait for a JVM debugging client to attach. -, enableDebug ? false -# Additional code to run in the Gradle init script (init.gradle). -, extraInit ? "" -# Override the default JDK used to run Gradle itself. -, buildJdk ? null -# Override functions which fetch dependency artifacts. -# Keys in this set are URL schemes such as "https" or "s3". -# Values are functions which take a dependency in the form -# `{ urls, sha256 }` and fetch into the Nix store. For example: -# -# { -# s3 = { urls, sha256 }: fetchs3 { -# s3url = builtins.head urls; -# inherit sha256; -# region = "us-west-2"; -# credentials = { -# access_key_id = "foo"; -# secret_access_key = "bar"; -# }; -# }; -# } -, fetchers ? { } -, ... } @ args: + # Path to the environment spec generated by gradle2nix (e.g. gradle-env.json). + envSpec, + pname ? null, + version ? null, + enableParallelBuilding ? true, + # Arguments to Gradle used to build the project in buildPhase. + gradleFlags ? [ "build" ], + # Gradle package to use instead of the one generated by gradle2nix. + gradlePackage ? null, + # Enable debugging for the Gradle build; this will cause Gradle to run a debug server + # and wait for a JVM debugging client to attach. + enableDebug ? false, + # Additional code to run in the Gradle init script (init.gradle). + extraInit ? "", + # Override the default JDK used to run Gradle itself. + buildJdk ? null, + # Override functions which fetch dependency artifacts. + # Keys in this set are URL schemes such as "https" or "s3". + # Values are functions which take a dependency in the form + # `{ urls, sha256 }` and fetch into the Nix store. For example: + # + # { + # s3 = { urls, sha256 }: fetchs3 { + # s3url = builtins.head urls; + # inherit sha256; + # region = "us-west-2"; + # credentials = { + # access_key_id = "foo"; + # secret_access_key = "bar"; + # }; + # }; + # } + fetchers ? { }, + ... +}@args: let inherit (builtins) - attrValues concatStringsSep filter fromJSON getAttr head match - replaceStrings sort; + attrValues + concatStringsSep + filter + fromJSON + getAttr + head + match + replaceStrings + sort + ; inherit (lib) - assertMsg concatMapStringsSep groupBy' hasSuffix hasPrefix last mapAttrs - mapAttrsToList optionalString readFile removeSuffix unique versionAtLeast - versionOlder; + assertMsg + concatMapStringsSep + groupBy' + hasSuffix + hasPrefix + last + mapAttrs + mapAttrsToList + optionalString + readFile + removeSuffix + unique + versionAtLeast + versionOlder + ; fetchers' = { http = fetchurl; https = fetchurl; - s3 = { urls, sha256 }: fetchs3 { - s3url = head urls; - inherit sha256; - }; + s3 = + { urls, sha256 }: + fetchs3 { + s3url = head urls; + inherit sha256; + }; } // fetchers; # Fetch urls using the scheme for the first entry only; there isn't a # straightforward way to tell Nix to try multiple fetchers in turn # and short-circuit on the first successful fetch. - fetch = { urls, sha256 }: + fetch = + { urls, sha256 }: let first = head urls; scheme = head (builtins.match "([a-z0-9+.-]+)://.*" first); fetch' = getAttr scheme fetchers'; urls' = filter (hasPrefix scheme) urls; in - fetch' { urls = urls'; inherit sha256; }; + fetch' { + urls = urls'; + inherit sha256; + }; - mkDep = { name, path, urls, sha256, ... }: stdenv.mkDerivation { - inherit name; + mkDep = + { + name, + path, + urls, + sha256, + ... + }: + stdenv.mkDerivation { + inherit name; - src = fetch { - inherit urls sha256; - }; + src = fetch { inherit urls sha256; }; - phases = "installPhase"; + phases = "installPhase"; - installPhase = '' - mkdir -p $out/${path} - ln -s $src $out/${path}/${name} - ''; - }; + installPhase = '' + mkdir -p $out/${path} + ln -s $src $out/${path}/${name} + ''; + }; - mkModuleMetadata = deps: + mkModuleMetadata = + deps: let - ids = filter - (id: id.type == "pom") - (map (dep: dep.id) deps); - - modules = groupBy' - (meta: id: - let - isNewer = versionOlder meta.latest id.version; - isNewerRelease = - !(hasSuffix "-SNAPSHOT" id.version) && - versionOlder meta.release id.version; - in { - groupId = id.group; - artifactId = id.name; - latest = if isNewer then id.version else meta.latest; - release = if isNewerRelease then id.version else meta.release; - versions = meta.versions ++ [id.version]; + ids = filter (id: id.type == "pom") (map (dep: dep.id) deps); + + modules = + groupBy' + ( + meta: id: + let + isNewer = versionOlder meta.latest id.version; + isNewerRelease = !(hasSuffix "-SNAPSHOT" id.version) && versionOlder meta.release id.version; + in + { + groupId = id.group; + artifactId = id.name; + latest = if isNewer then id.version else meta.latest; + release = if isNewerRelease then id.version else meta.release; + versions = meta.versions ++ [ id.version ]; + } + ) + { + latest = ""; + release = ""; + versions = [ ]; } - ) - { - latest = ""; - release = ""; - versions = []; - } - (id: "${replaceStrings ["."] ["/"] id.group}/${id.name}/maven-metadata.xml") - ids; + (id: "${replaceStrings [ "." ] [ "/" ] id.group}/${id.name}/maven-metadata.xml") + ids; in - attrValues (mapAttrs (path: meta: + attrValues ( + mapAttrs ( + path: meta: let versions' = sort versionOlder (unique meta.versions); in - with meta; writeTextDir path '' - - - ${groupId} - ${artifactId} - - ${optionalString (latest != "") "${latest}"} - ${optionalString (release != "") "${release}"} - - ${concatMapStringsSep "\n " (v: "${v}") versions'} - - - - '' - ) modules); + with meta; + writeTextDir path '' + + + ${groupId} + ${artifactId} + + ${optionalString (latest != "") "${latest}"} + ${optionalString (release != "") "${release}"} + + ${concatMapStringsSep "\n " (v: "${v}") versions'} + + + + '' + ) modules + ); - mkSnapshotMetadata = deps: + mkSnapshotMetadata = + deps: let snapshotDeps = filter (dep: dep ? build && dep ? timestamp) deps; - modules = groupBy' - (meta: dep: - let - id = dep.id; - isNewer = dep.build > meta.buildNumber; - # Timestamp values can be bogus, e.g. jitpack.io - updated = if (match "[0-9]{8}\.[0-9]{6}" dep.timestamp) != null - then replaceStrings ["."] [""] dep.timestamp - else ""; - in { - groupId = id.group; - artifactId = id.name; - version = id.version; - timestamp = if isNewer then dep.timestamp else meta.timestamp; - buildNumber = if isNewer then dep.build else meta.buildNumber; - lastUpdated = if isNewer then updated else meta.lastUpdated; - versions = meta.versions or [] ++ [{ - classifier = id.classifier or ""; - extension = id.extension; - value = "${removeSuffix "-SNAPSHOT" id.version}-${dep.timestamp}-${toString dep.build}"; - updated = updated; - }]; + modules = + groupBy' + ( + meta: dep: + let + id = dep.id; + isNewer = dep.build > meta.buildNumber; + # Timestamp values can be bogus, e.g. jitpack.io + updated = + if (match "[0-9]{8}\.[0-9]{6}" dep.timestamp) != null then + replaceStrings [ "." ] [ "" ] dep.timestamp + else + ""; + in + { + groupId = id.group; + artifactId = id.name; + version = id.version; + timestamp = if isNewer then dep.timestamp else meta.timestamp; + buildNumber = if isNewer then dep.build else meta.buildNumber; + lastUpdated = if isNewer then updated else meta.lastUpdated; + versions = meta.versions or [ ] ++ [ + { + classifier = id.classifier or ""; + extension = id.extension; + value = "${removeSuffix "-SNAPSHOT" id.version}-${dep.timestamp}-${toString dep.build}"; + updated = updated; + } + ]; + } + ) + { + timestamp = ""; + buildNumber = -1; + lastUpdated = ""; } - ) - { - timestamp = ""; - buildNumber = -1; - lastUpdated = ""; - } - (dep: "${replaceStrings ["."] ["/"] dep.id.group}/${dep.id.name}/${dep.id.version}/maven-metadata.xml") - snapshotDeps; + ( + dep: + "${replaceStrings [ "." ] [ "/" ] dep.id.group}/${dep.id.name}/${dep.id.version}/maven-metadata.xml" + ) + snapshotDeps; mkSnapshotVersion = version: '' @@ -207,8 +256,11 @@ let ''; in - attrValues (mapAttrs (path: meta: - with meta; writeTextDir path '' + attrValues ( + mapAttrs ( + path: meta: + with meta; + writeTextDir path '' ${groupId} @@ -226,85 +278,95 @@ let '' - ) modules); - - mkRepo = project: type: deps: buildEnv { - name = "${project}-gradle-${type}-env"; - paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps; - }; + ) modules + ); + + mkRepo = + project: type: deps: + buildEnv { + name = "${project}-gradle-${type}-env"; + paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps; + }; - mkInitScript = projectSpec: gradle: + mkInitScript = + projectSpec: gradle: let repos = mapAttrs (mkRepo projectSpec.name) projectSpec.dependencies; - hasDependencies = mapAttrs (type: deps: deps != []) projectSpec.dependencies; + hasDependencies = mapAttrs (type: deps: deps != [ ]) projectSpec.dependencies; - inSettings = pred: script: + inSettings = + pred: script: optionalString pred ( - if versionAtLeast gradle.version "6.0" then '' - gradle.beforeSettings { - ${script} - } - '' else '' - gradle.settingsEvaluated { - ${script} - } - '' + if versionAtLeast gradle.version "6.0" then + '' + gradle.beforeSettings { + ${script} + } + '' + else + '' + gradle.settingsEvaluated { + ${script} + } + '' ); in - assert (assertMsg (hasDependencies.settings -> versionAtLeast gradle.version "6.0") '' + assert ( + assertMsg (hasDependencies.settings -> versionAtLeast gradle.version "6.0") '' Project `${projectSpec.name}' has settings script dependencies, such as settings plugins, which are not supported by gradle2nix for Gradle versions prior to 6.0. Potential remedies: - Pass `--gradle-version=' to the gradle2nix command. - Patch the `settings.gradle[.kts]' file to remove script dependencies. - ''); - - writeText "init.gradle" '' - static def offlineRepo(RepositoryHandler repositories, String env, String path) { - repositories.clear() - repositories.maven { - name "Nix''${env.capitalize()}MavenOffline" - url path - metadataSources { - it.gradleMetadata() - it.mavenPom() - it.artifact() - } - } - repositories.ivy { - name "Nix''${env.capitalize()}IvyOffline" - url path - layout "maven" - metadataSources { - it.gradleMetadata() - it.ivyDescriptor() - it.artifact() - } - } - } + '' + ); + + writeText "init.gradle" '' + static def offlineRepo(RepositoryHandler repositories, String env, String path) { + repositories.clear() + repositories.maven { + name "Nix''${env.capitalize()}MavenOffline" + url path + metadataSources { + it.gradleMetadata() + it.mavenPom() + it.artifact() + } + } + repositories.ivy { + name "Nix''${env.capitalize()}IvyOffline" + url path + layout "maven" + metadataSources { + it.gradleMetadata() + it.ivyDescriptor() + it.artifact() + } + } + } - ${inSettings (hasDependencies.settings && (versionAtLeast gradle.version "6.0")) '' - offlineRepo(it.buildscript.repositories, "settings", "${repos.settings}") - ''} + ${inSettings (hasDependencies.settings && (versionAtLeast gradle.version "6.0")) '' + offlineRepo(it.buildscript.repositories, "settings", "${repos.settings}") + ''} - ${inSettings (hasDependencies.plugin) '' - offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}") - ''} + ${inSettings (hasDependencies.plugin) '' + offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}") + ''} - ${optionalString (hasDependencies.buildscript) '' - gradle.projectsLoaded { - allprojects { - buildscript { - offlineRepo(repositories, "buildscript", "${repos.buildscript}") - } - } - } - ''} + ${optionalString (hasDependencies.buildscript) '' + gradle.projectsLoaded { + allprojects { + buildscript { + offlineRepo(repositories, "buildscript", "${repos.buildscript}") + } + } + } + ''} - ${optionalString (hasDependencies.project) ( - if versionAtLeast gradle.version "6.8" - then '' + ${optionalString (hasDependencies.project) ( + if versionAtLeast gradle.version "6.8" then + '' gradle.beforeSettings { it.dependencyResolutionManagement { offlineRepo(repositories, "project", "${repos.project}") @@ -312,22 +374,20 @@ let } } '' - else '' + else + '' gradle.projectsLoaded { allprojects { offlineRepo(repositories, "project", "${repos.project}") } } '' - )} + )} - ${extraInit} - ''; + ${extraInit} + ''; - mkGradle = gradleSpec: - gradleGen.gradleGen { - inherit (gradleSpec) nativeVersion version sha256; - }; + mkGradle = gradleSpec: gradleGen.gradleGen { inherit (gradleSpec) nativeVersion version sha256; }; mkProjectEnv = projectSpec: rec { inherit (projectSpec) name path version; @@ -335,9 +395,7 @@ let initScript = mkInitScript projectSpec gradle; }; - gradleEnv = mapAttrs - (_: p: mkProjectEnv p) - (fromJSON (readFile envSpec)); + gradleEnv = mapAttrs (_: p: mkProjectEnv p) (fromJSON (readFile envSpec)); projectEnv = gradleEnv.""; pname = args.pname or projectEnv.name; @@ -356,36 +414,40 @@ let ${concatStringsSep " " flags} ''; - buildIncludedProjects = - concatStringsSep "\n" (mapAttrsToList - (_: env: buildProject env [ "build" ]) - (removeAttrs gradleEnv [ "" ])); + buildIncludedProjects = concatStringsSep "\n" ( + mapAttrsToList (_: env: buildProject env [ "build" ]) (removeAttrs gradleEnv [ "" ]) + ); buildRootProject = buildProject projectEnv gradleFlags; -in stdenv.mkDerivation ((builtins.removeAttrs args [ "fetchers" ]) // { +in +stdenv.mkDerivation ( + (builtins.removeAttrs args [ "fetchers" ]) + // { - inherit pname version; + inherit pname version; - nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ projectEnv.gradle ]; + nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ projectEnv.gradle ]; - buildPhase = args.buildPhase or '' - runHook preBuild + buildPhase = + args.buildPhase or '' + runHook preBuild - ( - set -eux + ( + set -eux - # Work around https://github.com/gradle/gradle/issues/1055 - TMPHOME="$(mktemp -d)" - mkdir -p "$TMPHOME/init.d" - export GRADLE_USER_HOME="$TMPHOME" + # Work around https://github.com/gradle/gradle/issues/1055 + TMPHOME="$(mktemp -d)" + mkdir -p "$TMPHOME/init.d" + export GRADLE_USER_HOME="$TMPHOME" - ${buildIncludedProjects} - ${buildRootProject} - ) + ${buildIncludedProjects} + ${buildRootProject} + ) - runHook postBuild - ''; + runHook postBuild + ''; - dontStrip = true; -}) + dontStrip = true; + } +) diff --git a/apks/auditor/supported-devices.nix b/apks/auditor/supported-devices.nix index 68c9d4fe..910f1c1b 100644 --- a/apks/auditor/supported-devices.nix +++ b/apks/auditor/supported-devices.nix @@ -3,10 +3,14 @@ # Just so we have a single place to update this [ - "taimen" "walleye" # Pixel 2 (XL) - "crosshatch" "blueline" # Pixel 3 (XL) - "bonito" "sargo" # Pixel 3a (XL) - "coral" "flame" # Pixel 4 (XL) + "taimen" + "walleye" # Pixel 2 (XL) + "crosshatch" + "blueline" # Pixel 3 (XL) + "bonito" + "sargo" # Pixel 3a (XL) + "coral" + "flame" # Pixel 4 (XL) "sunfish" # Pixel 4a "bramble" # Pixel 4a (5G) "redfin" # Pixel 5 diff --git a/apks/chromium/bromite.nix b/apks/chromium/bromite.nix index 60ebff1c..b03da230 100644 --- a/apks/chromium/bromite.nix +++ b/apks/chromium/bromite.nix @@ -1,7 +1,12 @@ # SPDX-FileCopyrightText: 2021 Daniel Fullmer # SPDX-License-Identifier: MIT -{ chromium, fetchFromGitHub, git, python3 }: +{ + chromium, + fetchFromGitHub, + git, + python3, +}: let version = "100.0.4896.135"; @@ -13,73 +18,78 @@ let sha256 = "sha256-eD+VINsuBojPi6KaGjiBnQz0k1Q1PdKPsGsJCziFdug="; }; -in (chromium.override { +in +(chromium.override { name = "bromite"; displayName = "Bromite"; inherit version; enableRebranding = true; - customGnFlags = { # From bromite/build/GN_ARGS - blink_symbol_level=1; - build_contextual_search=false; - build_with_tflite_lib=false; - chrome_pgo_phase=0; - dcheck_always_on=false; - debuggable_apks=false; - dfmify_dev_ui=false; - disable_android_lint=true; - disable_autofill_assistant_dfm=true; - disable_fieldtrial_testing_config=true; - disable_tab_ui_dfm=true; - enable_av1_decoder=true; - enable_dav1d_decoder=true; - enable_gvr_services=false; - enable_hangout_services_extension=false; - enable_iterator_debugging=false; - enable_mdns=false; - enable_mse_mpeg2ts_stream_parser=true; - enable_nacl=false; - enable_platform_dolby_vision=true; - enable_platform_hevc=true; - enable_remoting=false; - enable_reporting=false; - enable_supervised_users=false; - enable_vr=false; - exclude_unwind_tables=false; - ffmpeg_branding="Chrome"; - icu_use_data_file=true; - is_cfi=true; - is_component_build=false; - is_debug=false; - is_official_build=true; - proprietary_codecs=true; - rtc_build_examples=false; - safe_browsing_mode=0; - symbol_level=1; - use_cfi_cast=true; - use_debug_fission=true; - use_errorprone_java_compiler=false; - use_gnome_keyring=false; - use_official_google_api_keys=false; - use_rtti=false; - use_sysroot=false; - webview_includes_weblayer=false; + customGnFlags = { + # From bromite/build/GN_ARGS + blink_symbol_level = 1; + build_contextual_search = false; + build_with_tflite_lib = false; + chrome_pgo_phase = 0; + dcheck_always_on = false; + debuggable_apks = false; + dfmify_dev_ui = false; + disable_android_lint = true; + disable_autofill_assistant_dfm = true; + disable_fieldtrial_testing_config = true; + disable_tab_ui_dfm = true; + enable_av1_decoder = true; + enable_dav1d_decoder = true; + enable_gvr_services = false; + enable_hangout_services_extension = false; + enable_iterator_debugging = false; + enable_mdns = false; + enable_mse_mpeg2ts_stream_parser = true; + enable_nacl = false; + enable_platform_dolby_vision = true; + enable_platform_hevc = true; + enable_remoting = false; + enable_reporting = false; + enable_supervised_users = false; + enable_vr = false; + exclude_unwind_tables = false; + ffmpeg_branding = "Chrome"; + icu_use_data_file = true; + is_cfi = true; + is_component_build = false; + is_debug = false; + is_official_build = true; + proprietary_codecs = true; + rtc_build_examples = false; + safe_browsing_mode = 0; + symbol_level = 1; + use_cfi_cast = true; + use_debug_fission = true; + use_errorprone_java_compiler = false; + use_gnome_keyring = false; + use_official_google_api_keys = false; + use_rtti = false; + use_sysroot = false; + webview_includes_weblayer = false; # XXX: Hack. Not sure why it's not being set correctly when building webview - rtc_use_x11=false; - rtc_use_x11_extensions=false; - rtc_use_pipewire=false; + rtc_use_x11 = false; + rtc_use_x11_extensions = false; + rtc_use_pipewire = false; }; -}).overrideAttrs (attrs: { - postPatch = '' - ( cd src - cat ${bromite_src}/build/bromite_patches_list.txt | while read patchfile; do - echo Applying $patchfile - ${git}/bin/git apply --unsafe-paths "${bromite_src}/build/patches/$patchfile" - done +}).overrideAttrs + (attrs: { + postPatch = + '' + ( cd src + cat ${bromite_src}/build/bromite_patches_list.txt | while read patchfile; do + echo Applying $patchfile + ${git}/bin/git apply --unsafe-paths "${bromite_src}/build/patches/$patchfile" + done - # Disable Auto updater by default. It's only set up to work with official builds. - substituteInPlace chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/BromiteInlineUpdateController.java \ - --replace "private boolean mEnabled = true" "private boolean mEnabled = false" - ) - '' + attrs.postPatch; -}) + # Disable Auto updater by default. It's only set up to work with official builds. + substituteInPlace chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/BromiteInlineUpdateController.java \ + --replace "private boolean mEnabled = true" "private boolean mEnabled = false" + ) + '' + + attrs.postPatch; + }) diff --git a/apks/chromium/buildenv.nix b/apks/chromium/buildenv.nix index 0298863a..19e029a1 100644 --- a/apks/chromium/buildenv.nix +++ b/apks/chromium/buildenv.nix @@ -7,19 +7,21 @@ with pkgs; # See 32-bit dependencies in src/build/install-build-deps-android buildFHSUserEnv { name = "chromium-fhs"; - targetPkgs = pkgs: with pkgs; [ - # Stuff verified to be needed in chromium - jdk8 - glibc_multi.dev # Needs unistd.h - libkrb5.dev # Needs headers - libkrb5 - ncurses5 - libxml2 - ]; - multiPkgs = pkgs: with pkgs; [ - zlib - ncurses5 - gcc - libgcc # Needed by their clang toolchain - ]; + targetPkgs = + pkgs: with pkgs; [ + # Stuff verified to be needed in chromium + jdk8 + glibc_multi.dev # Needs unistd.h + libkrb5.dev # Needs headers + libkrb5 + ncurses5 + libxml2 + ]; + multiPkgs = + pkgs: with pkgs; [ + zlib + ncurses5 + gcc + libgcc # Needed by their clang toolchain + ]; } diff --git a/apks/chromium/default.nix b/apks/chromium/default.nix index e8228430..7ed6ee06 100644 --- a/apks/chromium/default.nix +++ b/apks/chromium/default.nix @@ -1,37 +1,88 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ pkgs, callPackage, stdenv, stdenvNoCC, lib, fetchgit, fetchurl, fetchcipd, runCommand, symlinkJoin, writeScript, buildFHSUserEnv, autoPatchelfHook, buildPackages -, python2, python3, ninja, llvmPackages_11, nodejs, jre8, bison, gperf, pkg-config, protobuf, bsdiff -, dbus, systemd, glibc, at-spi2-atk, atk, at-spi2-core, nspr, nss, pciutils, util-linux, libkrb5, gdk-pixbuf -, glib, gtk3, alsa-lib, pulseaudio, xdg-utils, libXScrnSaver, libXcursor, libXtst, libXdamage -, libdrm, libxkbcommon -, zlib, ncurses5, libxml2, binutils, perl -, substituteAll, fetchgerritpatchset - -, name ? "chromium" -, displayName ? "Chromium" -, enableRebranding ? false -, customGnFlags ? {} -, targetCPU ? "arm64" -, buildTargets ? [ "chrome_modern_public_bundle" ] -, packageName ? "org.chromium.chrome" -, webviewPackageName ? "com.android.webview" -, trichromeLibraryPackageName ? "org.chromium.trichromelibrary" -, version ? "100.0.4896.127" -, versionCode ? null -# Potential buildTargets: -# chrome_modern_public_bundle + system_webview_apk -# trichrome_webview_apk + trichrome_chrome_bundle + trichome_library_apk -# monochrome_public_apk -, depsOverrides ? {} +{ + pkgs, + callPackage, + stdenv, + stdenvNoCC, + lib, + fetchgit, + fetchurl, + fetchcipd, + runCommand, + symlinkJoin, + writeScript, + buildFHSUserEnv, + autoPatchelfHook, + buildPackages, + python2, + python3, + ninja, + llvmPackages_11, + nodejs, + jre8, + bison, + gperf, + pkg-config, + protobuf, + bsdiff, + dbus, + systemd, + glibc, + at-spi2-atk, + atk, + at-spi2-core, + nspr, + nss, + pciutils, + util-linux, + libkrb5, + gdk-pixbuf, + glib, + gtk3, + alsa-lib, + pulseaudio, + xdg-utils, + libXScrnSaver, + libXcursor, + libXtst, + libXdamage, + libdrm, + libxkbcommon, + zlib, + ncurses5, + libxml2, + binutils, + perl, + substituteAll, + fetchgerritpatchset, + + name ? "chromium", + displayName ? "Chromium", + enableRebranding ? false, + customGnFlags ? { }, + targetCPU ? "arm64", + buildTargets ? [ "chrome_modern_public_bundle" ], + packageName ? "org.chromium.chrome", + webviewPackageName ? "com.android.webview", + trichromeLibraryPackageName ? "org.chromium.trichromelibrary", + version ? "100.0.4896.127", + versionCode ? null, + # Potential buildTargets: + # chrome_modern_public_bundle + system_webview_apk + # trichrome_webview_apk + trichrome_chrome_bundle + trichome_library_apk + # monochrome_public_apk + depsOverrides ? { }, }: let - _versionCode = let - minor = lib.fixedWidthString 4 "0" (builtins.elemAt (builtins.splitVersion version) 2); - patch = lib.fixedWidthString 3 "0" (builtins.elemAt (builtins.splitVersion version) 3); - in if (versionCode != null) then versionCode else "${minor}${patch}00"; + _versionCode = + let + minor = lib.fixedWidthString 4 "0" (builtins.elemAt (builtins.splitVersion version) 2); + patch = lib.fixedWidthString 3 "0" (builtins.elemAt (builtins.splitVersion version) 3); + in + if (versionCode != null) then versionCode else "${minor}${patch}00"; buildenv = import ./buildenv.nix { inherit pkgs; }; @@ -39,17 +90,32 @@ let # https://gn.googlesource.com/gn/+/refs/heads/master/docs/language.md gnToString = let - mkGnString = value: "\"${lib.escape ["\"" "$" "\\"] value}\""; - sanitize = value: - if value == true then "true" - else if value == false then "false" - else if lib.isList value then "[${lib.concatMapStringsSep ", " sanitize value}]" - else if lib.isInt value then toString value - else if lib.isString value then mkGnString value - else throw "Unsupported type for GN value `${value}'."; + mkGnString = + value: + "\"${ + lib.escape [ + "\"" + "$" + "\\" + ] value + }\""; + sanitize = + value: + if value == true then + "true" + else if value == false then + "false" + else if lib.isList value then + "[${lib.concatMapStringsSep ", " sanitize value}]" + else if lib.isInt value then + toString value + else if lib.isString value then + mkGnString value + else + throw "Unsupported type for GN value `${value}'."; toFlag = key: value: "${key}=${sanitize value}"; in - attrs: lib.concatStringsSep " " (lib.attrValues (lib.mapAttrs toFlag attrs)); + attrs: lib.concatStringsSep " " (lib.attrValues (lib.mapAttrs toFlag attrs)); gnFlags = { target_os = "android"; @@ -90,48 +156,69 @@ let # explicit host_cpu and target_cpu prevent "nix-shell pkgsi686Linux.chromium-git" from building x86_64 version # there is no problem with nix-build, but platform detection in nix-shell is not correct - host_cpu = { i686-linux = "x86"; x86_64-linux = "x64"; armv7l-linux = "arm"; aarch64-linux = "arm64"; }.${stdenv.buildPlatform.system}; + host_cpu = + { + i686-linux = "x86"; + x86_64-linux = "x64"; + armv7l-linux = "arm"; + aarch64-linux = "arm64"; + } + .${stdenv.buildPlatform.system}; #target_cpu = { i686-linux = "x86"; x86_64-linux = "x64"; armv7l-linux = "arm"; aarch64-linux = "arm64"; }.${stdenv.hostPlatform.system}; } // customGnFlags; - deps = import (./vendor- + version + ".nix") { - inherit fetchgit fetchcipd fetchurl runCommand symlinkJoin; - platform = "linux-amd64"; # TODO: Figure out mapping for cipd platform - } // depsOverrides; - - src = runCommand "chromium-${version}-src" {} # TODO: changed from mkDerivation since it needs passAsFile or else this can get too big for the derivation: nixos "while setting up the build environment" "argument list too long" + deps = + import (./vendor- + version + ".nix") { + inherit + fetchgit + fetchcipd + fetchurl + runCommand + symlinkJoin + ; + platform = "linux-amd64"; # TODO: Figure out mapping for cipd platform + } + // depsOverrides; + + src = + runCommand "chromium-${version}-src" { } # TODO: changed from mkDerivation since it needs passAsFile or else this can get too big for the derivation: nixos "while setting up the build environment" "argument list too long" # 's `linkFarm` or `buildEnv` would work here if they supported nested paths - (lib.concatStringsSep "\n" ( - lib.mapAttrsToList (path: src: '' - echo mkdir -p $(dirname "$out/${path}") - mkdir -p $(dirname "$out/${path}") - if [[ -d "${src}" ]]; then - echo cp -r "${src}/." "$out/${path}" - cp -r "${src}/." "$out/${path}" - else - echo cp -r "${src}" "$out/${path}" - cp -r "${src}" "$out/${path}" - fi - chmod -R u+w "$out/${path}" - '') deps # Use ${src}/. in case $out/${path} already exists, so it copies the contents to that directory. - ) + - # introduce files missing in git repos - '' - echo 'LASTCHANGE=${deps."src".rev}-refs/heads/master@{#0}' > $out/src/build/util/LASTCHANGE - echo '1555555555' > $out/src/build/util/LASTCHANGE.committime - - echo '/* Generated by lastchange.py, do not edit.*/' > $out/src/gpu/config/gpu_lists_version.h - echo '#ifndef GPU_CONFIG_GPU_LISTS_VERSION_H_' >> $out/src/gpu/config/gpu_lists_version.h - echo '#define GPU_CONFIG_GPU_LISTS_VERSION_H_' >> $out/src/gpu/config/gpu_lists_version.h - echo '#define GPU_LISTS_VERSION "${deps."src".rev}"' >> $out/src/gpu/config/gpu_lists_version.h - echo '#endif // GPU_CONFIG_GPU_LISTS_VERSION_H_' >> $out/src/gpu/config/gpu_lists_version.h - - echo '/* Generated by lastchange.py, do not edit.*/' > $out/src/skia/ext/skia_commit_hash.h - echo '#ifndef SKIA_EXT_SKIA_COMMIT_HASH_H_' >> $out/src/skia/ext/skia_commit_hash.h - echo '#define SKIA_EXT_SKIA_COMMIT_HASH_H_' >> $out/src/skia/ext/skia_commit_hash.h - echo '#define SKIA_COMMIT_HASH "${deps."src/third_party/skia".rev}-"' >> $out/src/skia/ext/skia_commit_hash.h - echo '#endif // SKIA_EXT_SKIA_COMMIT_HASH_H_' >> $out/src/skia/ext/skia_commit_hash.h - ''); + ( + lib.concatStringsSep "\n" ( + lib.mapAttrsToList (path: src: '' + echo mkdir -p $(dirname "$out/${path}") + mkdir -p $(dirname "$out/${path}") + if [[ -d "${src}" ]]; then + echo cp -r "${src}/." "$out/${path}" + cp -r "${src}/." "$out/${path}" + else + echo cp -r "${src}" "$out/${path}" + cp -r "${src}" "$out/${path}" + fi + chmod -R u+w "$out/${path}" + '') deps # Use ${src}/. in case $out/${path} already exists, so it copies the contents to that directory. + ) + + + # introduce files missing in git repos + '' + echo 'LASTCHANGE=${deps."src".rev}-refs/heads/master@{#0}' > $out/src/build/util/LASTCHANGE + echo '1555555555' > $out/src/build/util/LASTCHANGE.committime + + echo '/* Generated by lastchange.py, do not edit.*/' > $out/src/gpu/config/gpu_lists_version.h + echo '#ifndef GPU_CONFIG_GPU_LISTS_VERSION_H_' >> $out/src/gpu/config/gpu_lists_version.h + echo '#define GPU_CONFIG_GPU_LISTS_VERSION_H_' >> $out/src/gpu/config/gpu_lists_version.h + echo '#define GPU_LISTS_VERSION "${deps."src".rev}"' >> $out/src/gpu/config/gpu_lists_version.h + echo '#endif // GPU_CONFIG_GPU_LISTS_VERSION_H_' >> $out/src/gpu/config/gpu_lists_version.h + + echo '/* Generated by lastchange.py, do not edit.*/' > $out/src/skia/ext/skia_commit_hash.h + echo '#ifndef SKIA_EXT_SKIA_COMMIT_HASH_H_' >> $out/src/skia/ext/skia_commit_hash.h + echo '#define SKIA_EXT_SKIA_COMMIT_HASH_H_' >> $out/src/skia/ext/skia_commit_hash.h + echo '#define SKIA_COMMIT_HASH "${ + deps."src/third_party/skia".rev + }-"' >> $out/src/skia/ext/skia_commit_hash.h + echo '#endif // SKIA_EXT_SKIA_COMMIT_HASH_H_' >> $out/src/skia/ext/skia_commit_hash.h + '' + ); # Use the prebuilt one from CIPD gn = stdenv.mkDerivation { @@ -143,16 +230,39 @@ let ''; }; -in stdenvNoCC.mkDerivation rec { +in +stdenvNoCC.mkDerivation rec { pname = name; inherit version src; - nativeBuildInputs = [ gn ninja pkg-config jre8 gperf bison nodejs ] ++ + nativeBuildInputs = + [ + gn + ninja + pkg-config + jre8 + gperf + bison + nodejs + ] + ++ # Android stuff (from src/build/install-build-deps-android.sh) # Including some of the stuff from src/.vpython as well - [ bsdiff - (python2.withPackages (p: with p; [ ply setuptools ])) - (python3.withPackages (p: with p; [ ply jinja2 setuptools ])) + [ + bsdiff + (python2.withPackages ( + p: with p; [ + ply + setuptools + ] + )) + (python3.withPackages ( + p: with p; [ + ply + jinja2 + setuptools + ] + )) binutils # Needs readelf perl # Used by //third_party/libvpx buildenv @@ -160,82 +270,107 @@ in stdenvNoCC.mkDerivation rec { # Even though we are building for android, it still complains if its missing linux libs/headers>.. buildInputs = [ - dbus at-spi2-atk atk at-spi2-core nspr nss pciutils util-linux libkrb5 libxkbcommon - gdk-pixbuf glib gtk3 alsa-lib libXScrnSaver libXcursor libXtst libXdamage + dbus + at-spi2-atk + atk + at-spi2-core + nspr + nss + pciutils + util-linux + libkrb5 + libxkbcommon + gdk-pixbuf + glib + gtk3 + alsa-lib + libXScrnSaver + libXcursor + libXtst + libXdamage libdrm ]; requiredSystemFeatures = [ "big-parallel" ]; - patches = lib.optional ((lib.versionAtLeast version "84") && (lib.versionOlder version "85")) + patches = + lib.optional ((lib.versionAtLeast version "84") && (lib.versionOlder version "85")) # https://chromium-review.googlesource.com/c/chromium/src/+/2214390 - (fetchgerritpatchset { - domain = "chromium-review.googlesource.com"; - repo = "chromium/src"; - changeNumber = 2214390; - patchset = 2; - sha256 = "1kk4jf2zld1pm7x5ciq3jb0k7pdc8vnpyw96jj4w77crwl5q0833"; - }); - - - patchFlags = [ "-p1" "-d src" ]; + ( + fetchgerritpatchset { + domain = "chromium-review.googlesource.com"; + repo = "chromium/src"; + changeNumber = 2214390; + patchset = 2; + sha256 = "1kk4jf2zld1pm7x5ciq3jb0k7pdc8vnpyw96jj4w77crwl5q0833"; + } + ); + + patchFlags = [ + "-p1" + "-d src" + ]; # TODO: Much of the nixos-specific stuff could probably be made conditional - postPatch = lib.optionalString (lib.versionAtLeast version "91") '' - ( cd src - # Required for patchShebangs (unsupported) - chmod -x third_party/webgpu-cts/src/tools/${lib.optionalString (lib.versionAtLeast version "96") "run_"}deno - ) - '' - # Work around missing library when building md5sum_bin and monochrome. TODO: Hack - + lib.optionalString (lib.versionAtLeast version "97" && lib.versionOlder version "100") '' - cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/aarch64-linux-android/lib64/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libatomic.a - cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/arm-linux-androideabi/lib/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libatomic.a - cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/x86_64-linux-android/lib64/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libatomic.a - cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/i686-linux-android/lib/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libatomic.a - '' + lib.optionalString (lib.versionAtLeast version "100") '' - cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/12.0.5/lib/linux/aarch64/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libatomic.a - cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/12.0.5/lib/linux/arm/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libatomic.a - cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/12.0.5/lib/linux/x86_64/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libatomic.a - cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/12.0.5/lib/linux/i386/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libatomic.a - '' + '' - ( cd src - - # `patchShebangs --build .` would fail (see https://github.com/NixOS/nixpkgs/issues/99539) - for f in $(find . -type f -executable ! -regex '.+\.make$'); do - patchShebangs --build "$f" - done - - mkdir -p buildtools/linux64 - ln -s --force ${llvmPackages_11.clang.cc}/bin/clang-format buildtools/linux64/clang-format || true - - mkdir -p third_party/node/linux/node-linux-x64/bin - ln -s --force ${nodejs}/bin/node third_party/node/linux/node-linux-x64/bin/node || true - - # TODO: Have mk-vendor-file.py output this - echo 'build_with_chromium = true' > build/config/gclient_args.gni - echo 'checkout_android = true' >> build/config/gclient_args.gni - echo 'checkout_android_native_support = true' >> build/config/gclient_args.gni - echo 'checkout_google_benchmark = false' >> build/config/gclient_args.gni - echo 'checkout_ios_webkit = false' >> build/config/gclient_args.gni - echo 'checkout_nacl = false' >> build/config/gclient_args.gni - echo 'checkout_oculus_sdk = false' >> build/config/gclient_args.gni - echo 'checkout_openxr = false' >> build/config/gclient_args.gni - echo 'checkout_aemu = false' >> build/config/gclient_args.gni - echo 'checkout_libaom = false' >> build/config/gclient_args.gni - # Added sometime between 91.0.4472.120 and 91.0.4472.143 - echo 'generate_location_tags = false' >> build/config/gclient_args.gni - ) - '' + lib.optionalString enableRebranding '' - ( cd src - # Example from Vanadium's string-rebranding patch - sed -ri 's/(Google )?Chrom(e|ium)/${displayName}/g' chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd chrome/browser/ui/android/strings/android_chrome_strings.grd components/components_chromium_strings.grd components/new_or_sad_tab_strings.grdp components/security_interstitials_strings.grdp chrome/android/java/res_chromium_base/values/channel_constants.xml - find components/strings/ -name '*.xtb' -exec sed -ri 's/(Google )?Chrom(e|ium)/${displayName}/g' {} + - find chrome/browser/ui/android/strings/translations -name '*.xtb' -exec sed -ri 's/(Google )?Chrom(e|ium)/${displayName}/g' {} + - - sed -ri 's/Android System WebView/${displayName} Webview/g' android_webview/nonembedded/java/AndroidManifest.xml - ) - ''; + postPatch = + lib.optionalString (lib.versionAtLeast version "91") '' + ( cd src + # Required for patchShebangs (unsupported) + chmod -x third_party/webgpu-cts/src/tools/${lib.optionalString (lib.versionAtLeast version "96") "run_"}deno + ) + '' + # Work around missing library when building md5sum_bin and monochrome. TODO: Hack + + lib.optionalString (lib.versionAtLeast version "97" && lib.versionOlder version "100") '' + cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/aarch64-linux-android/lib64/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libatomic.a + cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/arm-linux-androideabi/lib/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libatomic.a + cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/x86_64-linux-android/lib64/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libatomic.a + cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/i686-linux-android/lib/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libatomic.a + '' + + lib.optionalString (lib.versionAtLeast version "100") '' + cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/12.0.5/lib/linux/aarch64/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libatomic.a + cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/12.0.5/lib/linux/arm/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libatomic.a + cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/12.0.5/lib/linux/x86_64/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libatomic.a + cp src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/12.0.5/lib/linux/i386/libatomic.a src/third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libatomic.a + '' + + '' + ( cd src + + # `patchShebangs --build .` would fail (see https://github.com/NixOS/nixpkgs/issues/99539) + for f in $(find . -type f -executable ! -regex '.+\.make$'); do + patchShebangs --build "$f" + done + + mkdir -p buildtools/linux64 + ln -s --force ${llvmPackages_11.clang.cc}/bin/clang-format buildtools/linux64/clang-format || true + + mkdir -p third_party/node/linux/node-linux-x64/bin + ln -s --force ${nodejs}/bin/node third_party/node/linux/node-linux-x64/bin/node || true + + # TODO: Have mk-vendor-file.py output this + echo 'build_with_chromium = true' > build/config/gclient_args.gni + echo 'checkout_android = true' >> build/config/gclient_args.gni + echo 'checkout_android_native_support = true' >> build/config/gclient_args.gni + echo 'checkout_google_benchmark = false' >> build/config/gclient_args.gni + echo 'checkout_ios_webkit = false' >> build/config/gclient_args.gni + echo 'checkout_nacl = false' >> build/config/gclient_args.gni + echo 'checkout_oculus_sdk = false' >> build/config/gclient_args.gni + echo 'checkout_openxr = false' >> build/config/gclient_args.gni + echo 'checkout_aemu = false' >> build/config/gclient_args.gni + echo 'checkout_libaom = false' >> build/config/gclient_args.gni + # Added sometime between 91.0.4472.120 and 91.0.4472.143 + echo 'generate_location_tags = false' >> build/config/gclient_args.gni + ) + '' + + lib.optionalString enableRebranding '' + ( cd src + # Example from Vanadium's string-rebranding patch + sed -ri 's/(Google )?Chrom(e|ium)/${displayName}/g' chrome/browser/touch_to_fill/android/internal/java/strings/android_touch_to_fill_strings.grd chrome/browser/ui/android/strings/android_chrome_strings.grd components/components_chromium_strings.grd components/new_or_sad_tab_strings.grdp components/security_interstitials_strings.grdp chrome/android/java/res_chromium_base/values/channel_constants.xml + find components/strings/ -name '*.xtb' -exec sed -ri 's/(Google )?Chrom(e|ium)/${displayName}/g' {} + + find chrome/browser/ui/android/strings/translations -name '*.xtb' -exec sed -ri 's/(Google )?Chrom(e|ium)/${displayName}/g' {} + + + sed -ri 's/Android System WebView/${displayName} Webview/g' android_webview/nonembedded/java/AndroidManifest.xml + ) + ''; configurePhase = '' # attept to fix python2 failing with "EOFError: EOF read where object expected" on multi-core builders diff --git a/apks/chromium/vanadium.nix b/apks/chromium/vanadium.nix index 12d35313..a85a7cc0 100644 --- a/apks/chromium/vanadium.nix +++ b/apks/chromium/vanadium.nix @@ -1,7 +1,14 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ chromium, fetchFromGitHub, git, fetchcipd, linkFarmFromDrvs, fetchurl }: +{ + chromium, + fetchFromGitHub, + git, + fetchcipd, + linkFarmFromDrvs, + fetchurl, +}: let vanadium_src = fetchFromGitHub { @@ -10,7 +17,8 @@ let rev = "SP2A.220405.003.2022041600"; sha256 = "188nh6wc3y47dwy5nkzzmgdxs96pz6l84nl0ksfx0rv910kz2dg9"; }; -in (chromium.override { +in +(chromium.override { name = "vanadium"; displayName = "Vanadium"; version = "100.0.4896.127"; @@ -38,35 +46,44 @@ in (chromium.override { }; # Needed for patces/0082-update-dependencies.patch depsOverrides = { - "src/third_party/android_deps/libs/com_google_android_gms_play_services_base" = linkFarmFromDrvs "play-services-base" [ - (fetchurl { - name = "play-services-base-18.0.1.aar"; - url = "https://maven.google.com/com/google/android/gms/play-services-base/18.0.1/play-services-base-18.0.1.aar"; - sha256 = "1pl3is31asnvz26d417wxw532p72mm2wxfav55kj3r9b8dpxg5i8"; - }) - ]; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_basement" = linkFarmFromDrvs "play-services-basement" [ - (fetchurl { - name = "play-services-basement-18.0.0.aar"; - url = "https://maven.google.com/com/google/android/gms/play-services-basement/18.0.0/play-services-basement-18.0.0.aar"; - sha256 = "1mlxkysargkd8samkzfxbyilla3n9563hlijkwwjs6lhcxs7gham"; - }) - ]; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_tasks" = linkFarmFromDrvs "play-services-tasks" [ - (fetchurl { - name = "play-services-tasks-18.0.1.aar"; - url = "https://maven.google.com/com/google/android/gms/play-services-tasks/18.0.1/play-services-tasks-18.0.1.aar"; - sha256 = "108nxfl87hm8rg6pvymkbqszfbyhxi5c9bd72l9qxyncqr4dn1pi"; - }) - ]; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_base" = + linkFarmFromDrvs "play-services-base" + [ + (fetchurl { + name = "play-services-base-18.0.1.aar"; + url = "https://maven.google.com/com/google/android/gms/play-services-base/18.0.1/play-services-base-18.0.1.aar"; + sha256 = "1pl3is31asnvz26d417wxw532p72mm2wxfav55kj3r9b8dpxg5i8"; + }) + ]; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_basement" = + linkFarmFromDrvs "play-services-basement" + [ + (fetchurl { + name = "play-services-basement-18.0.0.aar"; + url = "https://maven.google.com/com/google/android/gms/play-services-basement/18.0.0/play-services-basement-18.0.0.aar"; + sha256 = "1mlxkysargkd8samkzfxbyilla3n9563hlijkwwjs6lhcxs7gham"; + }) + ]; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_tasks" = + linkFarmFromDrvs "play-services-tasks" + [ + (fetchurl { + name = "play-services-tasks-18.0.1.aar"; + url = "https://maven.google.com/com/google/android/gms/play-services-tasks/18.0.1/play-services-tasks-18.0.1.aar"; + sha256 = "108nxfl87hm8rg6pvymkbqszfbyhxi5c9bd72l9qxyncqr4dn1pi"; + }) + ]; }; -}).overrideAttrs (attrs: { - # Use git apply below since some of these patches use "git binary diff" format - postPatch = '' - ( cd src - for patchfile in ${vanadium_src}/patches/*.patch; do - ${git}/bin/git apply --unsafe-paths $patchfile - done - ) - '' + attrs.postPatch; -}) +}).overrideAttrs + (attrs: { + # Use git apply below since some of these patches use "git binary diff" format + postPatch = + '' + ( cd src + for patchfile in ${vanadium_src}/patches/*.patch; do + ${git}/bin/git apply --unsafe-paths $patchfile + done + ) + '' + + attrs.postPatch; + }) diff --git a/apks/chromium/vendor-100.0.4896.127.nix b/apks/chromium/vendor-100.0.4896.127.nix index 04bb79f3..59613cfc 100644 --- a/apks/chromium/vendor-100.0.4896.127.nix +++ b/apks/chromium/vendor-100.0.4896.127.nix @@ -1,392 +1,1947 @@ # GENERATED BY 'mk-vendor-file.py 100.0.4896.127' for unix, android -{fetchgit, fetchcipd, fetchurl, runCommand, symlinkJoin, platform}: { - "src" = fetchgit { url = "https://chromium.googlesource.com/chromium/src.git" ; rev = "868b46452cfe324558c39dbf9182f86a609296db"; sha256 = "0jw769204zn9syz66rrqcv6wl88vqznmbycvnk9gq43hw3bbmkqn"; fetchSubmodules = true; }; - "src/android_webview/tools/cts_archive" = fetchcipd { package = "chromium/android_webview/tools/cts_archive"; version = "ai8Ig4HlO0vG6aP_JP2uhyruE2yPzze8PFP1g8Z4_hgC"; sha256 = "0lxgxd75lqsk7jpgx5gmkskmkz22mvmzrh82l3dh0z53b0ibb14v"; }; - "src/buildtools/clang_format/script" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git" ; rev = "e435ad79c17b1888b34df88d6a30a094936e3836"; sha256 = "0ifdbxg283v2zz5s6iy9b2iyynrzbzbsifpc5m90dq48743vb963"; fetchSubmodules = true; }; - "src/buildtools/linux64" = fetchcipd { package = "gn/gn/linux-amd64"; version = "git_revision:0725d7827575b239594fbc8fd5192873a1d62f44"; sha256 = "1y8csayrd9653fwyzw07l29i1dmb5jvwzrygks3ayh1d1yqbq36p"; }; - "src/buildtools/third_party/libc++/trunk" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git" ; rev = "79a2e924d96e2fc1e4b937c42efd08898fa472d7"; sha256 = "1k00bcyh3061k0cy0z7b03kiimfjxksmnyfk6vxhfl4kqhn3wx4z"; fetchSubmodules = true; }; - "src/buildtools/third_party/libc++abi/trunk" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git" ; rev = "738dc100c61890744f9e78cac27c71d0a2190781"; sha256 = "0k8nnjr3n7h0vzjzc02y2jhlamak49brliq8nzxcdl8z2dmj7kxh"; fetchSubmodules = true; }; - "src/buildtools/third_party/libunwind/trunk" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git" ; rev = "75396220433652a698b05c5fb648fe1f5e1d7a27"; sha256 = "04cqsbypd66n3jhnq2kmdvhkz46vr8fv8lsyf5g7ygkqjkd98x9a"; fetchSubmodules = true; }; - "src/chrome/test/data/perf/canvas_bench" = fetchgit { url = "https://chromium.googlesource.com/chromium/canvas_bench.git" ; rev = "a7b40ea5ae0239517d78845a5fc9b12976bfc732"; sha256 = "0cs215p1353dfp0s8x33jhz7ih0fh9ajwwax6d5q15la274axwxj"; fetchSubmodules = true; }; - "src/chrome/test/data/perf/frame_rate/content" = fetchgit { url = "https://chromium.googlesource.com/chromium/frame_rate/content.git" ; rev = "c10272c88463efeef6bb19c9ec07c42bc8fe22b9"; sha256 = "0yi9xc0qihr1pw9fllsy9x9p19211p534qn7j70l7bply6x1r2dp"; fetchSubmodules = true; }; - "src/chrome/test/data/xr/webvr_info" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/toji/webvr.info.git" ; rev = "c58ae99b9ff9e2aa4c524633519570bf33536248"; sha256 = "1s7131k4m20cpmsb0jhmz1sqmnhld8n8fsirs7i6l498rv0hzh06"; fetchSubmodules = true; }; - "src/docs/website" = fetchgit { url = "https://chromium.googlesource.com/website.git" ; rev = "66779576a0d84e821a11e288acc94859fdcbe0bd"; sha256 = "106qw68w6ndwj1hl4zf7rzffnqx826cqg3l281vcd054pvb90xpd"; fetchSubmodules = true; }; - "src/media/cdm/api" = fetchgit { url = "https://chromium.googlesource.com/chromium/cdm.git" ; rev = "fc5afac6847dc61addc1177103aa602e71a9ecac"; sha256 = "0yai4nk0p4qkbn61sjs2g6yapraqbzy0amkw1wrdqb7rajhn0aqi"; fetchSubmodules = true; }; - "src/native_client" = fetchgit { url = "https://chromium.googlesource.com/native_client/src/native_client.git" ; rev = "7adc7525b68ffb888135f9541bde1b1f62ca5b70"; sha256 = "0sanjp8yh1ffnd4kcj4b3l9jxigjg7c712aa9061f17skxi6bm5b"; fetchSubmodules = true; }; - "src/net/third_party/quiche/src" = fetchgit { url = "https://quiche.googlesource.com/quiche.git" ; rev = "a778d65990c3be7b6eafac08d14c345d1090eec2"; sha256 = "0man8pykmb65vln41z6s0wfvn2bw5pr55il3lpr0v5p21dpgj6zr"; fetchSubmodules = true; }; - "src/third_party/accessibility_test_framework" = fetchcipd { package = "chromium/third_party/accessibility-test-framework"; version = "b5ec1e56e58e56bc1a0c77d43111c37f9b512c8a"; sha256 = "0q4bb1nylbaals9b9qrd5c0f62nlyr2np0g6i8fbvawwrbr7qxrm"; }; - "src/third_party/android_build_tools/aapt2" = fetchcipd { package = "chromium/third_party/android_build_tools/aapt2"; version = "yQIf5Ev_-q9u6Pr_a0APd1dHcImJSmotVADw4Pj151QC"; sha256 = "1i7c9yiwlgrqg6ca85k1m39dcakvqr5fqlh2vs8x11rx70bzykka"; }; - "src/third_party/android_build_tools/art" = fetchcipd { package = "chromium/third_party/android_build_tools/art"; version = "87169fbc701d244c311e6aa8843591a7f1710bc0"; sha256 = "0p6yn4rzavyd16krq29wnbw97fmak4qd47zmk7d3wq0jbzjqj18m"; }; - "src/third_party/android_build_tools/bundletool" = fetchcipd { package = "chromium/third_party/android_build_tools/bundletool"; version = "2ZcLVDxyRwp8FzpeYLtLT0TfSRweZxvwh1-Kx1jZ_FoC"; sha256 = "0b39ygw9qk4bv7q20j378q1xmx0xdcgqsd6xfvc1vka6avwlb5nr"; }; - "src/third_party/android_deps/libs/android_arch_core_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_core_common"; version = "version:2@1.1.1.cr0"; sha256 = "183y5pijhr2dypkm1dfy5yc88p477razlq73kzd72c0gz5z6kwpy"; }; - "src/third_party/android_deps/libs/android_arch_core_runtime" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_core_runtime"; version = "version:2@1.1.1.cr0"; sha256 = "0g0akycdbr9chy0gswpklwzw8m6cpb7242vnnvpzqfhjdcjg5fba"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_common"; version = "version:2@1.1.1.cr0"; sha256 = "0x3mdil15ld7rlm0n0x53fsz81dc7vx1pccwz7klb4zdl9w3mxbr"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_common_java8" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_common_java8"; version = "version:2@1.1.1.cr0"; sha256 = "0b464w5argc8sajrwqnzizhh0chi9vl1vbnrc76rxifjg2ym6fgh"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_livedata" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata"; version = "version:2@1.1.1.cr0"; sha256 = "18bf42hfbdjhi7f0lx8zvsn3372m69j5xdjrwgas26a32dg7n5yj"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_livedata_core" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata_core"; version = "version:2@1.1.1.cr0"; sha256 = "1wws684w3qwyhp715ia78pvk16w3jaj40a3vvbndnzfcglyrg2a8"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_runtime" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_runtime"; version = "version:2@1.1.1.cr0"; sha256 = "1d4kr0js2xxcy0bgjwnz0sacwrq9b2knmdkysh0130vp0fv9i44v"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_viewmodel" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_viewmodel"; version = "version:2@1.1.1.cr0"; sha256 = "1fs0w8nk9rnjv7rvc70111sqdvp9579c63phv61j978wkfq349cy"; }; - "src/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent" = fetchcipd { package = "chromium/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent"; version = "version:2@3.1.cr0"; sha256 = "1k4z2zgc07bk0pnckbc7m5xph71vn4zkrl95jnzw8xwk46qbli7n"; }; - "src/third_party/android_deps/libs/classworlds_classworlds" = fetchcipd { package = "chromium/third_party/android_deps/libs/classworlds_classworlds"; version = "version:2@1.1-alpha-2.cr0"; sha256 = "1y5p5m7wykp1rc6dz700jqjbqkwzrv4zjdapfnja9cxmgwdwvlgr"; }; - "src/third_party/android_deps/libs/com_android_support_animated_vector_drawable" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_animated_vector_drawable"; version = "version:2@28.0.0.cr0"; sha256 = "1xmq1l0ms4i3f1lsrman1ans7z2cfjaw5bxd02g9jzq7ar0g07k6"; }; - "src/third_party/android_deps/libs/com_android_support_appcompat_v7" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_appcompat_v7"; version = "version:2@28.0.0.cr0"; sha256 = "1xka020529x68sx2jmfl5vmrdr8k1k97dk4k6p2nkf80gsd9kswi"; }; - "src/third_party/android_deps/libs/com_android_support_asynclayoutinflater" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_asynclayoutinflater"; version = "version:2@28.0.0.cr0"; sha256 = "1dk1gwvph89mbgaj1hmfiqyndgjhgb9vqsaqz48lqvq8a8mj9whd"; }; - "src/third_party/android_deps/libs/com_android_support_cardview_v7" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_cardview_v7"; version = "version:2@28.0.0.cr0"; sha256 = "0xynb0mssa0zyiy34lxjsvymg5zrfxqg5rfv254ibm531ar0s7c9"; }; - "src/third_party/android_deps/libs/com_android_support_collections" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_collections"; version = "version:2@28.0.0.cr0"; sha256 = "0gy8gnin8hljn4shmxfj6k4ahmwpx5m9lsz2630m63zqiplvhmls"; }; - "src/third_party/android_deps/libs/com_android_support_coordinatorlayout" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_coordinatorlayout"; version = "version:2@28.0.0.cr0"; sha256 = "047fi1kh08gkkcv1kcqizjq7qn9xcc5rgs6l33ypckrm9xlpf6w7"; }; - "src/third_party/android_deps/libs/com_android_support_cursoradapter" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_cursoradapter"; version = "version:2@28.0.0.cr0"; sha256 = "06z3ba5bqcqv1379aj16pvqcs09pff2ss8sjwah3w6yp0bw46i1i"; }; - "src/third_party/android_deps/libs/com_android_support_customview" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_customview"; version = "version:2@28.0.0.cr0"; sha256 = "1vhd792m113r7s13jly2fc2l72h6lqs99fjynlvh7ppfsl3ha16n"; }; - "src/third_party/android_deps/libs/com_android_support_design" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_design"; version = "version:2@28.0.0.cr0"; sha256 = "0q6ygv1h3lbmz20b989w2p0sf0bh69537xwkmin1xbw7bm357wk4"; }; - "src/third_party/android_deps/libs/com_android_support_documentfile" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_documentfile"; version = "version:2@28.0.0.cr0"; sha256 = "0s6wnbdsfxabgy7j2d3yh0nkz7zkjn22ngswmq3jgd7ymlpvldbn"; }; - "src/third_party/android_deps/libs/com_android_support_drawerlayout" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_drawerlayout"; version = "version:2@28.0.0.cr0"; sha256 = "1gymfjq1dnrj6yp77pvm7hpqfwq2v5l2z92jvdsrkp3dj3c04q2l"; }; - "src/third_party/android_deps/libs/com_android_support_interpolator" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_interpolator"; version = "version:2@28.0.0.cr0"; sha256 = "0j73f8dwxip1ad312x66d5iw39dc45gzbm0p56qd113dv6nq7jpf"; }; - "src/third_party/android_deps/libs/com_android_support_loader" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_loader"; version = "version:2@28.0.0.cr0"; sha256 = "1mwj2q0xppama4sw8j41krqnbs6qqjbas6gdr89r3laxvhfhfj1j"; }; - "src/third_party/android_deps/libs/com_android_support_localbroadcastmanager" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_localbroadcastmanager"; version = "version:2@28.0.0.cr0"; sha256 = "06895mn7r86z02xjfz2vxw1114zhsby4jbc8m20g7n5irpzvcscv"; }; - "src/third_party/android_deps/libs/com_android_support_multidex" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_multidex"; version = "version:2@1.0.0.cr0"; sha256 = "0cxvhw4sfxmc9czbrwy365949vinnjwrp3i4a74pvg35sm2wasgx"; }; - "src/third_party/android_deps/libs/com_android_support_print" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_print"; version = "version:2@28.0.0.cr0"; sha256 = "0bhgwpw62wvzpjrkjp8vq0b05cn040x6i97hdvvkrq9nn6qrlnvh"; }; - "src/third_party/android_deps/libs/com_android_support_recyclerview_v7" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_recyclerview_v7"; version = "version:2@28.0.0.cr0"; sha256 = "00gr45k3jnb8h2kmij6p0p2irgkvxxqmj7idl7afl1ip4z6nm71c"; }; - "src/third_party/android_deps/libs/com_android_support_slidingpanelayout" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_slidingpanelayout"; version = "version:2@28.0.0.cr0"; sha256 = "1n9lgjwcpb8w7wjixv935khkrphw0nbg2ww87gqh8jb82pj6k0fs"; }; - "src/third_party/android_deps/libs/com_android_support_support_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_annotations"; version = "version:2@28.0.0.cr0"; sha256 = "0dda57cs8yvdpbi7jaw50ndvf4szhm9alk1iszq696m89flmky4n"; }; - "src/third_party/android_deps/libs/com_android_support_support_compat" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_compat"; version = "version:2@28.0.0.cr0"; sha256 = "1zc1341is7qw7wzdg87i1c7wibwyw0zjyb9mcn4pv1gcr66a3kqa"; }; - "src/third_party/android_deps/libs/com_android_support_support_core_ui" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_core_ui"; version = "version:2@28.0.0.cr0"; sha256 = "07xdb6n38zbh421g1shiwp46dlm2fiv5p5i89n5ra9npyydx9jya"; }; - "src/third_party/android_deps/libs/com_android_support_support_core_utils" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_core_utils"; version = "version:2@28.0.0.cr0"; sha256 = "1sw7xvn4zg4qa9fyd9jl6ric03jkp7a6pims54hif09dp6i79sz8"; }; - "src/third_party/android_deps/libs/com_android_support_support_fragment" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_fragment"; version = "version:2@28.0.0.cr0"; sha256 = "1wzdvxmvkk0vpxc43y9a5wxl177aw3npy5ssmv3z8gmyhmixv5bf"; }; - "src/third_party/android_deps/libs/com_android_support_support_media_compat" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_media_compat"; version = "version:2@28.0.0.cr0"; sha256 = "08fmh9xa2pn77viv97k9sscrkx5002hjmwhskf3c9nj8g7bd65gx"; }; - "src/third_party/android_deps/libs/com_android_support_support_v4" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_v4"; version = "version:2@28.0.0.cr0"; sha256 = "0l4sc961kx2w8yc8qf80ak383gsq940y4dfhshbfcb98k207fxvs"; }; - "src/third_party/android_deps/libs/com_android_support_support_vector_drawable" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_vector_drawable"; version = "version:2@28.0.0.cr0"; sha256 = "1gf7da8463fhm60ggmyp4hrkn7jrrpplmq8kqfxvd9p7vdn7jai0"; }; - "src/third_party/android_deps/libs/com_android_support_swiperefreshlayout" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_swiperefreshlayout"; version = "version:2@28.0.0.cr0"; sha256 = "0vv2aggcgbqza2sdkb75fgpi4kjysxnpw4zy2sx63y24vzbf8ld0"; }; - "src/third_party/android_deps/libs/com_android_support_transition" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_transition"; version = "version:2@28.0.0.cr0"; sha256 = "0nqgiwc7rcfnlkf8p896bylfvfycjkcxdvs41rjcyarc6d8wxa4y"; }; - "src/third_party/android_deps/libs/com_android_support_versionedparcelable" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_versionedparcelable"; version = "version:2@28.0.0.cr0"; sha256 = "16mp3wijcs7473szl35dvbji6w41cfjm8hkkic4c67gqxb4b8g18"; }; - "src/third_party/android_deps/libs/com_android_support_viewpager" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_viewpager"; version = "version:2@28.0.0.cr0"; sha256 = "02xilasqj0ik476dpdx3lk0xxqij9za8vcgldhyiwikh60hkq86c"; }; - "src/third_party/android_deps/libs/com_android_tools_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_common"; version = "version:2@30.2.0-beta01.cr0"; sha256 = "1h8ng5z5ac3fr1q18v2xn6vm2zja3yhzv98fwgyr9ffsvk9wf3qm"; }; - "src/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs"; version = "version:2@1.1.5.cr1"; sha256 = "1zg0lpyx03qb48b4bhpwcz0n3g2vpc60gx1gdkpg3gvn4n2z1wkr"; }; - "src/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration"; version = "version:2@1.1.5.cr1"; sha256 = "0gwyygyiwjqcffq88v7v3pw9qz3xvfr6nr5v2q5h87sf17w5q7bh"; }; - "src/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api"; version = "version:2@30.2.0-beta01.cr0"; sha256 = "0a1iwi1p11v2mgf6826x1kxg2jzvr1xbkf5jy232mrghh26w9wvy"; }; - "src/third_party/android_deps/libs/com_android_tools_sdk_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_sdk_common"; version = "version:2@30.2.0-beta01.cr0"; sha256 = "0fx75xprag7i5iylp75r10x9fcr2i7r2jnspaa0vdbi72fhi04dd"; }; - "src/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine"; version = "version:2@2.8.8.cr0"; sha256 = "0j8s8ys4w4f072lwfidmv9xmmfqg0s0s03zhp51if1g46bxqggij"; }; - "src/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms"; version = "version:2@1.0.cr0"; sha256 = "1q2gd5pprgwlpq982dgb747kmh4h0v1agl1wa755ybjwcwnq17dn"; }; - "src/third_party/android_deps/libs/com_google_android_datatransport_transport_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_datatransport_transport_api"; version = "version:2@2.2.1.cr0"; sha256 = "06ww0c1dbzf6i62n2wrag5l0iq68kccrfgf47h2356g8j90pisnb"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth"; version = "version:2@17.0.0.cr0"; sha256 = "0s2m4d6s3p2bc1wc3mcb2qc9wzh7c3pibv4i541r0gc0vw7krih2"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone"; version = "version:2@17.5.0.cr0"; sha256 = "1qnaib8q0vasa9w3ad8aljir6rqm1kvg4sa72jv4rxlmvsjp60x3"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base"; version = "version:2@17.0.0.cr0"; sha256 = "1f6rixxs1597iiw04smrprplhg6rp7a7i66d4n3nsi7asgmi4g96"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_base" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_base"; version = "version:2@17.5.0.cr0"; sha256 = "1vgyhdzsyll887xif4n882qz8ra2lxkiavmwfff0lqi8w7yxgkda"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_basement" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_basement"; version = "version:2@17.5.0.cr0"; sha256 = "1zbhrspj4cll1mnxjawxr6wssdmi9q9r0p8hi0mk1kzgkff44ndb"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_cast" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast"; version = "version:2@17.0.0.cr0"; sha256 = "0xkpymnsj3gh8c37b7kxpaghrhwgv6fyxnv39shkkp5zbynpj6vi"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework"; version = "version:2@17.0.0.cr0"; sha256 = "0cgic5rscg8gack8nq1k22flg5caaxg6zvsm2kk1z1dbplhr9giz"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut"; version = "version:2@17.0.0.cr0"; sha256 = "0l5ylparlzynqks7kvrxck21lbpay6smnfxlhgz4zy6w82qb8inn"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging"; version = "version:2@16.0.0.cr0"; sha256 = "1rbnhmiqfvg2a1fbi5p9178p9xgvazlich227lz2sx32rggv4a7s"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_fido" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_fido"; version = "version:2@19.0.0-beta.cr0"; sha256 = "1vxsqg8ksb8allcq26ic5wxsfzm4argrawfdl6qsnbphi52r4150"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_flags" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_flags"; version = "version:2@17.0.0.cr0"; sha256 = "0bkkvhss45ghmc51n9316jkp29am0ymrk18l65nkfh19v921yw44"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_gcm" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_gcm"; version = "version:2@17.0.0.cr0"; sha256 = "09rkrv5akx7vydbi969z61b6wvgyzl4xl2m4l0vhdldcpfbp9lbv"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_iid" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_iid"; version = "version:2@17.0.0.cr0"; sha256 = "09m0jlnrzc9408p2piwr9n39s9c9bj0jxa0xm4a7nbypff51im2j"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps"; version = "version:2@17.0.0.cr0"; sha256 = "185r0vclirvvnr0vzxbi3zyywkbxbisahgky85zjvpf2270rz84k"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_location" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_location"; version = "version:2@17.0.0.cr0"; sha256 = "1vyni1fxsgn30q1xa0c0j2xzdmkjbv0cfg6j2j0n45nqiwbdw34q"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype"; version = "version:2@17.0.0.cr0"; sha256 = "1kk0sz6lhcbi6k35b8lq0inqplyzwiw18r20imk6g8s9bc0kwjgj"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport"; version = "version:2@17.0.0.cr0"; sha256 = "044xj4zvy18gjzli83lyxiky7kr9h498q3ssv0439vj4d84g1drk"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_stats" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_stats"; version = "version:2@17.0.0.cr0"; sha256 = "1y5mcgp84x77gsxmzcg69f93zl7xr37glmkkidh0b60n3g4givay"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_tasks" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_tasks"; version = "version:2@17.2.0.cr0"; sha256 = "1rbriq4wx2p7c5x0zmvvhv5772gkd2gyzprg4149cz4qrmkxjs03"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_vision" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision"; version = "version:2@18.0.0.cr0"; sha256 = "0am270a5db85z2nyw1y6r0s8axknmn8hhsyqndw4f79mjc1164v1"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common"; version = "version:2@18.0.0.cr0"; sha256 = "0mjmfysdgziis487kfhgmqwsfyg2bs8mh8cxzkv0vw35bmh578mv"; }; - "src/third_party/android_deps/libs/com_google_android_material_material" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_material_material"; version = "version:2@1.6.0-alpha01.cr0"; sha256 = "15adm09x6j5kksa2kvf1p1lcgqk24s23141ynz3bq943qm32chmg"; }; - "src/third_party/android_deps/libs/com_google_android_play_core" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_play_core"; version = "version:2@1.10.0.cr0"; sha256 = "1gl3ry64xrajrkaka48bi9hidcwiim1v89yc0h6vvb7kkk9cfjz2"; }; - "src/third_party/android_deps/libs/com_google_auto_auto_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_auto_auto_common"; version = "version:2@1.1.2.cr0"; sha256 = "0lyckf6vgg7frjalp0npjs640p72x8f50zfqwyghjwb8cm2ydv2i"; }; - "src/third_party/android_deps/libs/com_google_auto_service_auto_service" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_auto_service_auto_service"; version = "version:2@1.0-rc6.cr0"; sha256 = "0hf9jzqxy95v034ha776xnf3f8faghyrix2489nzl6sq2kc52mcw"; }; - "src/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations"; version = "version:2@1.0-rc6.cr0"; sha256 = "0n0jqc90f741xgk34654lggkzkqxadxy14qmaiy3dhsvvn126drx"; }; - "src/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations"; version = "version:2@1.7.cr0"; sha256 = "1za1d6il5gs78rf3flnhmkwd5l58lcj032av3psszsv5lv7jglm8"; }; - "src/third_party/android_deps/libs/com_google_code_findbugs_jformatstring" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_code_findbugs_jformatstring"; version = "version:2@3.0.0.cr0"; sha256 = "0b5g8z79g1wj6r2njpxjq76izfrx4kmc65dlmaw1ng6fjh4w108i"; }; - "src/third_party/android_deps/libs/com_google_code_findbugs_jsr305" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_code_findbugs_jsr305"; version = "version:2@3.0.2.cr0"; sha256 = "16iw2vv7wvpb63ih228ybsshnim23x1b5l75svvivk05cx27l2yq"; }; - "src/third_party/android_deps/libs/com_google_code_gson_gson" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_code_gson_gson"; version = "version:2@2.8.0.cr0"; sha256 = "0mchxd8zc8y8qyx9f3a02623kb0r6pn00pscbprgfb2vr547vgks"; }; - "src/third_party/android_deps/libs/com_google_dagger_dagger" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger"; version = "version:2@2.30.cr0"; sha256 = "11i2624s87b50drifl6rc2k3dnwwx8xll3jfwad7sid7pxq2h46k"; }; - "src/third_party/android_deps/libs/com_google_dagger_dagger_compiler" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_compiler"; version = "version:2@2.30.cr0"; sha256 = "1i5flcqxvgh0ihm70l5xyg9zvl3p80qh2nfl2fspw1zqj6763f3k"; }; - "src/third_party/android_deps/libs/com_google_dagger_dagger_producers" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_producers"; version = "version:2@2.30.cr0"; sha256 = "0vcplnf2m0hd914isjswvp8prnnih57fhxixhnngcgjjagygijx0"; }; - "src/third_party/android_deps/libs/com_google_dagger_dagger_spi" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_spi"; version = "version:2@2.30.cr0"; sha256 = "1jsljm97r1z7y2hn8k2jpmidx3r0l8bghmhi8nykasi4pjpgmssh"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation"; version = "version:2@2.10.0.cr0"; sha256 = "0ccklipp0v1nd5gjw8k0gb0x13pjs1j9bh7pfbn1m4gdrw3rgwvm"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations"; version = "version:2@2.10.0.cr0"; sha256 = "0x8g5hd1znvakcncy74ar0n0sjvnd7p2is8p0cqnb34v3l0pb502"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api"; version = "version:2@2.10.0.cr0"; sha256 = "06vq6nyc16pdj6hb8dgxl95cylnd6w7l99rxgl671fp8yz5cqasb"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_core" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_core"; version = "version:2@2.10.0.cr0"; sha256 = "0iahrp0sgl82kvhb1208dnh2gl93nv0ms58zk5bhadsq48wczypd"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations"; version = "version:2@2.10.0.cr0"; sha256 = "0jmcvmp54ifflvb09q7k75zwyv9fiabv5fi74996s7rfkypsk83i"; }; - "src/third_party/android_deps/libs/com_google_errorprone_javac" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_javac"; version = "version:2@9+181-r4173-1.cr0"; sha256 = "1h1xrshv2a3hx6x9x1mrwijpiyhrigimzp0ji4w4fnflyv52kzpc"; }; - "src/third_party/android_deps/libs/com_google_errorprone_javac_shaded" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_javac_shaded"; version = "version:2@9-dev-r4023-3.cr0"; sha256 = "01ag9435x9dqw0jidrl7nm5cflikh9pkxk8a1ywnq4c4d634g60m"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_annotations"; version = "version:2@16.0.0.cr0"; sha256 = "11rdw5aqwyb2nx9ni83gr6jmd4344jk5zvf1f3sm2bbij1js7hkj"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_common"; version = "version:2@19.5.0.cr0"; sha256 = "12fazvay20mqf0km2d4jyx1mfrxy4a0i5pqph8syh1lzm3b3y399"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_components" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_components"; version = "version:2@16.1.0.cr0"; sha256 = "1xly7a2qaxscp2p1hmkggsrlni325aj6z5y3sm5qhmazci4bxnm0"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_encoders" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders"; version = "version:2@16.1.0.cr0"; sha256 = "045ba4l7jvz53nn425w24jdgvlp1jwag2kb09q3pyiw6rwwqabfw"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json"; version = "version:2@17.1.0.cr0"; sha256 = "0zllj52nc7lv56wc6lvis0hxi1gii7y9frkvdfmmid6wrrlw00xx"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_iid" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid"; version = "version:2@21.0.1.cr0"; sha256 = "0v6x78z8qpdz07dqb9sbv98ij7ylj3x8lbbxlnxdgs3373pyg9q1"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop"; version = "version:2@17.0.0.cr0"; sha256 = "146kilgl7x7xigmpqzv1fcdsmwidirqqf6hclz9rmmx5mg42c53l"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_installations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations"; version = "version:2@16.3.5.cr0"; sha256 = "1x9nlyj9nphn6wfwnjkyizxgv21mvkpw2gs4cjj4m2ng44r73qs2"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop"; version = "version:2@16.0.1.cr0"; sha256 = "0kmv1r0vckl22qjmhmmbg6i0k1iqcdf61pswx8pkq31yvx1xahxk"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector"; version = "version:2@18.0.0.cr0"; sha256 = "115s741xrpazn0z2mi4arp2f2y02jxnlinag49h7yzr4f43p4qwy"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_messaging" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_messaging"; version = "version:2@21.0.1.cr0"; sha256 = "1fbjzf622qha3m8k5q1ks2ys2l7wz4qljbqfxb34x4xskkvdqfjk"; }; - "src/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java"; version = "version:2@2.0.3.cr0"; sha256 = "1whzndx6lf0k8dyyxb0fdinqd6lb7l1mkkgds1frxhfgg115dvyf"; }; - "src/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format"; version = "version:2@1.5.cr0"; sha256 = "16kp7w3c3skrjbx6g71k5wmh0a8ygm3fc9nxfn8kxh7qiy4axyqc"; }; - "src/third_party/android_deps/libs/com_google_guava_failureaccess" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_guava_failureaccess"; version = "version:2@1.0.1.cr0"; sha256 = "0z0mp28k0d59v41qmr3kinb4wyhpi2h12ppkjgx0kppw3nz7cbq4"; }; - "src/third_party/android_deps/libs/com_google_guava_guava" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_guava_guava"; version = "version:2@31.0-jre.cr0"; sha256 = "0fyvgj7x6an5a5zaq88xbapxa0r9j4izqwy83ml1qwlrlvi6xjnx"; }; - "src/third_party/android_deps/libs/com_google_guava_guava_android" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_guava_guava_android"; version = "version:2@31.0-android.cr0"; sha256 = "0wrfxqrpic10bcr2a2vjybqqnzcmnjmhl4xfxkah65aj9945x3p6"; }; - "src/third_party/android_deps/libs/com_google_guava_listenablefuture" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_guava_listenablefuture"; version = "version:2@1.0.cr0"; sha256 = "187dhlm3naks9dq0rw2710d566sfbckricxrzvskf9swmc6aw7q2"; }; - "src/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations"; version = "version:2@1.3.cr0"; sha256 = "166rvbzy6v2kdjljqj6xihi76f3i1nvmblmyb9bnx67biil4cxc5"; }; - "src/third_party/android_deps/libs/com_google_protobuf_protobuf_java" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_java"; version = "version:2@3.4.0.cr0"; sha256 = "18xdgm0qy8a1ms5lbdkmk7kh5dpxkg8icvqa7zhsii47sglr04hy"; }; - "src/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite"; version = "version:2@3.19.3.cr0"; sha256 = "0x2y8d0c3j02wjy9zn6jz9x5cn2min5dpyg7hmn6yssw5vww323d"; }; - "src/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils"; version = "version:2@1.3.0.cr0"; sha256 = "1zqbqnbs03i8c8xp2prj01acrg36w9mm0fjkxyjkppiwblcdhfih"; }; - "src/third_party/android_deps/libs/com_squareup_javapoet" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_squareup_javapoet"; version = "version:2@1.13.0.cr0"; sha256 = "1c0n842klp8rmdla7k35rya4wsam8wambb8j7c2mxvhn1vmwzs7a"; }; - "src/third_party/android_deps/libs/com_squareup_javawriter" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_squareup_javawriter"; version = "version:2@2.1.1.cr0"; sha256 = "066cj5sqnw32rcbzbf00695n8nlk6rjxfslxmmzkl9ka8r5d2ahf"; }; - "src/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils" = fetchcipd { package = "chromium/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils"; version = "version:2@4.0.cr0"; sha256 = "1jkdnma8wlcy4fiisbdihybhn783hq03pjm1pag0x25h0rx0h0yz"; }; - "src/third_party/android_deps/libs/javax_annotation_javax_annotation_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/javax_annotation_javax_annotation_api"; version = "version:2@1.3.2.cr0"; sha256 = "0h3ha41h7cj1rp30iwsyabzsmd9i1ydlzigljm65mrmpk8cni9vz"; }; - "src/third_party/android_deps/libs/javax_annotation_jsr250_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/javax_annotation_jsr250_api"; version = "version:2@1.0.cr0"; sha256 = "0lsp20gny3inm5k2cahyldizqm8xryb56lhdzripc5vw2fp5jady"; }; - "src/third_party/android_deps/libs/javax_inject_javax_inject" = fetchcipd { package = "chromium/third_party/android_deps/libs/javax_inject_javax_inject"; version = "version:2@1.cr0"; sha256 = "10wyr7izgi6n2fl2mi0kki2xkcp77nc42ar5pysf1dvh6d52h20d"; }; - "src/third_party/android_deps/libs/nekohtml_nekohtml" = fetchcipd { package = "chromium/third_party/android_deps/libs/nekohtml_nekohtml"; version = "version:2@1.9.6.2.cr0"; sha256 = "14id93112xhb47ic78acc6r6ypmcryq4hddvhmq927cd0klxf44n"; }; - "src/third_party/android_deps/libs/nekohtml_xercesminimal" = fetchcipd { package = "chromium/third_party/android_deps/libs/nekohtml_xercesminimal"; version = "version:2@1.9.6.2.cr0"; sha256 = "1w0x6z4792nvg69pfxkqpmqnfwdghdgfaajw68s3z522dzhrv3iz"; }; - "src/third_party/android_deps/libs/net_ltgt_gradle_incap_incap" = fetchcipd { package = "chromium/third_party/android_deps/libs/net_ltgt_gradle_incap_incap"; version = "version:2@0.2.cr0"; sha256 = "15zb0bfh59jccj43zndfh8v235jw37cr9j4nd3bj92anslyrz7ya"; }; - "src/third_party/android_deps/libs/net_sf_kxml_kxml2" = fetchcipd { package = "chromium/third_party/android_deps/libs/net_sf_kxml_kxml2"; version = "version:2@2.3.0.cr0"; sha256 = "11w4gzw2ygy9ifv64pi1dky7f20229phpxkkawr45cyy1cnkcl06"; }; - "src/third_party/android_deps/libs/org_apache_ant_ant" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_ant_ant"; version = "version:2@1.8.0.cr0"; sha256 = "0lqbgw8apkyx6sv9h273wn0k758zbkb2r6g9y9s93yc4m9lcpha2"; }; - "src/third_party/android_deps/libs/org_apache_ant_ant_launcher" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_ant_ant_launcher"; version = "version:2@1.8.0.cr0"; sha256 = "1r8rbxppalkdkrcajhwad3s2xidxp3a4kn7cngyyj6f6cvkd61an"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks"; version = "version:2@2.1.3.cr0"; sha256 = "0c0wpmzldl8xwxkmz7sg336a60g1dq90z1691wsy6nkjcbzx5fig"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_artifact" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact"; version = "version:2@2.2.1.cr0"; sha256 = "0sryj92ly4kl77z39454whnp86p9yi5mncdj4pn3rw46hgz5k464"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager"; version = "version:2@2.2.1.cr0"; sha256 = "1l4bbj7z9aw62acjnsnwz6bmhf147naffg95zzxwxf486dpzym0l"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics"; version = "version:2@2.2.1.cr0"; sha256 = "14njx071kqnqw6rxg1chz1pzgmxv8f6z4kqdkql8n5mmc4kygkzq"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_model" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_model"; version = "version:2@2.2.1.cr0"; sha256 = "0d5snhc9klrsz735ng4dzzp408jrwa9v4bh5cn9nkjf0azp9c504"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry"; version = "version:2@2.2.1.cr0"; sha256 = "1hxw7vgr2qcc9k9i4g5y6ixras23lfp434nzcycjis81ymj608qq"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_profile" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_profile"; version = "version:2@2.2.1.cr0"; sha256 = "06vk8m41p1xazq42xp700dh3izr1h4fsp1afan2lgp4jh9pnvyxk"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_project" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_project"; version = "version:2@2.2.1.cr0"; sha256 = "1q3fxdsiw6wd5zcx0zgskg5s8kwlq3x92hxgis84lpkz05jj33h3"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata"; version = "version:2@2.2.1.cr0"; sha256 = "13228089dpfz5n4i9zlm2wjqklv4s5gzbrr6vzbjxik5cl562a3f"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_settings" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_settings"; version = "version:2@2.2.1.cr0"; sha256 = "0gkf2z0cga4khhba2gp0cpk0l43d8x7xrppv42cl7p8znyxip6cs"; }; - "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file"; version = "version:2@1.0-beta-6.cr0"; sha256 = "0ap8mz7g1d29jka84jlaqvfgnjfp57pcv9jg79wbfja9xvfswvy9"; }; - "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight"; version = "version:2@1.0-beta-6.cr0"; sha256 = "0pj4lbq54c88pf5xzwf5inbc3083lnqmrb2n6xsyggrf79ir2mhj"; }; - "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared"; version = "version:2@1.0-beta-6.cr0"; sha256 = "0h3lfgn2aa0c2jrgdjlzhrhjxp8wj3b0hm8n96c9wnfp7dqrdiah"; }; - "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api"; version = "version:2@1.0-beta-6.cr0"; sha256 = "01cc4s4g4f9hcziap1p0529k8p7mqpscjc23qjvc7sv5jk9yd6dc"; }; - "src/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup"; version = "version:2@1.2.1.cr0"; sha256 = "03i164wm6lwqiqgzwwhjvhfwmj5hqpr5f6i6hzl75plkq90rxjhp"; }; - "src/third_party/android_deps/libs/org_checkerframework_checker_compat_qual" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_checkerframework_checker_compat_qual"; version = "version:2@2.5.5.cr0"; sha256 = "0v1nkl6fjpmy4w3h2cdkghc9s8sdyfdi5pmvmhvzpc536dk844i4"; }; - "src/third_party/android_deps/libs/org_checkerframework_checker_qual" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_checkerframework_checker_qual"; version = "version:2@3.12.0.cr0"; sha256 = "089ycxas3ya1abkm4kk1y7v1gz57dm159ld7mck6ha7rhis803kj"; }; - "src/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone"; version = "version:2@3.15.0.cr0"; sha256 = "0sgfknqkwl7c4zykrlx88qlp5jya7rnhyyb3cadkgc4bhbyb9kvc"; }; - "src/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations"; version = "version:2@1.17.cr0"; sha256 = "1xfchxaklc8w1rjj46yiqc3v9sljvzwp018yscb0wzqmrarv689q"; }; - "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default"; version = "version:2@1.0-alpha-9-stable-1.cr0"; sha256 = "1xvw9r8gz3cc6qw2mz165z3ib95ldi9kkagascd951nmvdacl06j"; }; - "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation"; version = "version:2@1.11.cr0"; sha256 = "1akvdbcmh0nramh97n0yw4ddgasr6f2ypgc853ni9g3rgafm4fcv"; }; - "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils"; version = "version:2@1.5.15.cr0"; sha256 = "1vmgr1dm88i7mjc82z5s29svhxy121zs1f39g22prwjygksdpilv"; }; - "src/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit"; version = "version:2@4.4.1.201607150455-r.cr0"; sha256 = "1086c3y6f213pnyizlr5aqy0x9f37xpjbpsl6mv5bvy8y6f8dvmw"; }; - "src/third_party/android_deps/libs/org_jetbrains_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_annotations"; version = "version:2@13.0.cr0"; sha256 = "1l75bqhnrbynaknclp7236wv1i4bhy4mwp0qnp4rl5hglxjdsg38"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib"; version = "version:2@1.6.10.cr0"; sha256 = "1wym3wh62xjki85y7gksq3nv8ism8in0gv4ar4pa3xhs1n64hyfd"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common"; version = "version:2@1.6.10.cr0"; sha256 = "1qsk426jqa7vdpzdfig2ricbdbggp1fkkaiarzh04nd47my02spi"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7"; version = "version:2@1.5.0.cr0"; sha256 = "038bblp1s0p06nx2f79dc3dnxwp9imrmjdyr3igh8mmn46lyr306"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8"; version = "version:2@1.5.0.cr0"; sha256 = "012yrnn7digalil885737ygf2fdhx3g294xszhcyr097289whv4m"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android"; version = "version:2@1.5.0.cr0"; sha256 = "05x6w0mj89qvvfxnb806mhnsf7p165da8cab4ns7vk1w9zvh3gjv"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm"; version = "version:2@1.5.0.cr0"; sha256 = "18sn0if3cxmram0r053bvy9xvl6kxbhi347h7vkdrq8sxh6sll5i"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm"; version = "version:2@0.1.0.cr0"; sha256 = "06b2iya1cvhflslnl5ij0hsha4jwgal64xwrl2l5i6yyzaii8mpm"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm"; version = "version:2@7.0.cr0"; sha256 = "1j2mxgrj76cr780xqawxylwcslnmgfh0fp8cnwb0lrz1qlspmvbv"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm_analysis" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_analysis"; version = "version:2@7.0.cr0"; sha256 = "1k7ghsaqb5d2xyx965prp39grpqajk7p4qpwzc3wvdxmgcxcb68s"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm_commons" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_commons"; version = "version:2@7.0.cr0"; sha256 = "1x0ck0bjcbirwkm8xh43w5y2ghwgrpvakzsszlwlnarawcadk0lz"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm_tree" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_tree"; version = "version:2@7.0.cr0"; sha256 = "18n8q2gxzw42icsa47nsp98ja0bgm63i91x1qgbn3pjm8fiax3q3"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm_util" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_util"; version = "version:2@7.0.cr0"; sha256 = "171s0xhdjsxmvm8pxzjkabdzl0nm1a29bylwxhsmz8i986xy56xr"; }; - "src/third_party/android_deps/libs/org_pcollections_pcollections" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_pcollections_pcollections"; version = "version:2@2.1.2.cr0"; sha256 = "1c8i3znyqjkhq4wi3qryvqramzjhkymczxxn0iiky4hij6gwajza"; }; - "src/third_party/android_deps/libs/org_robolectric_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_annotations"; version = "version:2@4.3.1.cr0"; sha256 = "1mpbd90ynigkvm74n9wfvp8f3zv87nyw1g88nihj7dcna03l4y05"; }; - "src/third_party/android_deps/libs/org_robolectric_junit" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_junit"; version = "version:2@4.3.1.cr0"; sha256 = "1cgpc8bx66x6i0kam05y4q17ikazzc19q2ykfdgpcwyj2kmca66g"; }; - "src/third_party/android_deps/libs/org_robolectric_pluginapi" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_pluginapi"; version = "version:2@4.3.1.cr0"; sha256 = "0r7fdjj09jmxah0lm7lbiy3ihw1g2myx3rbf4wky8pyvqxx589vi"; }; - "src/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver"; version = "version:2@4.3.1.cr0"; sha256 = "1nyrqpvvagvnvlb5k1yk89a8jndy510xd81j4gy8q2xxypdvwphq"; }; - "src/third_party/android_deps/libs/org_robolectric_resources" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_resources"; version = "version:2@4.3.1.cr0"; sha256 = "0mqyk7r1943h7bhz7kf5yhcd6cbp65swlabkxv7alr9svslzs5a9"; }; - "src/third_party/android_deps/libs/org_robolectric_robolectric" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_robolectric"; version = "version:2@4.3.1.cr0"; sha256 = "0k8qfnil5xl2pdf12qfcf49h9mzs1l612r7khdvnpa64l5npwa31"; }; - "src/third_party/android_deps/libs/org_robolectric_sandbox" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_sandbox"; version = "version:2@4.3.1.cr0"; sha256 = "126aws364b1bxmwspbn2jk2nzw2w8rrcrp03rl3ggnq26al6gysp"; }; - "src/third_party/android_deps/libs/org_robolectric_shadowapi" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_shadowapi"; version = "version:2@4.3.1.cr0"; sha256 = "0jnaxvm9hwz2fj8qgnpxdwbcnjph11qcrjp2nf5z0657gxbfwscj"; }; - "src/third_party/android_deps/libs/org_robolectric_shadows_framework" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_framework"; version = "version:2@4.3.1.cr0"; sha256 = "1gvqzlxmvlhgyd1q3fgds8fw679hmjqxaas6irjy0xnkj8qpyw1y"; }; - "src/third_party/android_deps/libs/org_robolectric_shadows_multidex" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_multidex"; version = "version:4.3.1-cr1"; sha256 = "1f4q4dspngfblqfdasydv64ik4bgw4jmrfb1686l5jv8dj27dn2k"; }; - "src/third_party/android_deps/libs/org_robolectric_shadows_playservices" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_playservices"; version = "version:2@4.3.1.cr0"; sha256 = "0ms20s8ds7mkslayngv9ll957zpxqr535ch7ykdfsfqqj3cvaj20"; }; - "src/third_party/android_deps/libs/org_robolectric_utils" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_utils"; version = "version:2@4.3.1.cr0"; sha256 = "022fpdpfhy63vcw7gvdp0knw5a3xf0ix9v4mf63bb8i2630zh53c"; }; - "src/third_party/android_deps/libs/org_robolectric_utils_reflector" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_utils_reflector"; version = "version:2@4.3.1.cr0"; sha256 = "1v5mz4rr6kqk2fg4kl26hsjhdwzaahdv6lkqkpiw6n908dcr4wdf"; }; - "src/third_party/android_ndk" = fetchgit { url = "https://chromium.googlesource.com/android_ndk.git" ; rev = "9644104c8cf85bf1bdce5b1c0691e9778572c3f8"; sha256 = "0wjkpsk5kns5mq1mscy0sia4pqxlcf97cl2kzdnp33mxa9mjgw6b"; fetchSubmodules = true; }; - "src/third_party/android_protobuf/src" = fetchgit { url = "https://android.googlesource.com/platform/external/protobuf.git" ; rev = "7fca48d8ce97f7ba3ab8eea5c472f1ad3711762f"; sha256 = "1icb2s3lp1vsximymk3cm8adwj7xk3awb4a7plxj88zqphydkk0d"; fetchSubmodules = true; }; - "src/third_party/android_protoc" = fetchcipd { package = "chromium/third_party/android_protoc"; version = "sLsJWojddBL2u8NYwNh6pJsqp_bL1ttmYIlBnhiIQ1QC"; sha256 = "00qag88lcvgz2f3krqlj8fgjy56ck3lkafk7dq8x6lxz1h1m5wim"; }; - "src/third_party/android_rust_toolchain/toolchain" = fetchcipd { package = "chromium/third_party/android_rust_toolchain/linux-amd64"; version = "BKAbvHjGv4-os-v8MS3I54bPsY-397xgaJ3yBeIVS20C"; sha256 = "11k51g71jm6qfxb0ncghdm5ccv0q63zpyc0qz5q76w65h3402l47"; }; - "src/third_party/android_sdk/androidx_browser/src" = fetchgit { url = "https://chromium.googlesource.com/external/gob/android/platform/frameworks/support/browser.git" ; rev = "65086eb5e52c16778fa7b4f157156d17b176fcb3"; sha256 = "1ypad79hb6m88bhrzlklz4cbba6gmrzxcls91z923ip3wdsg90wl"; fetchSubmodules = true; }; - "src/third_party/android_sdk/public" = - symlinkJoin { name = "cipd-joined"; paths = [ - (fetchcipd { package = "chromium/third_party/android_sdk/public/build-tools/31.0.0"; version = "tRoD45SCi7UleQqSV7MrMQO1_e5P8ysphkCcj6z_cCQC"; sha256 = "0q81fbacrram3b8qzv1icwpa5wl16plv5giqyh2xy9gaz1xnh56h"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/cmdline-tools"; version = "PGPmqJtSIQ84If155ba7iTU846h5WJ-bL5d_OoUWEWYC"; sha256 = "1svag2krs4k2lq7cj2yhg2z7lmbyshpgppzsv6i451bdzaccbj2j"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/emulator"; version = "gMHhUuoQRKfxr-MBn3fNNXZtkAVXtOwMwT7kfx8jkIgC"; sha256 = "0a872r5yfpp1bk191951zf1akrcvxabdi2axiqxmmslzqqds6gi4"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/extras"; version = "ppQ4TnqDvBHQ3lXx5KPq97egzF5X2FFyOrVHkGmiTMQC"; sha256 = "0zxfabvlmnh6avqcfs8g8w83ci1nnm9n68jvprsx5baiisqzv0ss"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/patcher"; version = "I6FNMhrXlpB-E1lOhMlvld7xt9lBVNOO83KIluXDyA0C"; sha256 = "1q03jm591c7fn1jra007pl43bs6hxm46cynnv3xx8rwyiwpbdwy0"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/platform-tools"; version = "g7n_-r6yJd_SGRklujGB1wEt8iyr77FZTUJVS9w6O34C"; sha256 = "1mzk6j31wd0lsznwgydbcfiw1iqf22rr606nx8149ygkfybrwic1"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/platforms/android-31"; version = "lL3IGexKjYlwjO_1Ga-xwxgwbE_w-lmi2Zi1uOlWUIAC"; sha256 = "0i5zlry2zllmlmzymwv2b622rpmhp5qpxjp2vggffyaz627y4gn9"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/sources/android-31"; version = "_a_BcnANjPYw5mSKlNHa7GFY8yc1kdqj2rmQgac7yUcC"; sha256 = "154bn5dkk67zm6ayivxl8s6nxhr8rz1zi13ms52gkbd08zshnqsq"; }) - ]; } - ; - "src/third_party/android_support_test_runner" = fetchcipd { package = "chromium/third_party/android_support_test_runner"; version = "96d4bf848cd210fdcbca6bcc8c1b4b39cbd93141"; sha256 = "1xk3b48zwan3pyg94mjkmain8r2iyld7lvzy3zd8yaz5bairfhif"; }; - "src/third_party/android_system_sdk" = fetchcipd { package = "chromium/third_party/android_system_sdk/public"; version = "oSfDIvHlCa6W0gS79Q5OOfB9E4eBg3uAvi3BEDN21U0C"; sha256 = "06nl413nfdj51ahaxwh7n95lpjjvrincwjgnq9s1a1092zhig0zb"; }; - "src/third_party/androidx" = fetchcipd { package = "chromium/third_party/androidx"; version = "nPCy7pWgirlw8qxgh7t5Rh6g8Dzl-p9fGdw86SNpKFUC"; sha256 = "1ya92mq5wjscc5fvnsqg85fh494kzdkc4yjfhax8g900vinkys60"; }; - "src/third_party/angle" = fetchgit { url = "https://chromium.googlesource.com/angle/angle.git" ; rev = "cc8b741c6ba4cf3cd56d6bc1173b029c816f8ced"; sha256 = "11s212x0l28dwzf9lmlgsgl329pyqf0gnvvlgnzbdbqqgkj1yy0b"; fetchSubmodules = true; }; - "src/third_party/angle/third_party/VK-GL-CTS/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS" ; rev = "834c2e16ae1c4977b705be66508a35a54fd3f4ad"; sha256 = "0y3pm4h8wxg9jzcf3178vycjaz7jbdrv210gkshc87h189z078cx"; fetchSubmodules = true; }; - "src/third_party/angle/third_party/glmark2/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/glmark2/glmark2" ; rev = "ca8de51fedb70bace5351c6b002eb952c747e889"; sha256 = "1fdfk4rwsnp8wwkmpdq7aqvyrd3amwqyr3b3hs2wb7rarmcb7grg"; fetchSubmodules = true; }; - "src/third_party/angle/third_party/rapidjson/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/Tencent/rapidjson" ; rev = "7484e06c589873e1ed80382d262087e4fa80fb63"; sha256 = "1g7syqklm3bpsixa5gybvqhv3yi9bgf173k11as55wvlshmkmjgp"; fetchSubmodules = true; }; - "src/third_party/apache-portable-runtime/src" = fetchgit { url = "https://chromium.googlesource.com/external/apache-portable-runtime.git" ; rev = "c3f11fcd86b42922834cae91103cf068246c6bb6"; sha256 = "1qb3qgwhn94v56kfw4ciaxbzfad834d1dgdhckhj3vcr86bchj5j"; fetchSubmodules = true; }; - "src/third_party/arcore-android-sdk-client" = fetchcipd { package = "chromium/third_party/arcore-android-sdk-client"; version = "fUSZ4jxIhIx34TxRIcrmOu76-khcka_Gpn0_t9lKCWQC"; sha256 = "0bm7wrp9nq76hnrwaq2j2qwkvywlmyvc04wlqvvw77vqgh0q0lid"; }; - "src/third_party/arcore-android-sdk/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google-ar/arcore-android-sdk.git" ; rev = "eaa85941f2d724c60671bf94f46de7178baba7e6"; sha256 = "12frfx2g3i8hynkb0shvp817qh9j5267j5ynq21kagab2c9ph14s"; fetchSubmodules = true; }; - "src/third_party/boringssl/src" = fetchgit { url = "https://boringssl.googlesource.com/boringssl.git" ; rev = "68addd2f719422cd00f44f06c330457269d3facf"; sha256 = "0fa9966n096269cjdqlqw073iij959c965djxfmnrirjpf868b99"; fetchSubmodules = true; }; - "src/third_party/bouncycastle" = fetchcipd { package = "chromium/third_party/bouncycastle"; version = "c078e87552ba26e776566fdaf0f22cd8712743d0"; sha256 = "0r1a513bllx5pv9v2bp4rcy8ca79ahx38iy1zp7ac6xjz8527pwr"; }; - "src/third_party/breakpad/breakpad" = fetchgit { url = "https://chromium.googlesource.com/breakpad/breakpad.git" ; rev = "08bd844599bf04c71707e8f59a8013a941264695"; sha256 = "0r8v1jzzrl0y0pibg8s7xzn1dyg4dq3nnh4a1shm69kq49wby6rx"; fetchSubmodules = true; }; - "src/third_party/byte_buddy" = fetchcipd { package = "chromium/third_party/byte_buddy"; version = "c9b53316603fc2d997c899c7ca1707f809b918cd"; sha256 = "1dffk7k27ng3h5zkx7qgaynydpm9czk3zp8crkghjs6xzdkzfdry"; }; - "src/third_party/byte_buddy/android_sdk_build_tools_25_0_2" = fetchcipd { package = "chromium/third_party/android_sdk/public/build-tools"; version = "kwIs2vdfTm93yEP8LG5aSnchN4BVEdVxbqQtF4XpPdkC"; sha256 = "0bs6lp21wpbhg3cfna1s7ncjn0l6j7zdx83fk22xw3350mjlbnm7"; }; - "src/third_party/cast_core/public/src" = fetchgit { url = "https://chromium.googlesource.com/cast_core/public" ; rev = "e7dac9fd5f5bf0158015b33a2594e30c1e4ae610"; sha256 = "1bxq0lzbr1xb2k56yq1p8ifwgdhknc6wllnp44vqv5cdqlsb9jyq"; fetchSubmodules = true; }; - "src/third_party/catapult" = fetchgit { url = "https://chromium.googlesource.com/catapult.git" ; rev = "1fe05501cf4f6f9f95a85b12f04e59a4485e1ffe"; sha256 = "1ssv8dc1pwi7sj2qf0hmffjmrhdgak6rl8ima0gc08mjvd6p50x6"; fetchSubmodules = true; }; - "src/third_party/ced/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git" ; rev = "ba412eaaacd3186085babcd901679a48863c7dd5"; sha256 = "09jjr2nffp2b6sqrk0bx4zrqvbqf8isq0i2v7qzng2zn33hvn8f9"; fetchSubmodules = true; }; - "src/third_party/checkstyle" = fetchcipd { package = "chromium/third_party/checkstyle"; version = "UAf8iarsiPx9B6ClHuyeRNM6py76TUVdylyGLTmpb4IC"; sha256 = "0m3n0zhjljnyankcli97p48kkji7c9nwrr32j29l806dmpysqzqa"; }; - "src/third_party/cld_3/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/cld_3.git" ; rev = "576305689d23da93e2f5e04a3de5afbe60d339da"; sha256 = "046kjrwy9k82wdss48y1bdzzry03il59lanfk28lzgsgsa5h7h06"; fetchSubmodules = true; }; - "src/third_party/colorama/src" = fetchgit { url = "https://chromium.googlesource.com/external/colorama.git" ; rev = "799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8"; sha256 = "0llfx0c2rs270431s8yi8ffmn45zxncwxmwby42q3adv45il87qq"; fetchSubmodules = true; }; - "src/third_party/crc32c/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/crc32c.git" ; rev = "fa5ade41ee480003d9c5af6f43567ba22e4e17e6"; sha256 = "0vivyzhljrsz6yp5fyyq86bq3hih1zxv77jv41j82c251yym60kz"; fetchSubmodules = true; }; - "src/third_party/cros_system_api" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/platform2/system_api.git" ; rev = "8b6ea1312fc4959c28a16526ca20d5d703c51f83"; sha256 = "0fl34yf4hy52bfz6czjimagjshbcfdkfaypphpq7vpgi44ygkc57"; fetchSubmodules = true; }; - "src/third_party/dav1d/libdav1d" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/videolan/dav1d.git" ; rev = "cce2b0564d3b0aa1a5e4ec0c561b6a1b8497cebb"; sha256 = "0ndx24c9a5218xwa2siiys4d580mc1rrvpcmm54zn8hrvzj2jc42"; fetchSubmodules = true; }; - "src/third_party/dawn" = fetchgit { url = "https://dawn.googlesource.com/dawn.git" ; rev = "e846fefc34da4ba904c681cd275ada191674cfb5"; sha256 = "0xc36lg3qyp9j83ckhldb3dv7kjjiyzcscyrl6x7n19700sa25al"; fetchSubmodules = true; }; - "src/third_party/dawn/third_party/tint" = fetchgit { url = "https://dawn.googlesource.com/tint" ; rev = "555e94e7e36551ec8ae577a2ea1e958c8052f3fd"; sha256 = "1qb1hdvjk8hcj1s77m67waa71f5a57arffs7rfx1ilpq3rsjv6b8"; fetchSubmodules = true; }; - "src/third_party/depot_tools" = fetchgit { url = "https://chromium.googlesource.com/chromium/tools/depot_tools.git" ; rev = "988c0af5bed05e97d351297ed9f3221bfe42a205"; sha256 = "0jhxr2gp4nqsqplqsrrzxxw53m3rl9qdmbiq6sxm1icscpndr991"; fetchSubmodules = true; }; - "src/third_party/devtools-frontend/src" = fetchgit { url = "https://chromium.googlesource.com/devtools/devtools-frontend" ; rev = "23dc975793cd9335a2e51b4440c76268a4d56159"; sha256 = "1mgwsix918v6gnlhna2ahi2r34hvai9azcv7h8yrp9y8zawwvvmv"; fetchSubmodules = true; }; - "src/third_party/devtools-frontend/src/third_party/esbuild" = fetchcipd { package = "infra/3pp/tools/esbuild/${platform}"; version = "version:2@0.14.13.chromium.2"; sha256 = "048cv3givcy0yssgg994z17qfsr8ixjjmz42apqmpwgz7bmysij1"; }; - "src/third_party/dom_distiller_js/dist" = fetchgit { url = "https://chromium.googlesource.com/chromium/dom-distiller/dist.git" ; rev = "199de96b345ada7c6e7e6ba3d2fa7a6911b8767d"; sha256 = "170qd75bwc0gld86vf32w36smc15wrafxqlg332mv5fhcl7h3qfa"; fetchSubmodules = true; }; - "src/third_party/eigen3/src" = fetchgit { url = "https://chromium.googlesource.com/external/gitlab.com/libeigen/eigen.git" ; rev = "7db0ac977acf276fb0817cfb89e490cdbae0ab56"; sha256 = "0n1r7ry9n5ii74995issik7qh762yb91pmn6d89p3xrdpig3iyxf"; fetchSubmodules = true; }; - "src/third_party/emoji-segmenter/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/emoji-segmenter.git" ; rev = "9ba6d25d0d9313569665d4a9d2b34f0f39f9a50e"; sha256 = "06qn0sjprsak0b2schahfkl3nwrrrwbls7hhn02vp7ham806cgx1"; fetchSubmodules = true; }; - "src/third_party/espresso" = fetchcipd { package = "chromium/third_party/espresso"; version = "y8fIfH8Leo2cPm7iGCYnBxZpwOlgLv8rm2mlcmJlvGsC"; sha256 = "1kiahac6knkm2zfi6b2avfpank3m5v1439wjrw9r37vh6lvxab2y"; }; - "src/third_party/expat/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git" ; rev = "65a21f2b2a306d29b44e70264aca948aa0454219"; sha256 = "1v9h33xzj34qc4am5r8d1dggqyx9yhpj6f1lwdqmv7a63lnffsbs"; fetchSubmodules = true; }; - "src/third_party/farmhash/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/farmhash.git" ; rev = "816a4ae622e964763ca0862d9dbd19324a1eaf45"; sha256 = "1mqxsljq476n1hb8ilkrpb39yz3ip2hnc7rhzszz4sri8ma7qzp6"; fetchSubmodules = true; }; - "src/third_party/ffmpeg" = fetchgit { url = "https://chromium.googlesource.com/chromium/third_party/ffmpeg.git" ; rev = "574c39cce3231c69bc9a02ac475c27d944bdb113"; sha256 = "1ir1m8f8h20s7rffqpv7kxflj0qlhrxcbkj6ihf05yinfp9grgc8"; fetchSubmodules = true; }; - "src/third_party/flac" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/flac.git" ; rev = "af862024c8c8fa0ae07ced05e89013d881b00596"; sha256 = "1y1pcdkza3fqvqam1pw5qm38pwy848mmfykqx06ir187p107c9d4"; fetchSubmodules = true; }; - "src/third_party/flatbuffers/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/flatbuffers.git" ; rev = "b8aaccee8248059b2af032cca0eb1d2ddbdb6cdc"; sha256 = "0p33547fi72z1qh19ydg8ni9qlx9wc5lzl837h67bgy7qfksjsch"; fetchSubmodules = true; }; - "src/third_party/fontconfig/src" = fetchgit { url = "https://chromium.googlesource.com/external/fontconfig.git" ; rev = "452be8125f0e2a18a7dfef469e05d19374d36307"; sha256 = "1gfdqi80qvq3h4xbsrsfh9bmdzaiczzaaq95m0mxpd6xdqi6pizq"; fetchSubmodules = true; }; - "src/third_party/fp16/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/Maratyszcza/FP16.git" ; rev = "4dfe081cf6bcd15db339cf2680b9281b8451eeb3"; sha256 = "06a8dfl3a29r93nxpp6hpywsajz5d555n3sqd3i6krybb6swnvh7"; fetchSubmodules = true; }; - "src/third_party/freetype-testing/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/freetype/freetype2-testing.git" ; rev = "fe2eddae6176f75e2101289eeda22a5ff3d808ca"; sha256 = "1v6fxas665r8hvasqp6rrryh2scyp9ypbrmjq14lama60p94bmgc"; fetchSubmodules = true; }; - "src/third_party/freetype/src" = fetchgit { url = "https://chromium.googlesource.com/chromium/src/third_party/freetype2.git" ; rev = "034e5dbf92ea3a7ea7c9322e47a3a50ff23f7b55"; sha256 = "04z0fh7whs2gzpdfh1hndjg3ipmz1k48jcys01k45f1qhya6r8qn"; fetchSubmodules = true; }; - "src/third_party/gemmlowp/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/gemmlowp.git" ; rev = "13d57703abca3005d97b19df1f2db731607a7dc2"; sha256 = "0w4ap82b73kh49pw913905al6q6lfqbgp666c0mcv2k01krh771v"; fetchSubmodules = true; }; - "src/third_party/glfw/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/glfw/glfw.git" ; rev = "94773111300fee0453844a4c9407af7e880b4df8"; sha256 = "0q60nx877lc7grv2rfhja55zqvpvc6qdpr28hvs71dwyqy2q6225"; fetchSubmodules = true; }; - "src/third_party/google-truth" = fetchcipd { package = "chromium/third_party/google-truth"; version = "u8oovXxp24lStqX4d54htRovta-75Sy2w7ijg1TL07gC"; sha256 = "0h8jl92i2lx2mgr5swirkpyvrq6af5nk6hagd8sfl4scsx0wf78b"; }; - "src/third_party/googletest/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/googletest.git" ; rev = "ea55f1f52c489535f0d3b583c81529762c9cb5ea"; sha256 = "15v9qyga4l2l561ymip1qk4dn5qjxavvc0lx2x08ck2vwn010rjf"; fetchSubmodules = true; }; - "src/third_party/grpc/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/grpc/grpc.git" ; rev = "754913545189b819829284b79ac5a4d31fddbdcc"; sha256 = "09khmi69ds1w8syd6z0r2wlscgfn002fqmg7g9zha87bk7hs14jx"; fetchSubmodules = true; }; - "src/third_party/gvr-android-sdk/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/googlevr/gvr-android-sdk.git" ; rev = "233e7fe922a543e0bc55382d64cacd047307d0e7"; sha256 = "1f9aqraqdx58gsahy94hqfxq6nib0a5nq02rb5r6gzrz3pdfdlaz"; fetchSubmodules = true; }; - "src/third_party/hamcrest" = fetchcipd { package = "chromium/third_party/hamcrest"; version = "37eccfc658fe79695d6abb6dd497463c4372032f"; sha256 = "1yil3234fpgm27hrmnnxxvlrq3jv70fqgi365gfhvgq2cwgbjci2"; }; - "src/third_party/harfbuzz-ng/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git" ; rev = "0acf466c44143de2e9b9cc0375cb25ec67cb132f"; sha256 = "0053gzc7xfg11b0jxsm4lbw2h3bhja4f843wsvws64kz1kvqpg2n"; fetchSubmodules = true; }; - "src/third_party/highway/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/highway.git" ; rev = "424360251cdcfc314cfc528f53c872ecd63af0f0"; sha256 = "0w5y8qwnvqq78pgc11bg4a4ilraymv57b95pljf1cqxwd17wkp1y"; fetchSubmodules = true; }; - "src/third_party/hunspell_dictionaries" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries.git" ; rev = "18e09b9197a3b1d771c077c530d1a4ebad04c167"; sha256 = "0b5n1gf7z52gbf0p5xd4m30kaflz0myd2964v0rziki1nbczzpzy"; fetchSubmodules = true; }; - "src/third_party/icu" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/icu.git" ; rev = "e94822cd43d01722869c19053303a18e893ecd00"; sha256 = "1m8dwkb6g0hk9bm7xlqdnfjyly0gfn4q4p1isc8hh8adzarnkp90"; fetchSubmodules = true; }; - "src/third_party/icu4j" = fetchcipd { package = "chromium/third_party/icu4j"; version = "e87e5bed2b4935913ee26a3ebd0b723ee2344354"; sha256 = "04af162d1clvy532dpd623mnfhz92jsc3wl0zval375dxdyqn86b"; }; - "src/third_party/jacoco" = fetchcipd { package = "chromium/third_party/jacoco"; version = "O8mNUqIbFxvOcBsSNfbvpdUFvY4nfrPY0QA2kHoO2pQC"; sha256 = "1ynphf6gihdisn20gvfs1agnarnd5n7717hgh5zkfif2k0v0yk0w"; }; - "src/third_party/javalang/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/c2nes/javalang.git" ; rev = "0664afb7f4d40254312693f2e833c1ed4ac551c7"; sha256 = "1j799654grk7klixiijhih9v67qcxhzh3hjzqhqhfpgfnd26q0l9"; fetchSubmodules = true; }; - "src/third_party/jdk" = fetchcipd { package = "chromium/third_party/jdk"; version = "JhpgSvTpgVUkoKe56yQmYaR1jXNcY8NqlltA0mKIO4EC"; sha256 = "0ialfgppc1fyqar0i96fsjswp269lyvyvjnm9g97g3bl8q1i6w7c"; }; - "src/third_party/jdk/extras" = fetchcipd { package = "chromium/third_party/jdk/extras"; version = "-7m_pvgICYN60yQI3qmTj_8iKjtnT4NXicT0G_jJPqsC"; sha256 = "17ingjlj3f1kkhl9hglzi4qp4vfr2wxaa535yb7xdza2hsvw4l4y"; }; - "src/third_party/jsoncpp/source" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git" ; rev = "9059f5cad030ba11d37818847443a53918c327b1"; sha256 = "0qnx5y6c90fphl9mj9d20j2dfgy6s5yr5l0xnzid0vh71zrp6jwv"; fetchSubmodules = true; }; - "src/third_party/junit/src" = fetchgit { url = "https://chromium.googlesource.com/external/junit.git" ; rev = "64155f8a9babcfcf4263cf4d08253a1556e75481"; sha256 = "1j8avi91px1z8rjc89cfikwrvfifdmmsarwiyrcnr59ynvpz0v8h"; fetchSubmodules = true; }; - "src/third_party/leveldatabase/src" = fetchgit { url = "https://chromium.googlesource.com/external/leveldb.git" ; rev = "1b51a3a96821e5fd5175288724c95c1bde57b2f0"; sha256 = "0hwxsm29dn0nyz0x684c1hapz9mf5z3j2ha2420qmdqkr6nvyazy"; fetchSubmodules = true; }; - "src/third_party/libFuzzer/src" = fetchgit { url = "https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git" ; rev = "debe7d2d1982e540fbd6bd78604bf001753f9e74"; sha256 = "0akak4x2njl2wxagiwbp30vms53k45jgy2kmfqhvx7lh28gclv8w"; fetchSubmodules = true; }; - "src/third_party/libaddressinput/src" = fetchgit { url = "https://chromium.googlesource.com/external/libaddressinput.git" ; rev = "3b8ee157a8f3536bbf5ad2448e9e3370463c1e40"; sha256 = "05d2a78fm85wbgxl1vg9rzifsspm7l3ypqgzp3csr5kmas1k9w9w"; fetchSubmodules = true; }; - "src/third_party/libaom/source/libaom" = fetchgit { url = "https://aomedia.googlesource.com/aom.git" ; rev = "a08d3f6c329a25744712578a70715e5cfd749759"; sha256 = "1xhch215finbrvi55qazr0nm2vngsll4hpi9s245asq9zfrg9lnn"; fetchSubmodules = true; }; - "src/third_party/libavif/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/AOMediaCodec/libavif.git" ; rev = "7a6d13be831da40859c6b61fb513b7a7a654a58b"; sha256 = "0g5zls6lp3p72d1c9xdrys0m454aisdnb7vcr500v3h5fqs6xj74"; fetchSubmodules = true; }; - "src/third_party/libdrm/src" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/third_party/libdrm.git" ; rev = "0190f49a139e7069d7cad6a6890832831da1aa8b"; sha256 = "1xr641kl61y1b7p71wrrjd6wsv5vcn2ilir8vg6ixwyfg9v6caim"; fetchSubmodules = true; }; - "src/third_party/libgav1/src" = fetchgit { url = "https://chromium.googlesource.com/codecs/libgav1.git" ; rev = "58d08dbd45a3ee707e76f32a9c04d770c3d22e38"; sha256 = "1jm4mydfaqnsq9wwd309hkv8qml33fgj0x3073hl9rl9f2mq3rfv"; fetchSubmodules = true; }; - "src/third_party/libgifcodec" = fetchgit { url = "https://skia.googlesource.com/libgifcodec" ; rev = "d06d2a6d42baf6c0c91cacc28df2542a911d05fe"; sha256 = "08mw637m0w6n9nga1mg06l1i3shszidp95d16rvaind35kk5gvci"; fetchSubmodules = true; }; - "src/third_party/libipp/libipp" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/platform2/libipp.git" ; rev = "6c45a4f3a05cb5dd700414fe4d94cf685159d3ce"; sha256 = "079yzvpjqmjkc135ywn4nmqiwvmw6i01cs6f46l2hbzrx65xfhhv"; fetchSubmodules = true; }; - "src/third_party/libjpeg_turbo" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git" ; rev = "02959c3ee17abacfd1339ec22ea93301292ffd56"; sha256 = "02fbqbxmslirx8sc7icsrixn12wxwac4d9i9v5hn2py225b83r3j"; fetchSubmodules = true; }; - "src/third_party/libjxl/src" = fetchgit { url = "https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git" ; rev = "a205468bc5d3a353fb15dae2398a101dff52f2d3"; sha256 = "17pvc5zgm9az5hfg2p80325f42w3dqspyb03iakrwg9x4n3vjckx"; fetchSubmodules = true; }; - "src/third_party/liblouis/src" = fetchgit { url = "https://chromium.googlesource.com/external/liblouis-github.git" ; rev = "10f66b2735b7d1e3e44d98f6dedbb859d197ea57"; sha256 = "0p1hs8aqgkv7xk2a81bv5a34vsascw4fcii4gihmgknfyilzxq5y"; fetchSubmodules = true; }; - "src/third_party/libphonenumber/dist" = fetchgit { url = "https://chromium.googlesource.com/external/libphonenumber.git" ; rev = "68eba9d6ee8b11fb58ece36b6c46d07965d7f7ff"; sha256 = "0xzl2pjiykspr4y0xrk6vpq4vkazk46m9hpjv2qap4zp8j6lfs9y"; fetchSubmodules = true; }; - "src/third_party/libprotobuf-mutator/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/libprotobuf-mutator.git" ; rev = "8942a9ba43d8bb196230c321d46d6a137957a719"; sha256 = "0wp2xj242vlj8w6vrvfn86l4jds5y4n9mpc8fjc1mzzgmpmjk1vw"; fetchSubmodules = true; }; - "src/third_party/libsrtp" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/libsrtp.git" ; rev = "5b7c744eb8310250ccc534f3f86a2015b3887a0a"; sha256 = "0dsd1kspi3gc4pnlm6q2k43czpsvk0v2jhcwclsgi4s6ca3wbwm5"; fetchSubmodules = true; }; - "src/third_party/libsync/src" = fetchgit { url = "https://chromium.googlesource.com/aosp/platform/system/core/libsync.git" ; rev = "f4f4387b6bf2387efbcfd1453af4892e8982faf6"; sha256 = "0qfz971xlqhbzjihbhc50bqys0x1kwjcc6q65xc785zia85plj9j"; fetchSubmodules = true; }; - "src/third_party/libunwindstack" = fetchgit { url = "https://chromium.googlesource.com/chromium/src/third_party/libunwindstack.git" ; rev = "6868358481bb1e5e20d155c1084dc436c88b5e6b"; sha256 = "0v861x7hfllzrlgzvw2sd3l8na0y49jx9y0w5v8zcdig40bk55v0"; fetchSubmodules = true; }; - "src/third_party/libvpx/source/libvpx" = fetchgit { url = "https://chromium.googlesource.com/webm/libvpx.git" ; rev = "df0d06de6d3b64e35b9e75ad72c571af061bc7b3"; sha256 = "0sxz7azry3a6s3207vmpmp3fyfa5k6ppb5ps9980dwic88mxz7r9"; fetchSubmodules = true; }; - "src/third_party/libwebm/source" = fetchgit { url = "https://chromium.googlesource.com/webm/libwebm.git" ; rev = "e4fbea0c9751ae8aa86629b197a28d8276a2b0da"; sha256 = "0jkhwdgvvyqx5gsk5jyvg8x625i2ljyjqkhyhpfkrl4xjy86gzmv"; fetchSubmodules = true; }; - "src/third_party/libyuv" = fetchgit { url = "https://chromium.googlesource.com/libyuv/libyuv.git" ; rev = "b4ddbaf549a1bf5572bf703fd2862d1eb7380c6a"; sha256 = "010h371w1nvzsbz1anszf8q1mxjb2j8di5ak64mjiri5iz7s4ym3"; fetchSubmodules = true; }; - "src/third_party/lss" = fetchgit { url = "https://chromium.googlesource.com/linux-syscall-support.git" ; rev = "92a65a8f5d705d1928874420c8d0d15bde8c89e5"; sha256 = "0f8fwk5ggacdzb0qxnclj0vwd5xgi4bwlp8hwarfklfsmi19pvhc"; fetchSubmodules = true; }; - "src/third_party/minigbm/src" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/platform/minigbm.git" ; rev = "2e63aaf616cdda26019d265989bd0d96ee11aab9"; sha256 = "0i6mirig0sjx5bwmazina8czfi8dxr02fj2palf13zpq1g50cbmp"; fetchSubmodules = true; }; - "src/third_party/minizip/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/nmoinvaz/minizip" ; rev = "1ff40343b55e738d941abb51c70eddb803db16e2"; sha256 = "1z27h19qmslzvzn9d0cdb8p11yaqph6ryija1vd6drjnk6h4crvh"; fetchSubmodules = true; }; - "src/third_party/mockito/src" = fetchgit { url = "https://chromium.googlesource.com/external/mockito/mockito.git" ; rev = "04a2a289a4222f80ad20717c25144981210d2eac"; sha256 = "10g549zf4yygni0lkpqjzpwwb8z42h2dpfa4c2zagjk9bzi54gia"; fetchSubmodules = true; }; - "src/third_party/nasm" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/nasm.git" ; rev = "9215e8e1d0fe474ffd3e16c1a07a0f97089e6224"; sha256 = "0132nfd3d4l3z8245iff8qnralhm2inbljrc605910jg5jvd9d6s"; fetchSubmodules = true; }; - "src/third_party/nearby/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/nearby-connections.git" ; rev = "ae0337db3bac9b104a2b585be7312615bcc66262"; sha256 = "09kyrpwrpl90c88xyid7j7k1fgrdmiwka0wk541vr6d14rfb7afm"; fetchSubmodules = true; }; - "src/third_party/neon_2_sse/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/intel/ARM_NEON_2_x86_SSE.git" ; rev = "8dbe2461c89760ac4b204aa0eafb72413a97957d"; sha256 = "09bfcbkjsgn3r9ann8ayf65xqgycy3g5mrj9fnn70sfj10cmahvm"; fetchSubmodules = true; }; - "src/third_party/netty-tcnative/src" = fetchgit { url = "https://chromium.googlesource.com/external/netty-tcnative.git" ; rev = "7eeb50be90c9ba0f6afa3375132df63942a0f32d"; sha256 = "19qh20pc61l379l25a768ym7r92s9qk52f2z77zf0j5bcharf6sq"; fetchSubmodules = true; }; - "src/third_party/netty4/src" = fetchgit { url = "https://chromium.googlesource.com/external/netty4.git" ; rev = "cc4420b13bb4eeea5b1cf4f93b2755644cd3b120"; sha256 = "167d3474ax7kzplnkkfl4pxsz90diw5fwg3ks5xwnqplvj6ipl6x"; fetchSubmodules = true; }; - "src/third_party/objenesis" = fetchcipd { package = "chromium/third_party/objenesis"; version = "tknDblENYi8IaJYyD6tUahUyHYZlzJ_Y74_QZSz4DpIC"; sha256 = "0qrkagpvybz1zz9w7ik05y7p48kd822228w7fn1xvnxgl1d8fjy5"; }; - "src/third_party/openh264/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/cisco/openh264" ; rev = "b52786888ddce9d6bc06b7825ba9bffc65924e0c"; sha256 = "046b6fhsr65s3qnhmkik48cb56c6s1arwgp4980dlc280f529vv4"; fetchSubmodules = true; }; - "src/third_party/openscreen/src" = fetchgit { url = "https://chromium.googlesource.com/openscreen" ; rev = "0f4d256a3e5588144a81a848cdd5cf314dc52868"; sha256 = "19g977cfmjs457i9fpq69csxdqh0gxrd63y9ld7417b9zciwzqw7"; fetchSubmodules = true; }; - "src/third_party/openscreen/src/third_party/tinycbor/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/intel/tinycbor.git" ; rev = "fc42a049853b802e45f49588f8148fc29d7b4d9c"; sha256 = "1iaq7l11bfs3qlwbf4l19lvpycf5zrrkbz3s1jlh10fs0v26wz1m"; fetchSubmodules = true; }; - "src/third_party/ots/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/khaledhosny/ots.git" ; rev = "ee537ac096667eed6559124164c3e8482646fd77"; sha256 = "0yg7g2ial5yb1i6d7jj9v77z81383qiwsdy1dd0bzrfncbfyp65s"; fetchSubmodules = true; }; - "src/third_party/pdfium" = fetchgit { url = "https://pdfium.googlesource.com/pdfium.git" ; rev = "2fcb5025f65abf3f9446b3935ac3186a59a7dc90"; sha256 = "1bbwjnzajzynms7kxy37gn2qhkyyc6wf7s9f8qbkl0n2cz7miqx6"; fetchSubmodules = true; }; - "src/third_party/perfetto" = fetchgit { url = "https://android.googlesource.com/platform/external/perfetto.git" ; rev = "dfc6cffca9b6a34068386915d50040c6bc142717"; sha256 = "0cpmhvwx6wb9g36bs6yfryckin6khfs3s5hpkj82v3y2fpgh6shk"; fetchSubmodules = true; }; - "src/third_party/proguard" = fetchcipd { package = "chromium/third_party/proguard"; version = "Fd91BJFVlmiO6c46YMTsdy7n2f5Sk2hVVGlzPLvqZPsC"; sha256 = "07swiphqrkaz4j0mfmfyzabfwwm1rny3fcc1hdrqyaz15ai84svl"; }; - "src/third_party/pyelftools" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/third_party/pyelftools.git" ; rev = "19b3e610c86fcadb837d252c794cb5e8008826ae"; sha256 = "07hl6dpa35xixfdh55d20a2b1x9yghfr6f7bj7hgyz1gh7ffkzi3"; fetchSubmodules = true; }; - "src/third_party/pywebsocket3/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/pywebsocket3.git" ; rev = "50602a14f1b6da17e0b619833a13addc6ea78bc2"; sha256 = "1145dll9wvshjlaki3bs4r2v0mzwzg023gzxgyfblz7vdyxsljjq"; fetchSubmodules = true; }; - "src/third_party/quic_trace/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/quic-trace.git" ; rev = "413c3a4a641c014193eabb8d282c2348ccec3c5b"; sha256 = "1sii5a599q22xqbqsb77rv2xyrfixz76p99xi7is7ysk4iid1r7x"; fetchSubmodules = true; }; - "src/third_party/r8" = fetchcipd { package = "chromium/third_party/r8"; version = "cEv1yyfxfmP_MaZrG22cR7YPc7hehgHAZd82lRx0DFAC"; sha256 = "1a9jbc5nmq7db66f67zlvx5gd54fcjhfsm0yhysp3ll2cslfj64y"; }; - "src/third_party/re2/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/re2.git" ; rev = "885eb38accf49e2ccdd2fa6786f3590cf40a3e23"; sha256 = "1gzdqy5a0ln9rwd8kmwbgis6qin63hapicwb35xkbnj3y84jj6yx"; fetchSubmodules = true; }; - "src/third_party/requests/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/kennethreitz/requests.git" ; rev = "c7e0fc087ceeadb8b4c84a0953a422c474093d6d"; sha256 = "18dds0ifjhjy5x8mra2fspvc1b7xvzr4dk798igbvkwg9vkdzn1i"; fetchSubmodules = true; }; - "src/third_party/robolectric" = fetchcipd { package = "chromium/third_party/robolectric"; version = "Kdd6dNFAKqj9g9Bsfo2z1zQr52Vk60EL_wb9Bf2c8rcC"; sha256 = "0502qqysagn02ig0cajizhzklmvrx91bc8i22hmf6jfi28sxcl4z"; }; - "src/third_party/rust/serde_jsonrc/v0_1/crate" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/serde-rs/json" ; rev = "ca5782632fc8dc3f9cf2f22055b87f910cad761f"; sha256 = "115f7v26jn7njja5x80a801i75xpx1374zkrc8r84j65ig9yk4sb"; fetchSubmodules = true; }; - "src/third_party/ruy/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/ruy.git" ; rev = "2d950b3bfa7ebfbe7a97ecb44b1cc4da5ac1d6f0"; sha256 = "071jngh15qyy0lmjhp4spih11m3p6n2piqjhsfanw1s218yrg25q"; fetchSubmodules = true; }; - "src/third_party/securemessage/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/securemessage.git" ; rev = "fa07beb12babc3b25e0c5b1f38c16aa8cb6b8f84"; sha256 = "0d1rq8mg4bj5kh9jg7lgfv3kqpnn8kdvm5rckgd8jmqihl2hcs8c"; fetchSubmodules = true; }; - "src/third_party/shaderc/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/shaderc.git" ; rev = "96b1dd72a827304817470274a470c4d3b2293451"; sha256 = "1ax5wy04g9ca8c4533zdvjd9zrp5mzx0471s0rx71ipkq02pxi4c"; fetchSubmodules = true; }; - "src/third_party/skia" = fetchgit { url = "https://skia.googlesource.com/skia.git" ; rev = "b524f580859d367e51591d8b5c16485d022844cb"; sha256 = "09j8jvl0j34iacb0p7a0z5frgn2zcfwk1fh26g79ll73d3h2dlbi"; fetchSubmodules = true; }; - "src/third_party/smhasher/src" = fetchgit { url = "https://chromium.googlesource.com/external/smhasher.git" ; rev = "e87738e57558e0ec472b2fc3a643b838e5b6e88f"; sha256 = "0b4yxi80kixp0dr51q3a80ia2nv70spp1mhsbl31rwmlczzby827"; fetchSubmodules = true; }; - "src/third_party/snappy/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/snappy.git" ; rev = "65dc7b383985eb4f63cd3e752136db8d9b4be8c0"; sha256 = "0jvl9m9f7syl8jscf9mkfmj0d5zsq150mzrnscvw9q6685rfnhm1"; fetchSubmodules = true; }; - "src/third_party/sqlite/src" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/sqlite.git" ; rev = "9ccd3058ec6dcfa5b0ebd2edb3e88c9b97813025"; sha256 = "12swdcjvacds81hfixpvkbg99lz2rvdyfw7v2gdcyfy1y2b3yna4"; fetchSubmodules = true; }; - "src/third_party/sqlite4java" = fetchcipd { package = "chromium/third_party/sqlite4java"; version = "LofjKH9dgXIAJhRYCPQlMFywSwxYimrfDeBmaHc-Z5EC"; sha256 = "1bckirpb79bknwnksjsybwcm7dc3ngmb5xslfglndjxrjfsw96k1"; }; - "src/third_party/swiftshader" = fetchgit { url = "https://swiftshader.googlesource.com/SwiftShader.git" ; rev = "043a8084c1cb680b30a46e8a316042f6bb9028ec"; sha256 = "1mg3qwvwlac6p5ja6435l92w61clrja8zghhc8snzlj577j5svly"; fetchSubmodules = false; }; - "src/third_party/tflite/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/tensorflow/tensorflow.git" ; rev = "767b2cf99f1ebe27f9e61b672a48ddbb2142bfed"; sha256 = "1lk2fr1a4ld6bcnrx9j50b8aw7iazvcgmpahmw34v3nndap2c2v6"; fetchSubmodules = true; }; - "src/third_party/turbine" = fetchcipd { package = "chromium/third_party/turbine"; version = "VhmfIPuSDHHeilnA7WC0MhR9ShZNF25tA0Te4RYIZG8C"; sha256 = "104jhsyjgkrx6z20wz3invdcpbryr9fqxigwi3dbqafxg9v51pg8"; }; - "src/third_party/ub-uiautomator/lib" = fetchgit { url = "https://chromium.googlesource.com/chromium/third_party/ub-uiautomator.git" ; rev = "00270549ce3161ae72ceb24712618ea28b4f9434"; sha256 = "08axh1pbssh3l4hgw5sllp96jaxrx8hbv9n69q695irdbrpbnr6b"; fetchSubmodules = true; }; - "src/third_party/ukey2/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/ukey2.git" ; rev = "0275885d8e6038c39b8a8ca55e75d1d4d1727f47"; sha256 = "01z3ab54khwmbg52pcfvqlclsdd00pzi8mcalq5px1lnhcz6vp4d"; fetchSubmodules = true; }; - "src/third_party/usrsctp/usrsctplib" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/sctplab/usrsctp" ; rev = "62d7d0c928c9a040dce96aa2f16c00e7e67d59cb"; sha256 = "0sy1ifbm56s0c31pw30fpcfngkr4dv11yysmwhzwax914d9kh4yn"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps" = fetchgit { url = "https://chromium.googlesource.com/vulkan-deps" ; rev = "5fe1b21d6ba47a8dee59068d6927a4c157ec13a3"; sha256 = "07hsqz35jpd5wpjis5w6n51ahlnp5isj7lmbj566azxk8dm8rb6j"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/glslang/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang" ; rev = "90d4bd05cd77ef5782a6779a0fe3d084440dc80d"; sha256 = "153msf42wmj9y4vmnh6wkgh0is227vscq0n8c0bbgq7zv8cggbkk"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/spirv-cross/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross" ; rev = "64e058aa9b0c7a0d1cbc645b4496ddf4cdbca00d"; sha256 = "0xfw6icp9a505kswh2wqdlmjqp2jr3scjwkqnj1wmkbgxzfnc3ib"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/spirv-headers/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers" ; rev = "6a55fade62dec6a406a5a721148f88a2211cbefa"; sha256 = "06jwrp8ncs7j0mqv95bm7gk5f674ycd0axx9632zciha592yq9m6"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/spirv-tools/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools" ; rev = "d18d0d92e55f44da6af0dc87fb0e3c8034e9a3ac"; sha256 = "1f8vc53858fidd60ka9c3jqnkqn6zd1si6bdkx7gvp36d0p6sar4"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/vulkan-headers/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers" ; rev = "b32da5329b50e3cb96229aaecba9ded032fe29cc"; sha256 = "0n7ffbwwdrpbzgijsmw56qz0jpl9ib8xib8bqmbkfqpn1zk5zsvs"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/vulkan-loader/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader" ; rev = "edb793cf31480ae71f7462e8ae2bf13188143682"; sha256 = "14mghmqikbigjwd08myry8f8hxawiphq7010pp3dcbs1pi5pr1aj"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/vulkan-tools/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools" ; rev = "5f9e5f14e572a6c9f7ff4d54e2fd4d82632bc393"; sha256 = "0b4i4amnbsfwz2ir8jsy89nhszcka4w9ycjnnlycwqdz9lqiihmw"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/vulkan-validation-layers/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers" ; rev = "0b8873487d46fbcc7cafa917824a867151160933"; sha256 = "1b67xhd94wbfwsa9f4g8xxi2mkn3r0w1gjh66mzdb318vj7ai16c"; fetchSubmodules = true; }; - "src/third_party/vulkan_memory_allocator" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git" ; rev = "ebe84bec02c041d28f902da0214bf442743fc907"; sha256 = "1hclk1jm0d3sgfqbha4lzwk39dfi3dx1cgyg9h74105zfqy6w15c"; fetchSubmodules = true; }; - "src/third_party/wayland-protocols/gtk" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/GNOME/gtk.git" ; rev = "40ebed3a03aef096addc0af09fec4ec529d882a0"; sha256 = "091ffkv5m46zgjklr4mpnsc3ykfnzbj4yin45isvpr05p6fcv5gg"; fetchSubmodules = true; }; - "src/third_party/wayland-protocols/kde" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KDE/plasma-wayland-protocols.git" ; rev = "0b07950714b3a36c9b9f71fc025fc7783e82926e"; sha256 = "0rip7fvx3xg5s975dcw47pvwrmv0fi53xrpkqk6lxzmcd7zjjrqf"; fetchSubmodules = true; }; - "src/third_party/wayland-protocols/src" = fetchgit { url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git" ; rev = "177ff9119da526462e5d35fbfde6c84794913787"; sha256 = "1n3skg63lqpx35rarwdklcjyh5pd3fbjwk68lw30i9v554fk9xsn"; fetchSubmodules = true; }; - "src/third_party/wayland/src" = fetchgit { url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland.git" ; rev = "e60398b1755bfcdf09f040d3769131fe0d9762fc"; sha256 = "014zl3kp3gy2s8nmfp8vqy02fgpgqvajg8c9gxk6g4z460c8rbkj"; fetchSubmodules = true; }; - "src/third_party/webdriver/pylib" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/SeleniumHQ/selenium/py.git" ; rev = "d0045ec570c1a77612db35d1e92f05e1d27b4d53"; sha256 = "0grjcv25ajbf8zbhp8s1qajba980aspz52pzicfnk4csmpamcwkw"; fetchSubmodules = true; }; - "src/third_party/webgl/src" = fetchgit { url = "https://chromium.googlesource.com/external/khronosgroup/webgl.git" ; rev = "cf04aebdf9b53bb2853f22a81465688daf879ec6"; sha256 = "043hy7sg6g0pdln83rr5phq7gqjb3586b3jcbqam2xpm5p102zmh"; fetchSubmodules = true; }; - "src/third_party/webgpu-cts/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/gpuweb/cts.git" ; rev = "bcac299eb80e8314ba22b8f012a31138b0686324"; sha256 = "1q7jwg1n6iyk2n0ff9v93rgjm7rvr6hysw45lx9kjayr41s28c66"; fetchSubmodules = true; }; - "src/third_party/webpagereplay" = fetchcipd { package = "infra/tools/wpr/linux_x86_64"; version = "y28SfbEF6nHSkZ1eHysM1t711zpOCmtk7jUdxZB-QSMC"; sha256 = "00i5c4wiwvap5faphfb672l86kdynn191qk1vhmv853rf0lka5c3"; }; - "src/third_party/webrtc" = fetchgit { url = "https://webrtc.googlesource.com/src.git" ; rev = "ffd9187dc0d9211ad52173bf0daa5001ca7d45ee"; sha256 = "18naav5a294mb56dd8xzz1ms98jid0gqza6swbgbc56575a2cib5"; fetchSubmodules = true; }; - "src/third_party/weston/src" = fetchgit { url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/weston.git" ; rev = "420cfd00f2de91de74bd9d4d8348e43c582d29f0"; sha256 = "0ib9c6dlnmbj3gngllsvi0kax2ql678nz26lq9ynjmiwhfh7ma8h"; fetchSubmodules = true; }; - "src/third_party/wuffs/src" = fetchgit { url = "https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git" ; rev = "ebbecaa2fb439eff0aeedafadb4c2a984446dee8"; sha256 = "184878r794iz30cib90bg95b3pa31sm9mqnm3mpilkfhmync54mc"; fetchSubmodules = true; }; - "src/third_party/xdg-utils" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/xdg-utils.git" ; rev = "d80274d5869b17b8c9067a1022e4416ee7ed5e0d"; sha256 = "0i72hw0lb4xjg1xh0bax6s5x5hjc3n0lmwzck4q04h94k7s9ayxp"; fetchSubmodules = true; }; - "src/tools/page_cycler/acid3" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/acid3.git" ; rev = "6be0a66a1ebd7ebc5abc1b2f405a945f6d871521"; sha256 = "0dmkrbhb4kb7vk33i3zc0kv9ihbkxwy4cfvaw5fnfx9zp77jgdpv"; fetchSubmodules = true; }; - "src/tools/resultdb" = fetchcipd { package = "infra/tools/result_adapter/${platform}"; version = "git_revision:735a8a662d3874d8b1d795a40e46ea0f57b52758"; sha256 = "1vbdwhn2wq8did768g3nijvrry6i6y2y1r00ww94n4phbydyk055"; }; - "src/tools/skia_goldctl/linux" = fetchcipd { package = "skia/tools/goldctl/linux-amd64"; version = "njGzzVyYPSA__3tShsGxsvh8k5kJfL9V0wvLthXSUV4C"; sha256 = "00b32xyxlcqa8hpa66djjlsql4jc3npcirh10n4wbgzd0wm07wl8"; }; - "src/v8" = fetchgit { url = "https://chromium.googlesource.com/v8/v8.git" ; rev = "b2490f598d9debd563bc32191cb3f777a16cbbb0"; sha256 = "0j7i9p4fijb6r5ma4g55hv7qa3wld3yxwaldpj284xvan7jdj3p0"; fetchSubmodules = true; }; + fetchgit, + fetchcipd, + fetchurl, + runCommand, + symlinkJoin, + platform, +}: +{ + "src" = fetchgit { + url = "https://chromium.googlesource.com/chromium/src.git"; + rev = "868b46452cfe324558c39dbf9182f86a609296db"; + sha256 = "0jw769204zn9syz66rrqcv6wl88vqznmbycvnk9gq43hw3bbmkqn"; + fetchSubmodules = true; + }; + "src/android_webview/tools/cts_archive" = fetchcipd { + package = "chromium/android_webview/tools/cts_archive"; + version = "ai8Ig4HlO0vG6aP_JP2uhyruE2yPzze8PFP1g8Z4_hgC"; + sha256 = "0lxgxd75lqsk7jpgx5gmkskmkz22mvmzrh82l3dh0z53b0ibb14v"; + }; + "src/buildtools/clang_format/script" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git"; + rev = "e435ad79c17b1888b34df88d6a30a094936e3836"; + sha256 = "0ifdbxg283v2zz5s6iy9b2iyynrzbzbsifpc5m90dq48743vb963"; + fetchSubmodules = true; + }; + "src/buildtools/linux64" = fetchcipd { + package = "gn/gn/linux-amd64"; + version = "git_revision:0725d7827575b239594fbc8fd5192873a1d62f44"; + sha256 = "1y8csayrd9653fwyzw07l29i1dmb5jvwzrygks3ayh1d1yqbq36p"; + }; + "src/buildtools/third_party/libc++/trunk" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git"; + rev = "79a2e924d96e2fc1e4b937c42efd08898fa472d7"; + sha256 = "1k00bcyh3061k0cy0z7b03kiimfjxksmnyfk6vxhfl4kqhn3wx4z"; + fetchSubmodules = true; + }; + "src/buildtools/third_party/libc++abi/trunk" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git"; + rev = "738dc100c61890744f9e78cac27c71d0a2190781"; + sha256 = "0k8nnjr3n7h0vzjzc02y2jhlamak49brliq8nzxcdl8z2dmj7kxh"; + fetchSubmodules = true; + }; + "src/buildtools/third_party/libunwind/trunk" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git"; + rev = "75396220433652a698b05c5fb648fe1f5e1d7a27"; + sha256 = "04cqsbypd66n3jhnq2kmdvhkz46vr8fv8lsyf5g7ygkqjkd98x9a"; + fetchSubmodules = true; + }; + "src/chrome/test/data/perf/canvas_bench" = fetchgit { + url = "https://chromium.googlesource.com/chromium/canvas_bench.git"; + rev = "a7b40ea5ae0239517d78845a5fc9b12976bfc732"; + sha256 = "0cs215p1353dfp0s8x33jhz7ih0fh9ajwwax6d5q15la274axwxj"; + fetchSubmodules = true; + }; + "src/chrome/test/data/perf/frame_rate/content" = fetchgit { + url = "https://chromium.googlesource.com/chromium/frame_rate/content.git"; + rev = "c10272c88463efeef6bb19c9ec07c42bc8fe22b9"; + sha256 = "0yi9xc0qihr1pw9fllsy9x9p19211p534qn7j70l7bply6x1r2dp"; + fetchSubmodules = true; + }; + "src/chrome/test/data/xr/webvr_info" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/toji/webvr.info.git"; + rev = "c58ae99b9ff9e2aa4c524633519570bf33536248"; + sha256 = "1s7131k4m20cpmsb0jhmz1sqmnhld8n8fsirs7i6l498rv0hzh06"; + fetchSubmodules = true; + }; + "src/docs/website" = fetchgit { + url = "https://chromium.googlesource.com/website.git"; + rev = "66779576a0d84e821a11e288acc94859fdcbe0bd"; + sha256 = "106qw68w6ndwj1hl4zf7rzffnqx826cqg3l281vcd054pvb90xpd"; + fetchSubmodules = true; + }; + "src/media/cdm/api" = fetchgit { + url = "https://chromium.googlesource.com/chromium/cdm.git"; + rev = "fc5afac6847dc61addc1177103aa602e71a9ecac"; + sha256 = "0yai4nk0p4qkbn61sjs2g6yapraqbzy0amkw1wrdqb7rajhn0aqi"; + fetchSubmodules = true; + }; + "src/native_client" = fetchgit { + url = "https://chromium.googlesource.com/native_client/src/native_client.git"; + rev = "7adc7525b68ffb888135f9541bde1b1f62ca5b70"; + sha256 = "0sanjp8yh1ffnd4kcj4b3l9jxigjg7c712aa9061f17skxi6bm5b"; + fetchSubmodules = true; + }; + "src/net/third_party/quiche/src" = fetchgit { + url = "https://quiche.googlesource.com/quiche.git"; + rev = "a778d65990c3be7b6eafac08d14c345d1090eec2"; + sha256 = "0man8pykmb65vln41z6s0wfvn2bw5pr55il3lpr0v5p21dpgj6zr"; + fetchSubmodules = true; + }; + "src/third_party/accessibility_test_framework" = fetchcipd { + package = "chromium/third_party/accessibility-test-framework"; + version = "b5ec1e56e58e56bc1a0c77d43111c37f9b512c8a"; + sha256 = "0q4bb1nylbaals9b9qrd5c0f62nlyr2np0g6i8fbvawwrbr7qxrm"; + }; + "src/third_party/android_build_tools/aapt2" = fetchcipd { + package = "chromium/third_party/android_build_tools/aapt2"; + version = "yQIf5Ev_-q9u6Pr_a0APd1dHcImJSmotVADw4Pj151QC"; + sha256 = "1i7c9yiwlgrqg6ca85k1m39dcakvqr5fqlh2vs8x11rx70bzykka"; + }; + "src/third_party/android_build_tools/art" = fetchcipd { + package = "chromium/third_party/android_build_tools/art"; + version = "87169fbc701d244c311e6aa8843591a7f1710bc0"; + sha256 = "0p6yn4rzavyd16krq29wnbw97fmak4qd47zmk7d3wq0jbzjqj18m"; + }; + "src/third_party/android_build_tools/bundletool" = fetchcipd { + package = "chromium/third_party/android_build_tools/bundletool"; + version = "2ZcLVDxyRwp8FzpeYLtLT0TfSRweZxvwh1-Kx1jZ_FoC"; + sha256 = "0b39ygw9qk4bv7q20j378q1xmx0xdcgqsd6xfvc1vka6avwlb5nr"; + }; + "src/third_party/android_deps/libs/android_arch_core_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_core_common"; + version = "version:2@1.1.1.cr0"; + sha256 = "183y5pijhr2dypkm1dfy5yc88p477razlq73kzd72c0gz5z6kwpy"; + }; + "src/third_party/android_deps/libs/android_arch_core_runtime" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_core_runtime"; + version = "version:2@1.1.1.cr0"; + sha256 = "0g0akycdbr9chy0gswpklwzw8m6cpb7242vnnvpzqfhjdcjg5fba"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_common"; + version = "version:2@1.1.1.cr0"; + sha256 = "0x3mdil15ld7rlm0n0x53fsz81dc7vx1pccwz7klb4zdl9w3mxbr"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_common_java8" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_common_java8"; + version = "version:2@1.1.1.cr0"; + sha256 = "0b464w5argc8sajrwqnzizhh0chi9vl1vbnrc76rxifjg2ym6fgh"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_livedata" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata"; + version = "version:2@1.1.1.cr0"; + sha256 = "18bf42hfbdjhi7f0lx8zvsn3372m69j5xdjrwgas26a32dg7n5yj"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_livedata_core" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata_core"; + version = "version:2@1.1.1.cr0"; + sha256 = "1wws684w3qwyhp715ia78pvk16w3jaj40a3vvbndnzfcglyrg2a8"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_runtime" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_runtime"; + version = "version:2@1.1.1.cr0"; + sha256 = "1d4kr0js2xxcy0bgjwnz0sacwrq9b2knmdkysh0130vp0fv9i44v"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_viewmodel" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_viewmodel"; + version = "version:2@1.1.1.cr0"; + sha256 = "1fs0w8nk9rnjv7rvc70111sqdvp9579c63phv61j978wkfq349cy"; + }; + "src/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent" = fetchcipd { + package = "chromium/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent"; + version = "version:2@3.1.cr0"; + sha256 = "1k4z2zgc07bk0pnckbc7m5xph71vn4zkrl95jnzw8xwk46qbli7n"; + }; + "src/third_party/android_deps/libs/classworlds_classworlds" = fetchcipd { + package = "chromium/third_party/android_deps/libs/classworlds_classworlds"; + version = "version:2@1.1-alpha-2.cr0"; + sha256 = "1y5p5m7wykp1rc6dz700jqjbqkwzrv4zjdapfnja9cxmgwdwvlgr"; + }; + "src/third_party/android_deps/libs/com_android_support_animated_vector_drawable" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_animated_vector_drawable"; + version = "version:2@28.0.0.cr0"; + sha256 = "1xmq1l0ms4i3f1lsrman1ans7z2cfjaw5bxd02g9jzq7ar0g07k6"; + }; + "src/third_party/android_deps/libs/com_android_support_appcompat_v7" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_appcompat_v7"; + version = "version:2@28.0.0.cr0"; + sha256 = "1xka020529x68sx2jmfl5vmrdr8k1k97dk4k6p2nkf80gsd9kswi"; + }; + "src/third_party/android_deps/libs/com_android_support_asynclayoutinflater" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_asynclayoutinflater"; + version = "version:2@28.0.0.cr0"; + sha256 = "1dk1gwvph89mbgaj1hmfiqyndgjhgb9vqsaqz48lqvq8a8mj9whd"; + }; + "src/third_party/android_deps/libs/com_android_support_cardview_v7" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_cardview_v7"; + version = "version:2@28.0.0.cr0"; + sha256 = "0xynb0mssa0zyiy34lxjsvymg5zrfxqg5rfv254ibm531ar0s7c9"; + }; + "src/third_party/android_deps/libs/com_android_support_collections" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_collections"; + version = "version:2@28.0.0.cr0"; + sha256 = "0gy8gnin8hljn4shmxfj6k4ahmwpx5m9lsz2630m63zqiplvhmls"; + }; + "src/third_party/android_deps/libs/com_android_support_coordinatorlayout" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_coordinatorlayout"; + version = "version:2@28.0.0.cr0"; + sha256 = "047fi1kh08gkkcv1kcqizjq7qn9xcc5rgs6l33ypckrm9xlpf6w7"; + }; + "src/third_party/android_deps/libs/com_android_support_cursoradapter" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_cursoradapter"; + version = "version:2@28.0.0.cr0"; + sha256 = "06z3ba5bqcqv1379aj16pvqcs09pff2ss8sjwah3w6yp0bw46i1i"; + }; + "src/third_party/android_deps/libs/com_android_support_customview" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_customview"; + version = "version:2@28.0.0.cr0"; + sha256 = "1vhd792m113r7s13jly2fc2l72h6lqs99fjynlvh7ppfsl3ha16n"; + }; + "src/third_party/android_deps/libs/com_android_support_design" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_design"; + version = "version:2@28.0.0.cr0"; + sha256 = "0q6ygv1h3lbmz20b989w2p0sf0bh69537xwkmin1xbw7bm357wk4"; + }; + "src/third_party/android_deps/libs/com_android_support_documentfile" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_documentfile"; + version = "version:2@28.0.0.cr0"; + sha256 = "0s6wnbdsfxabgy7j2d3yh0nkz7zkjn22ngswmq3jgd7ymlpvldbn"; + }; + "src/third_party/android_deps/libs/com_android_support_drawerlayout" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_drawerlayout"; + version = "version:2@28.0.0.cr0"; + sha256 = "1gymfjq1dnrj6yp77pvm7hpqfwq2v5l2z92jvdsrkp3dj3c04q2l"; + }; + "src/third_party/android_deps/libs/com_android_support_interpolator" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_interpolator"; + version = "version:2@28.0.0.cr0"; + sha256 = "0j73f8dwxip1ad312x66d5iw39dc45gzbm0p56qd113dv6nq7jpf"; + }; + "src/third_party/android_deps/libs/com_android_support_loader" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_loader"; + version = "version:2@28.0.0.cr0"; + sha256 = "1mwj2q0xppama4sw8j41krqnbs6qqjbas6gdr89r3laxvhfhfj1j"; + }; + "src/third_party/android_deps/libs/com_android_support_localbroadcastmanager" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_localbroadcastmanager"; + version = "version:2@28.0.0.cr0"; + sha256 = "06895mn7r86z02xjfz2vxw1114zhsby4jbc8m20g7n5irpzvcscv"; + }; + "src/third_party/android_deps/libs/com_android_support_multidex" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_multidex"; + version = "version:2@1.0.0.cr0"; + sha256 = "0cxvhw4sfxmc9czbrwy365949vinnjwrp3i4a74pvg35sm2wasgx"; + }; + "src/third_party/android_deps/libs/com_android_support_print" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_print"; + version = "version:2@28.0.0.cr0"; + sha256 = "0bhgwpw62wvzpjrkjp8vq0b05cn040x6i97hdvvkrq9nn6qrlnvh"; + }; + "src/third_party/android_deps/libs/com_android_support_recyclerview_v7" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_recyclerview_v7"; + version = "version:2@28.0.0.cr0"; + sha256 = "00gr45k3jnb8h2kmij6p0p2irgkvxxqmj7idl7afl1ip4z6nm71c"; + }; + "src/third_party/android_deps/libs/com_android_support_slidingpanelayout" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_slidingpanelayout"; + version = "version:2@28.0.0.cr0"; + sha256 = "1n9lgjwcpb8w7wjixv935khkrphw0nbg2ww87gqh8jb82pj6k0fs"; + }; + "src/third_party/android_deps/libs/com_android_support_support_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_annotations"; + version = "version:2@28.0.0.cr0"; + sha256 = "0dda57cs8yvdpbi7jaw50ndvf4szhm9alk1iszq696m89flmky4n"; + }; + "src/third_party/android_deps/libs/com_android_support_support_compat" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_compat"; + version = "version:2@28.0.0.cr0"; + sha256 = "1zc1341is7qw7wzdg87i1c7wibwyw0zjyb9mcn4pv1gcr66a3kqa"; + }; + "src/third_party/android_deps/libs/com_android_support_support_core_ui" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_core_ui"; + version = "version:2@28.0.0.cr0"; + sha256 = "07xdb6n38zbh421g1shiwp46dlm2fiv5p5i89n5ra9npyydx9jya"; + }; + "src/third_party/android_deps/libs/com_android_support_support_core_utils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_core_utils"; + version = "version:2@28.0.0.cr0"; + sha256 = "1sw7xvn4zg4qa9fyd9jl6ric03jkp7a6pims54hif09dp6i79sz8"; + }; + "src/third_party/android_deps/libs/com_android_support_support_fragment" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_fragment"; + version = "version:2@28.0.0.cr0"; + sha256 = "1wzdvxmvkk0vpxc43y9a5wxl177aw3npy5ssmv3z8gmyhmixv5bf"; + }; + "src/third_party/android_deps/libs/com_android_support_support_media_compat" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_media_compat"; + version = "version:2@28.0.0.cr0"; + sha256 = "08fmh9xa2pn77viv97k9sscrkx5002hjmwhskf3c9nj8g7bd65gx"; + }; + "src/third_party/android_deps/libs/com_android_support_support_v4" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_v4"; + version = "version:2@28.0.0.cr0"; + sha256 = "0l4sc961kx2w8yc8qf80ak383gsq940y4dfhshbfcb98k207fxvs"; + }; + "src/third_party/android_deps/libs/com_android_support_support_vector_drawable" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_vector_drawable"; + version = "version:2@28.0.0.cr0"; + sha256 = "1gf7da8463fhm60ggmyp4hrkn7jrrpplmq8kqfxvd9p7vdn7jai0"; + }; + "src/third_party/android_deps/libs/com_android_support_swiperefreshlayout" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_swiperefreshlayout"; + version = "version:2@28.0.0.cr0"; + sha256 = "0vv2aggcgbqza2sdkb75fgpi4kjysxnpw4zy2sx63y24vzbf8ld0"; + }; + "src/third_party/android_deps/libs/com_android_support_transition" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_transition"; + version = "version:2@28.0.0.cr0"; + sha256 = "0nqgiwc7rcfnlkf8p896bylfvfycjkcxdvs41rjcyarc6d8wxa4y"; + }; + "src/third_party/android_deps/libs/com_android_support_versionedparcelable" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_versionedparcelable"; + version = "version:2@28.0.0.cr0"; + sha256 = "16mp3wijcs7473szl35dvbji6w41cfjm8hkkic4c67gqxb4b8g18"; + }; + "src/third_party/android_deps/libs/com_android_support_viewpager" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_viewpager"; + version = "version:2@28.0.0.cr0"; + sha256 = "02xilasqj0ik476dpdx3lk0xxqij9za8vcgldhyiwikh60hkq86c"; + }; + "src/third_party/android_deps/libs/com_android_tools_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_common"; + version = "version:2@30.2.0-beta01.cr0"; + sha256 = "1h8ng5z5ac3fr1q18v2xn6vm2zja3yhzv98fwgyr9ffsvk9wf3qm"; + }; + "src/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs"; + version = "version:2@1.1.5.cr1"; + sha256 = "1zg0lpyx03qb48b4bhpwcz0n3g2vpc60gx1gdkpg3gvn4n2z1wkr"; + }; + "src/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration"; + version = "version:2@1.1.5.cr1"; + sha256 = "0gwyygyiwjqcffq88v7v3pw9qz3xvfr6nr5v2q5h87sf17w5q7bh"; + }; + "src/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api"; + version = "version:2@30.2.0-beta01.cr0"; + sha256 = "0a1iwi1p11v2mgf6826x1kxg2jzvr1xbkf5jy232mrghh26w9wvy"; + }; + "src/third_party/android_deps/libs/com_android_tools_sdk_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_sdk_common"; + version = "version:2@30.2.0-beta01.cr0"; + sha256 = "0fx75xprag7i5iylp75r10x9fcr2i7r2jnspaa0vdbi72fhi04dd"; + }; + "src/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine"; + version = "version:2@2.8.8.cr0"; + sha256 = "0j8s8ys4w4f072lwfidmv9xmmfqg0s0s03zhp51if1g46bxqggij"; + }; + "src/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms"; + version = "version:2@1.0.cr0"; + sha256 = "1q2gd5pprgwlpq982dgb747kmh4h0v1agl1wa755ybjwcwnq17dn"; + }; + "src/third_party/android_deps/libs/com_google_android_datatransport_transport_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_datatransport_transport_api"; + version = "version:2@2.2.1.cr0"; + sha256 = "06ww0c1dbzf6i62n2wrag5l0iq68kccrfgf47h2356g8j90pisnb"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth"; + version = "version:2@17.0.0.cr0"; + sha256 = "0s2m4d6s3p2bc1wc3mcb2qc9wzh7c3pibv4i541r0gc0vw7krih2"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone" = + fetchcipd + { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone"; + version = "version:2@17.5.0.cr0"; + sha256 = "1qnaib8q0vasa9w3ad8aljir6rqm1kvg4sa72jv4rxlmvsjp60x3"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base"; + version = "version:2@17.0.0.cr0"; + sha256 = "1f6rixxs1597iiw04smrprplhg6rp7a7i66d4n3nsi7asgmi4g96"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_base" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_base"; + version = "version:2@17.5.0.cr0"; + sha256 = "1vgyhdzsyll887xif4n882qz8ra2lxkiavmwfff0lqi8w7yxgkda"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_basement" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_basement"; + version = "version:2@17.5.0.cr0"; + sha256 = "1zbhrspj4cll1mnxjawxr6wssdmi9q9r0p8hi0mk1kzgkff44ndb"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_cast" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast"; + version = "version:2@17.0.0.cr0"; + sha256 = "0xkpymnsj3gh8c37b7kxpaghrhwgv6fyxnv39shkkp5zbynpj6vi"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework" = + fetchcipd + { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework"; + version = "version:2@17.0.0.cr0"; + sha256 = "0cgic5rscg8gack8nq1k22flg5caaxg6zvsm2kk1z1dbplhr9giz"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut"; + version = "version:2@17.0.0.cr0"; + sha256 = "0l5ylparlzynqks7kvrxck21lbpay6smnfxlhgz4zy6w82qb8inn"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging" = + fetchcipd + { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging"; + version = "version:2@16.0.0.cr0"; + sha256 = "1rbnhmiqfvg2a1fbi5p9178p9xgvazlich227lz2sx32rggv4a7s"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_fido" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_fido"; + version = "version:2@19.0.0-beta.cr0"; + sha256 = "1vxsqg8ksb8allcq26ic5wxsfzm4argrawfdl6qsnbphi52r4150"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_flags" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_flags"; + version = "version:2@17.0.0.cr0"; + sha256 = "0bkkvhss45ghmc51n9316jkp29am0ymrk18l65nkfh19v921yw44"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_gcm" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_gcm"; + version = "version:2@17.0.0.cr0"; + sha256 = "09rkrv5akx7vydbi969z61b6wvgyzl4xl2m4l0vhdldcpfbp9lbv"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_iid" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_iid"; + version = "version:2@17.0.0.cr0"; + sha256 = "09m0jlnrzc9408p2piwr9n39s9c9bj0jxa0xm4a7nbypff51im2j"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps"; + version = "version:2@17.0.0.cr0"; + sha256 = "185r0vclirvvnr0vzxbi3zyywkbxbisahgky85zjvpf2270rz84k"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_location" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_location"; + version = "version:2@17.0.0.cr0"; + sha256 = "1vyni1fxsgn30q1xa0c0j2xzdmkjbv0cfg6j2j0n45nqiwbdw34q"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype"; + version = "version:2@17.0.0.cr0"; + sha256 = "1kk0sz6lhcbi6k35b8lq0inqplyzwiw18r20imk6g8s9bc0kwjgj"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport" = + fetchcipd + { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport"; + version = "version:2@17.0.0.cr0"; + sha256 = "044xj4zvy18gjzli83lyxiky7kr9h498q3ssv0439vj4d84g1drk"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_stats" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_stats"; + version = "version:2@17.0.0.cr0"; + sha256 = "1y5mcgp84x77gsxmzcg69f93zl7xr37glmkkidh0b60n3g4givay"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_tasks" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_tasks"; + version = "version:2@17.2.0.cr0"; + sha256 = "1rbriq4wx2p7c5x0zmvvhv5772gkd2gyzprg4149cz4qrmkxjs03"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_vision" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision"; + version = "version:2@18.0.0.cr0"; + sha256 = "0am270a5db85z2nyw1y6r0s8axknmn8hhsyqndw4f79mjc1164v1"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common"; + version = "version:2@18.0.0.cr0"; + sha256 = "0mjmfysdgziis487kfhgmqwsfyg2bs8mh8cxzkv0vw35bmh578mv"; + }; + "src/third_party/android_deps/libs/com_google_android_material_material" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_material_material"; + version = "version:2@1.6.0-alpha01.cr0"; + sha256 = "15adm09x6j5kksa2kvf1p1lcgqk24s23141ynz3bq943qm32chmg"; + }; + "src/third_party/android_deps/libs/com_google_android_play_core" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_play_core"; + version = "version:2@1.10.0.cr0"; + sha256 = "1gl3ry64xrajrkaka48bi9hidcwiim1v89yc0h6vvb7kkk9cfjz2"; + }; + "src/third_party/android_deps/libs/com_google_auto_auto_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_auto_auto_common"; + version = "version:2@1.1.2.cr0"; + sha256 = "0lyckf6vgg7frjalp0npjs640p72x8f50zfqwyghjwb8cm2ydv2i"; + }; + "src/third_party/android_deps/libs/com_google_auto_service_auto_service" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_auto_service_auto_service"; + version = "version:2@1.0-rc6.cr0"; + sha256 = "0hf9jzqxy95v034ha776xnf3f8faghyrix2489nzl6sq2kc52mcw"; + }; + "src/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations"; + version = "version:2@1.0-rc6.cr0"; + sha256 = "0n0jqc90f741xgk34654lggkzkqxadxy14qmaiy3dhsvvn126drx"; + }; + "src/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations"; + version = "version:2@1.7.cr0"; + sha256 = "1za1d6il5gs78rf3flnhmkwd5l58lcj032av3psszsv5lv7jglm8"; + }; + "src/third_party/android_deps/libs/com_google_code_findbugs_jformatstring" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_code_findbugs_jformatstring"; + version = "version:2@3.0.0.cr0"; + sha256 = "0b5g8z79g1wj6r2njpxjq76izfrx4kmc65dlmaw1ng6fjh4w108i"; + }; + "src/third_party/android_deps/libs/com_google_code_findbugs_jsr305" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_code_findbugs_jsr305"; + version = "version:2@3.0.2.cr0"; + sha256 = "16iw2vv7wvpb63ih228ybsshnim23x1b5l75svvivk05cx27l2yq"; + }; + "src/third_party/android_deps/libs/com_google_code_gson_gson" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_code_gson_gson"; + version = "version:2@2.8.0.cr0"; + sha256 = "0mchxd8zc8y8qyx9f3a02623kb0r6pn00pscbprgfb2vr547vgks"; + }; + "src/third_party/android_deps/libs/com_google_dagger_dagger" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger"; + version = "version:2@2.30.cr0"; + sha256 = "11i2624s87b50drifl6rc2k3dnwwx8xll3jfwad7sid7pxq2h46k"; + }; + "src/third_party/android_deps/libs/com_google_dagger_dagger_compiler" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_compiler"; + version = "version:2@2.30.cr0"; + sha256 = "1i5flcqxvgh0ihm70l5xyg9zvl3p80qh2nfl2fspw1zqj6763f3k"; + }; + "src/third_party/android_deps/libs/com_google_dagger_dagger_producers" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_producers"; + version = "version:2@2.30.cr0"; + sha256 = "0vcplnf2m0hd914isjswvp8prnnih57fhxixhnngcgjjagygijx0"; + }; + "src/third_party/android_deps/libs/com_google_dagger_dagger_spi" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_spi"; + version = "version:2@2.30.cr0"; + sha256 = "1jsljm97r1z7y2hn8k2jpmidx3r0l8bghmhi8nykasi4pjpgmssh"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation"; + version = "version:2@2.10.0.cr0"; + sha256 = "0ccklipp0v1nd5gjw8k0gb0x13pjs1j9bh7pfbn1m4gdrw3rgwvm"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations"; + version = "version:2@2.10.0.cr0"; + sha256 = "0x8g5hd1znvakcncy74ar0n0sjvnd7p2is8p0cqnb34v3l0pb502"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api"; + version = "version:2@2.10.0.cr0"; + sha256 = "06vq6nyc16pdj6hb8dgxl95cylnd6w7l99rxgl671fp8yz5cqasb"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_core" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_core"; + version = "version:2@2.10.0.cr0"; + sha256 = "0iahrp0sgl82kvhb1208dnh2gl93nv0ms58zk5bhadsq48wczypd"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations"; + version = "version:2@2.10.0.cr0"; + sha256 = "0jmcvmp54ifflvb09q7k75zwyv9fiabv5fi74996s7rfkypsk83i"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_javac" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_javac"; + version = "version:2@9+181-r4173-1.cr0"; + sha256 = "1h1xrshv2a3hx6x9x1mrwijpiyhrigimzp0ji4w4fnflyv52kzpc"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_javac_shaded" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_javac_shaded"; + version = "version:2@9-dev-r4023-3.cr0"; + sha256 = "01ag9435x9dqw0jidrl7nm5cflikh9pkxk8a1ywnq4c4d634g60m"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_annotations"; + version = "version:2@16.0.0.cr0"; + sha256 = "11rdw5aqwyb2nx9ni83gr6jmd4344jk5zvf1f3sm2bbij1js7hkj"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_common"; + version = "version:2@19.5.0.cr0"; + sha256 = "12fazvay20mqf0km2d4jyx1mfrxy4a0i5pqph8syh1lzm3b3y399"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_components" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_components"; + version = "version:2@16.1.0.cr0"; + sha256 = "1xly7a2qaxscp2p1hmkggsrlni325aj6z5y3sm5qhmazci4bxnm0"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_encoders" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders"; + version = "version:2@16.1.0.cr0"; + sha256 = "045ba4l7jvz53nn425w24jdgvlp1jwag2kb09q3pyiw6rwwqabfw"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json"; + version = "version:2@17.1.0.cr0"; + sha256 = "0zllj52nc7lv56wc6lvis0hxi1gii7y9frkvdfmmid6wrrlw00xx"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_iid" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid"; + version = "version:2@21.0.1.cr0"; + sha256 = "0v6x78z8qpdz07dqb9sbv98ij7ylj3x8lbbxlnxdgs3373pyg9q1"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop"; + version = "version:2@17.0.0.cr0"; + sha256 = "146kilgl7x7xigmpqzv1fcdsmwidirqqf6hclz9rmmx5mg42c53l"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_installations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations"; + version = "version:2@16.3.5.cr0"; + sha256 = "1x9nlyj9nphn6wfwnjkyizxgv21mvkpw2gs4cjj4m2ng44r73qs2"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop"; + version = "version:2@16.0.1.cr0"; + sha256 = "0kmv1r0vckl22qjmhmmbg6i0k1iqcdf61pswx8pkq31yvx1xahxk"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector"; + version = "version:2@18.0.0.cr0"; + sha256 = "115s741xrpazn0z2mi4arp2f2y02jxnlinag49h7yzr4f43p4qwy"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_messaging" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_messaging"; + version = "version:2@21.0.1.cr0"; + sha256 = "1fbjzf622qha3m8k5q1ks2ys2l7wz4qljbqfxb34x4xskkvdqfjk"; + }; + "src/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java"; + version = "version:2@2.0.3.cr0"; + sha256 = "1whzndx6lf0k8dyyxb0fdinqd6lb7l1mkkgds1frxhfgg115dvyf"; + }; + "src/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format"; + version = "version:2@1.5.cr0"; + sha256 = "16kp7w3c3skrjbx6g71k5wmh0a8ygm3fc9nxfn8kxh7qiy4axyqc"; + }; + "src/third_party/android_deps/libs/com_google_guava_failureaccess" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_guava_failureaccess"; + version = "version:2@1.0.1.cr0"; + sha256 = "0z0mp28k0d59v41qmr3kinb4wyhpi2h12ppkjgx0kppw3nz7cbq4"; + }; + "src/third_party/android_deps/libs/com_google_guava_guava" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_guava_guava"; + version = "version:2@31.0-jre.cr0"; + sha256 = "0fyvgj7x6an5a5zaq88xbapxa0r9j4izqwy83ml1qwlrlvi6xjnx"; + }; + "src/third_party/android_deps/libs/com_google_guava_guava_android" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_guava_guava_android"; + version = "version:2@31.0-android.cr0"; + sha256 = "0wrfxqrpic10bcr2a2vjybqqnzcmnjmhl4xfxkah65aj9945x3p6"; + }; + "src/third_party/android_deps/libs/com_google_guava_listenablefuture" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_guava_listenablefuture"; + version = "version:2@1.0.cr0"; + sha256 = "187dhlm3naks9dq0rw2710d566sfbckricxrzvskf9swmc6aw7q2"; + }; + "src/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations"; + version = "version:2@1.3.cr0"; + sha256 = "166rvbzy6v2kdjljqj6xihi76f3i1nvmblmyb9bnx67biil4cxc5"; + }; + "src/third_party/android_deps/libs/com_google_protobuf_protobuf_java" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_java"; + version = "version:2@3.4.0.cr0"; + sha256 = "18xdgm0qy8a1ms5lbdkmk7kh5dpxkg8icvqa7zhsii47sglr04hy"; + }; + "src/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite"; + version = "version:2@3.19.3.cr0"; + sha256 = "0x2y8d0c3j02wjy9zn6jz9x5cn2min5dpyg7hmn6yssw5vww323d"; + }; + "src/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils"; + version = "version:2@1.3.0.cr0"; + sha256 = "1zqbqnbs03i8c8xp2prj01acrg36w9mm0fjkxyjkppiwblcdhfih"; + }; + "src/third_party/android_deps/libs/com_squareup_javapoet" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_squareup_javapoet"; + version = "version:2@1.13.0.cr0"; + sha256 = "1c0n842klp8rmdla7k35rya4wsam8wambb8j7c2mxvhn1vmwzs7a"; + }; + "src/third_party/android_deps/libs/com_squareup_javawriter" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_squareup_javawriter"; + version = "version:2@2.1.1.cr0"; + sha256 = "066cj5sqnw32rcbzbf00695n8nlk6rjxfslxmmzkl9ka8r5d2ahf"; + }; + "src/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils"; + version = "version:2@4.0.cr0"; + sha256 = "1jkdnma8wlcy4fiisbdihybhn783hq03pjm1pag0x25h0rx0h0yz"; + }; + "src/third_party/android_deps/libs/javax_annotation_javax_annotation_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/javax_annotation_javax_annotation_api"; + version = "version:2@1.3.2.cr0"; + sha256 = "0h3ha41h7cj1rp30iwsyabzsmd9i1ydlzigljm65mrmpk8cni9vz"; + }; + "src/third_party/android_deps/libs/javax_annotation_jsr250_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/javax_annotation_jsr250_api"; + version = "version:2@1.0.cr0"; + sha256 = "0lsp20gny3inm5k2cahyldizqm8xryb56lhdzripc5vw2fp5jady"; + }; + "src/third_party/android_deps/libs/javax_inject_javax_inject" = fetchcipd { + package = "chromium/third_party/android_deps/libs/javax_inject_javax_inject"; + version = "version:2@1.cr0"; + sha256 = "10wyr7izgi6n2fl2mi0kki2xkcp77nc42ar5pysf1dvh6d52h20d"; + }; + "src/third_party/android_deps/libs/nekohtml_nekohtml" = fetchcipd { + package = "chromium/third_party/android_deps/libs/nekohtml_nekohtml"; + version = "version:2@1.9.6.2.cr0"; + sha256 = "14id93112xhb47ic78acc6r6ypmcryq4hddvhmq927cd0klxf44n"; + }; + "src/third_party/android_deps/libs/nekohtml_xercesminimal" = fetchcipd { + package = "chromium/third_party/android_deps/libs/nekohtml_xercesminimal"; + version = "version:2@1.9.6.2.cr0"; + sha256 = "1w0x6z4792nvg69pfxkqpmqnfwdghdgfaajw68s3z522dzhrv3iz"; + }; + "src/third_party/android_deps/libs/net_ltgt_gradle_incap_incap" = fetchcipd { + package = "chromium/third_party/android_deps/libs/net_ltgt_gradle_incap_incap"; + version = "version:2@0.2.cr0"; + sha256 = "15zb0bfh59jccj43zndfh8v235jw37cr9j4nd3bj92anslyrz7ya"; + }; + "src/third_party/android_deps/libs/net_sf_kxml_kxml2" = fetchcipd { + package = "chromium/third_party/android_deps/libs/net_sf_kxml_kxml2"; + version = "version:2@2.3.0.cr0"; + sha256 = "11w4gzw2ygy9ifv64pi1dky7f20229phpxkkawr45cyy1cnkcl06"; + }; + "src/third_party/android_deps/libs/org_apache_ant_ant" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_ant_ant"; + version = "version:2@1.8.0.cr0"; + sha256 = "0lqbgw8apkyx6sv9h273wn0k758zbkb2r6g9y9s93yc4m9lcpha2"; + }; + "src/third_party/android_deps/libs/org_apache_ant_ant_launcher" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_ant_ant_launcher"; + version = "version:2@1.8.0.cr0"; + sha256 = "1r8rbxppalkdkrcajhwad3s2xidxp3a4kn7cngyyj6f6cvkd61an"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks"; + version = "version:2@2.1.3.cr0"; + sha256 = "0c0wpmzldl8xwxkmz7sg336a60g1dq90z1691wsy6nkjcbzx5fig"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_artifact" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact"; + version = "version:2@2.2.1.cr0"; + sha256 = "0sryj92ly4kl77z39454whnp86p9yi5mncdj4pn3rw46hgz5k464"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager"; + version = "version:2@2.2.1.cr0"; + sha256 = "1l4bbj7z9aw62acjnsnwz6bmhf147naffg95zzxwxf486dpzym0l"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics"; + version = "version:2@2.2.1.cr0"; + sha256 = "14njx071kqnqw6rxg1chz1pzgmxv8f6z4kqdkql8n5mmc4kygkzq"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_model" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_model"; + version = "version:2@2.2.1.cr0"; + sha256 = "0d5snhc9klrsz735ng4dzzp408jrwa9v4bh5cn9nkjf0azp9c504"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry"; + version = "version:2@2.2.1.cr0"; + sha256 = "1hxw7vgr2qcc9k9i4g5y6ixras23lfp434nzcycjis81ymj608qq"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_profile" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_profile"; + version = "version:2@2.2.1.cr0"; + sha256 = "06vk8m41p1xazq42xp700dh3izr1h4fsp1afan2lgp4jh9pnvyxk"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_project" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_project"; + version = "version:2@2.2.1.cr0"; + sha256 = "1q3fxdsiw6wd5zcx0zgskg5s8kwlq3x92hxgis84lpkz05jj33h3"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata"; + version = "version:2@2.2.1.cr0"; + sha256 = "13228089dpfz5n4i9zlm2wjqklv4s5gzbrr6vzbjxik5cl562a3f"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_settings" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_settings"; + version = "version:2@2.2.1.cr0"; + sha256 = "0gkf2z0cga4khhba2gp0cpk0l43d8x7xrppv42cl7p8znyxip6cs"; + }; + "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file"; + version = "version:2@1.0-beta-6.cr0"; + sha256 = "0ap8mz7g1d29jka84jlaqvfgnjfp57pcv9jg79wbfja9xvfswvy9"; + }; + "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight"; + version = "version:2@1.0-beta-6.cr0"; + sha256 = "0pj4lbq54c88pf5xzwf5inbc3083lnqmrb2n6xsyggrf79ir2mhj"; + }; + "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared"; + version = "version:2@1.0-beta-6.cr0"; + sha256 = "0h3lfgn2aa0c2jrgdjlzhrhjxp8wj3b0hm8n96c9wnfp7dqrdiah"; + }; + "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api"; + version = "version:2@1.0-beta-6.cr0"; + sha256 = "01cc4s4g4f9hcziap1p0529k8p7mqpscjc23qjvc7sv5jk9yd6dc"; + }; + "src/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup"; + version = "version:2@1.2.1.cr0"; + sha256 = "03i164wm6lwqiqgzwwhjvhfwmj5hqpr5f6i6hzl75plkq90rxjhp"; + }; + "src/third_party/android_deps/libs/org_checkerframework_checker_compat_qual" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_checkerframework_checker_compat_qual"; + version = "version:2@2.5.5.cr0"; + sha256 = "0v1nkl6fjpmy4w3h2cdkghc9s8sdyfdi5pmvmhvzpc536dk844i4"; + }; + "src/third_party/android_deps/libs/org_checkerframework_checker_qual" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_checkerframework_checker_qual"; + version = "version:2@3.12.0.cr0"; + sha256 = "089ycxas3ya1abkm4kk1y7v1gz57dm159ld7mck6ha7rhis803kj"; + }; + "src/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone"; + version = "version:2@3.15.0.cr0"; + sha256 = "0sgfknqkwl7c4zykrlx88qlp5jya7rnhyyb3cadkgc4bhbyb9kvc"; + }; + "src/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations"; + version = "version:2@1.17.cr0"; + sha256 = "1xfchxaklc8w1rjj46yiqc3v9sljvzwp018yscb0wzqmrarv689q"; + }; + "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default"; + version = "version:2@1.0-alpha-9-stable-1.cr0"; + sha256 = "1xvw9r8gz3cc6qw2mz165z3ib95ldi9kkagascd951nmvdacl06j"; + }; + "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation"; + version = "version:2@1.11.cr0"; + sha256 = "1akvdbcmh0nramh97n0yw4ddgasr6f2ypgc853ni9g3rgafm4fcv"; + }; + "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils"; + version = "version:2@1.5.15.cr0"; + sha256 = "1vmgr1dm88i7mjc82z5s29svhxy121zs1f39g22prwjygksdpilv"; + }; + "src/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit"; + version = "version:2@4.4.1.201607150455-r.cr0"; + sha256 = "1086c3y6f213pnyizlr5aqy0x9f37xpjbpsl6mv5bvy8y6f8dvmw"; + }; + "src/third_party/android_deps/libs/org_jetbrains_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_annotations"; + version = "version:2@13.0.cr0"; + sha256 = "1l75bqhnrbynaknclp7236wv1i4bhy4mwp0qnp4rl5hglxjdsg38"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib"; + version = "version:2@1.6.10.cr0"; + sha256 = "1wym3wh62xjki85y7gksq3nv8ism8in0gv4ar4pa3xhs1n64hyfd"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common"; + version = "version:2@1.6.10.cr0"; + sha256 = "1qsk426jqa7vdpzdfig2ricbdbggp1fkkaiarzh04nd47my02spi"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7"; + version = "version:2@1.5.0.cr0"; + sha256 = "038bblp1s0p06nx2f79dc3dnxwp9imrmjdyr3igh8mmn46lyr306"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8"; + version = "version:2@1.5.0.cr0"; + sha256 = "012yrnn7digalil885737ygf2fdhx3g294xszhcyr097289whv4m"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android"; + version = "version:2@1.5.0.cr0"; + sha256 = "05x6w0mj89qvvfxnb806mhnsf7p165da8cab4ns7vk1w9zvh3gjv"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm"; + version = "version:2@1.5.0.cr0"; + sha256 = "18sn0if3cxmram0r053bvy9xvl6kxbhi347h7vkdrq8sxh6sll5i"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm"; + version = "version:2@0.1.0.cr0"; + sha256 = "06b2iya1cvhflslnl5ij0hsha4jwgal64xwrl2l5i6yyzaii8mpm"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm"; + version = "version:2@7.0.cr0"; + sha256 = "1j2mxgrj76cr780xqawxylwcslnmgfh0fp8cnwb0lrz1qlspmvbv"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm_analysis" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_analysis"; + version = "version:2@7.0.cr0"; + sha256 = "1k7ghsaqb5d2xyx965prp39grpqajk7p4qpwzc3wvdxmgcxcb68s"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm_commons" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_commons"; + version = "version:2@7.0.cr0"; + sha256 = "1x0ck0bjcbirwkm8xh43w5y2ghwgrpvakzsszlwlnarawcadk0lz"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm_tree" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_tree"; + version = "version:2@7.0.cr0"; + sha256 = "18n8q2gxzw42icsa47nsp98ja0bgm63i91x1qgbn3pjm8fiax3q3"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm_util" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_util"; + version = "version:2@7.0.cr0"; + sha256 = "171s0xhdjsxmvm8pxzjkabdzl0nm1a29bylwxhsmz8i986xy56xr"; + }; + "src/third_party/android_deps/libs/org_pcollections_pcollections" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_pcollections_pcollections"; + version = "version:2@2.1.2.cr0"; + sha256 = "1c8i3znyqjkhq4wi3qryvqramzjhkymczxxn0iiky4hij6gwajza"; + }; + "src/third_party/android_deps/libs/org_robolectric_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_annotations"; + version = "version:2@4.3.1.cr0"; + sha256 = "1mpbd90ynigkvm74n9wfvp8f3zv87nyw1g88nihj7dcna03l4y05"; + }; + "src/third_party/android_deps/libs/org_robolectric_junit" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_junit"; + version = "version:2@4.3.1.cr0"; + sha256 = "1cgpc8bx66x6i0kam05y4q17ikazzc19q2ykfdgpcwyj2kmca66g"; + }; + "src/third_party/android_deps/libs/org_robolectric_pluginapi" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_pluginapi"; + version = "version:2@4.3.1.cr0"; + sha256 = "0r7fdjj09jmxah0lm7lbiy3ihw1g2myx3rbf4wky8pyvqxx589vi"; + }; + "src/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver"; + version = "version:2@4.3.1.cr0"; + sha256 = "1nyrqpvvagvnvlb5k1yk89a8jndy510xd81j4gy8q2xxypdvwphq"; + }; + "src/third_party/android_deps/libs/org_robolectric_resources" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_resources"; + version = "version:2@4.3.1.cr0"; + sha256 = "0mqyk7r1943h7bhz7kf5yhcd6cbp65swlabkxv7alr9svslzs5a9"; + }; + "src/third_party/android_deps/libs/org_robolectric_robolectric" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_robolectric"; + version = "version:2@4.3.1.cr0"; + sha256 = "0k8qfnil5xl2pdf12qfcf49h9mzs1l612r7khdvnpa64l5npwa31"; + }; + "src/third_party/android_deps/libs/org_robolectric_sandbox" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_sandbox"; + version = "version:2@4.3.1.cr0"; + sha256 = "126aws364b1bxmwspbn2jk2nzw2w8rrcrp03rl3ggnq26al6gysp"; + }; + "src/third_party/android_deps/libs/org_robolectric_shadowapi" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_shadowapi"; + version = "version:2@4.3.1.cr0"; + sha256 = "0jnaxvm9hwz2fj8qgnpxdwbcnjph11qcrjp2nf5z0657gxbfwscj"; + }; + "src/third_party/android_deps/libs/org_robolectric_shadows_framework" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_framework"; + version = "version:2@4.3.1.cr0"; + sha256 = "1gvqzlxmvlhgyd1q3fgds8fw679hmjqxaas6irjy0xnkj8qpyw1y"; + }; + "src/third_party/android_deps/libs/org_robolectric_shadows_multidex" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_multidex"; + version = "version:4.3.1-cr1"; + sha256 = "1f4q4dspngfblqfdasydv64ik4bgw4jmrfb1686l5jv8dj27dn2k"; + }; + "src/third_party/android_deps/libs/org_robolectric_shadows_playservices" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_playservices"; + version = "version:2@4.3.1.cr0"; + sha256 = "0ms20s8ds7mkslayngv9ll957zpxqr535ch7ykdfsfqqj3cvaj20"; + }; + "src/third_party/android_deps/libs/org_robolectric_utils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_utils"; + version = "version:2@4.3.1.cr0"; + sha256 = "022fpdpfhy63vcw7gvdp0knw5a3xf0ix9v4mf63bb8i2630zh53c"; + }; + "src/third_party/android_deps/libs/org_robolectric_utils_reflector" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_utils_reflector"; + version = "version:2@4.3.1.cr0"; + sha256 = "1v5mz4rr6kqk2fg4kl26hsjhdwzaahdv6lkqkpiw6n908dcr4wdf"; + }; + "src/third_party/android_ndk" = fetchgit { + url = "https://chromium.googlesource.com/android_ndk.git"; + rev = "9644104c8cf85bf1bdce5b1c0691e9778572c3f8"; + sha256 = "0wjkpsk5kns5mq1mscy0sia4pqxlcf97cl2kzdnp33mxa9mjgw6b"; + fetchSubmodules = true; + }; + "src/third_party/android_protobuf/src" = fetchgit { + url = "https://android.googlesource.com/platform/external/protobuf.git"; + rev = "7fca48d8ce97f7ba3ab8eea5c472f1ad3711762f"; + sha256 = "1icb2s3lp1vsximymk3cm8adwj7xk3awb4a7plxj88zqphydkk0d"; + fetchSubmodules = true; + }; + "src/third_party/android_protoc" = fetchcipd { + package = "chromium/third_party/android_protoc"; + version = "sLsJWojddBL2u8NYwNh6pJsqp_bL1ttmYIlBnhiIQ1QC"; + sha256 = "00qag88lcvgz2f3krqlj8fgjy56ck3lkafk7dq8x6lxz1h1m5wim"; + }; + "src/third_party/android_rust_toolchain/toolchain" = fetchcipd { + package = "chromium/third_party/android_rust_toolchain/linux-amd64"; + version = "BKAbvHjGv4-os-v8MS3I54bPsY-397xgaJ3yBeIVS20C"; + sha256 = "11k51g71jm6qfxb0ncghdm5ccv0q63zpyc0qz5q76w65h3402l47"; + }; + "src/third_party/android_sdk/androidx_browser/src" = fetchgit { + url = "https://chromium.googlesource.com/external/gob/android/platform/frameworks/support/browser.git"; + rev = "65086eb5e52c16778fa7b4f157156d17b176fcb3"; + sha256 = "1ypad79hb6m88bhrzlklz4cbba6gmrzxcls91z923ip3wdsg90wl"; + fetchSubmodules = true; + }; + "src/third_party/android_sdk/public" = symlinkJoin { + name = "cipd-joined"; + paths = [ + (fetchcipd { + package = "chromium/third_party/android_sdk/public/build-tools/31.0.0"; + version = "tRoD45SCi7UleQqSV7MrMQO1_e5P8ysphkCcj6z_cCQC"; + sha256 = "0q81fbacrram3b8qzv1icwpa5wl16plv5giqyh2xy9gaz1xnh56h"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/cmdline-tools"; + version = "PGPmqJtSIQ84If155ba7iTU846h5WJ-bL5d_OoUWEWYC"; + sha256 = "1svag2krs4k2lq7cj2yhg2z7lmbyshpgppzsv6i451bdzaccbj2j"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/emulator"; + version = "gMHhUuoQRKfxr-MBn3fNNXZtkAVXtOwMwT7kfx8jkIgC"; + sha256 = "0a872r5yfpp1bk191951zf1akrcvxabdi2axiqxmmslzqqds6gi4"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/extras"; + version = "ppQ4TnqDvBHQ3lXx5KPq97egzF5X2FFyOrVHkGmiTMQC"; + sha256 = "0zxfabvlmnh6avqcfs8g8w83ci1nnm9n68jvprsx5baiisqzv0ss"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/patcher"; + version = "I6FNMhrXlpB-E1lOhMlvld7xt9lBVNOO83KIluXDyA0C"; + sha256 = "1q03jm591c7fn1jra007pl43bs6hxm46cynnv3xx8rwyiwpbdwy0"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/platform-tools"; + version = "g7n_-r6yJd_SGRklujGB1wEt8iyr77FZTUJVS9w6O34C"; + sha256 = "1mzk6j31wd0lsznwgydbcfiw1iqf22rr606nx8149ygkfybrwic1"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/platforms/android-31"; + version = "lL3IGexKjYlwjO_1Ga-xwxgwbE_w-lmi2Zi1uOlWUIAC"; + sha256 = "0i5zlry2zllmlmzymwv2b622rpmhp5qpxjp2vggffyaz627y4gn9"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/sources/android-31"; + version = "_a_BcnANjPYw5mSKlNHa7GFY8yc1kdqj2rmQgac7yUcC"; + sha256 = "154bn5dkk67zm6ayivxl8s6nxhr8rz1zi13ms52gkbd08zshnqsq"; + }) + ]; + }; + "src/third_party/android_support_test_runner" = fetchcipd { + package = "chromium/third_party/android_support_test_runner"; + version = "96d4bf848cd210fdcbca6bcc8c1b4b39cbd93141"; + sha256 = "1xk3b48zwan3pyg94mjkmain8r2iyld7lvzy3zd8yaz5bairfhif"; + }; + "src/third_party/android_system_sdk" = fetchcipd { + package = "chromium/third_party/android_system_sdk/public"; + version = "oSfDIvHlCa6W0gS79Q5OOfB9E4eBg3uAvi3BEDN21U0C"; + sha256 = "06nl413nfdj51ahaxwh7n95lpjjvrincwjgnq9s1a1092zhig0zb"; + }; + "src/third_party/androidx" = fetchcipd { + package = "chromium/third_party/androidx"; + version = "nPCy7pWgirlw8qxgh7t5Rh6g8Dzl-p9fGdw86SNpKFUC"; + sha256 = "1ya92mq5wjscc5fvnsqg85fh494kzdkc4yjfhax8g900vinkys60"; + }; + "src/third_party/angle" = fetchgit { + url = "https://chromium.googlesource.com/angle/angle.git"; + rev = "cc8b741c6ba4cf3cd56d6bc1173b029c816f8ced"; + sha256 = "11s212x0l28dwzf9lmlgsgl329pyqf0gnvvlgnzbdbqqgkj1yy0b"; + fetchSubmodules = true; + }; + "src/third_party/angle/third_party/VK-GL-CTS/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS"; + rev = "834c2e16ae1c4977b705be66508a35a54fd3f4ad"; + sha256 = "0y3pm4h8wxg9jzcf3178vycjaz7jbdrv210gkshc87h189z078cx"; + fetchSubmodules = true; + }; + "src/third_party/angle/third_party/glmark2/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/glmark2/glmark2"; + rev = "ca8de51fedb70bace5351c6b002eb952c747e889"; + sha256 = "1fdfk4rwsnp8wwkmpdq7aqvyrd3amwqyr3b3hs2wb7rarmcb7grg"; + fetchSubmodules = true; + }; + "src/third_party/angle/third_party/rapidjson/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/Tencent/rapidjson"; + rev = "7484e06c589873e1ed80382d262087e4fa80fb63"; + sha256 = "1g7syqklm3bpsixa5gybvqhv3yi9bgf173k11as55wvlshmkmjgp"; + fetchSubmodules = true; + }; + "src/third_party/apache-portable-runtime/src" = fetchgit { + url = "https://chromium.googlesource.com/external/apache-portable-runtime.git"; + rev = "c3f11fcd86b42922834cae91103cf068246c6bb6"; + sha256 = "1qb3qgwhn94v56kfw4ciaxbzfad834d1dgdhckhj3vcr86bchj5j"; + fetchSubmodules = true; + }; + "src/third_party/arcore-android-sdk-client" = fetchcipd { + package = "chromium/third_party/arcore-android-sdk-client"; + version = "fUSZ4jxIhIx34TxRIcrmOu76-khcka_Gpn0_t9lKCWQC"; + sha256 = "0bm7wrp9nq76hnrwaq2j2qwkvywlmyvc04wlqvvw77vqgh0q0lid"; + }; + "src/third_party/arcore-android-sdk/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google-ar/arcore-android-sdk.git"; + rev = "eaa85941f2d724c60671bf94f46de7178baba7e6"; + sha256 = "12frfx2g3i8hynkb0shvp817qh9j5267j5ynq21kagab2c9ph14s"; + fetchSubmodules = true; + }; + "src/third_party/boringssl/src" = fetchgit { + url = "https://boringssl.googlesource.com/boringssl.git"; + rev = "68addd2f719422cd00f44f06c330457269d3facf"; + sha256 = "0fa9966n096269cjdqlqw073iij959c965djxfmnrirjpf868b99"; + fetchSubmodules = true; + }; + "src/third_party/bouncycastle" = fetchcipd { + package = "chromium/third_party/bouncycastle"; + version = "c078e87552ba26e776566fdaf0f22cd8712743d0"; + sha256 = "0r1a513bllx5pv9v2bp4rcy8ca79ahx38iy1zp7ac6xjz8527pwr"; + }; + "src/third_party/breakpad/breakpad" = fetchgit { + url = "https://chromium.googlesource.com/breakpad/breakpad.git"; + rev = "08bd844599bf04c71707e8f59a8013a941264695"; + sha256 = "0r8v1jzzrl0y0pibg8s7xzn1dyg4dq3nnh4a1shm69kq49wby6rx"; + fetchSubmodules = true; + }; + "src/third_party/byte_buddy" = fetchcipd { + package = "chromium/third_party/byte_buddy"; + version = "c9b53316603fc2d997c899c7ca1707f809b918cd"; + sha256 = "1dffk7k27ng3h5zkx7qgaynydpm9czk3zp8crkghjs6xzdkzfdry"; + }; + "src/third_party/byte_buddy/android_sdk_build_tools_25_0_2" = fetchcipd { + package = "chromium/third_party/android_sdk/public/build-tools"; + version = "kwIs2vdfTm93yEP8LG5aSnchN4BVEdVxbqQtF4XpPdkC"; + sha256 = "0bs6lp21wpbhg3cfna1s7ncjn0l6j7zdx83fk22xw3350mjlbnm7"; + }; + "src/third_party/cast_core/public/src" = fetchgit { + url = "https://chromium.googlesource.com/cast_core/public"; + rev = "e7dac9fd5f5bf0158015b33a2594e30c1e4ae610"; + sha256 = "1bxq0lzbr1xb2k56yq1p8ifwgdhknc6wllnp44vqv5cdqlsb9jyq"; + fetchSubmodules = true; + }; + "src/third_party/catapult" = fetchgit { + url = "https://chromium.googlesource.com/catapult.git"; + rev = "1fe05501cf4f6f9f95a85b12f04e59a4485e1ffe"; + sha256 = "1ssv8dc1pwi7sj2qf0hmffjmrhdgak6rl8ima0gc08mjvd6p50x6"; + fetchSubmodules = true; + }; + "src/third_party/ced/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git"; + rev = "ba412eaaacd3186085babcd901679a48863c7dd5"; + sha256 = "09jjr2nffp2b6sqrk0bx4zrqvbqf8isq0i2v7qzng2zn33hvn8f9"; + fetchSubmodules = true; + }; + "src/third_party/checkstyle" = fetchcipd { + package = "chromium/third_party/checkstyle"; + version = "UAf8iarsiPx9B6ClHuyeRNM6py76TUVdylyGLTmpb4IC"; + sha256 = "0m3n0zhjljnyankcli97p48kkji7c9nwrr32j29l806dmpysqzqa"; + }; + "src/third_party/cld_3/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/cld_3.git"; + rev = "576305689d23da93e2f5e04a3de5afbe60d339da"; + sha256 = "046kjrwy9k82wdss48y1bdzzry03il59lanfk28lzgsgsa5h7h06"; + fetchSubmodules = true; + }; + "src/third_party/colorama/src" = fetchgit { + url = "https://chromium.googlesource.com/external/colorama.git"; + rev = "799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8"; + sha256 = "0llfx0c2rs270431s8yi8ffmn45zxncwxmwby42q3adv45il87qq"; + fetchSubmodules = true; + }; + "src/third_party/crc32c/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/crc32c.git"; + rev = "fa5ade41ee480003d9c5af6f43567ba22e4e17e6"; + sha256 = "0vivyzhljrsz6yp5fyyq86bq3hih1zxv77jv41j82c251yym60kz"; + fetchSubmodules = true; + }; + "src/third_party/cros_system_api" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/platform2/system_api.git"; + rev = "8b6ea1312fc4959c28a16526ca20d5d703c51f83"; + sha256 = "0fl34yf4hy52bfz6czjimagjshbcfdkfaypphpq7vpgi44ygkc57"; + fetchSubmodules = true; + }; + "src/third_party/dav1d/libdav1d" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/videolan/dav1d.git"; + rev = "cce2b0564d3b0aa1a5e4ec0c561b6a1b8497cebb"; + sha256 = "0ndx24c9a5218xwa2siiys4d580mc1rrvpcmm54zn8hrvzj2jc42"; + fetchSubmodules = true; + }; + "src/third_party/dawn" = fetchgit { + url = "https://dawn.googlesource.com/dawn.git"; + rev = "e846fefc34da4ba904c681cd275ada191674cfb5"; + sha256 = "0xc36lg3qyp9j83ckhldb3dv7kjjiyzcscyrl6x7n19700sa25al"; + fetchSubmodules = true; + }; + "src/third_party/dawn/third_party/tint" = fetchgit { + url = "https://dawn.googlesource.com/tint"; + rev = "555e94e7e36551ec8ae577a2ea1e958c8052f3fd"; + sha256 = "1qb1hdvjk8hcj1s77m67waa71f5a57arffs7rfx1ilpq3rsjv6b8"; + fetchSubmodules = true; + }; + "src/third_party/depot_tools" = fetchgit { + url = "https://chromium.googlesource.com/chromium/tools/depot_tools.git"; + rev = "988c0af5bed05e97d351297ed9f3221bfe42a205"; + sha256 = "0jhxr2gp4nqsqplqsrrzxxw53m3rl9qdmbiq6sxm1icscpndr991"; + fetchSubmodules = true; + }; + "src/third_party/devtools-frontend/src" = fetchgit { + url = "https://chromium.googlesource.com/devtools/devtools-frontend"; + rev = "23dc975793cd9335a2e51b4440c76268a4d56159"; + sha256 = "1mgwsix918v6gnlhna2ahi2r34hvai9azcv7h8yrp9y8zawwvvmv"; + fetchSubmodules = true; + }; + "src/third_party/devtools-frontend/src/third_party/esbuild" = fetchcipd { + package = "infra/3pp/tools/esbuild/${platform}"; + version = "version:2@0.14.13.chromium.2"; + sha256 = "048cv3givcy0yssgg994z17qfsr8ixjjmz42apqmpwgz7bmysij1"; + }; + "src/third_party/dom_distiller_js/dist" = fetchgit { + url = "https://chromium.googlesource.com/chromium/dom-distiller/dist.git"; + rev = "199de96b345ada7c6e7e6ba3d2fa7a6911b8767d"; + sha256 = "170qd75bwc0gld86vf32w36smc15wrafxqlg332mv5fhcl7h3qfa"; + fetchSubmodules = true; + }; + "src/third_party/eigen3/src" = fetchgit { + url = "https://chromium.googlesource.com/external/gitlab.com/libeigen/eigen.git"; + rev = "7db0ac977acf276fb0817cfb89e490cdbae0ab56"; + sha256 = "0n1r7ry9n5ii74995issik7qh762yb91pmn6d89p3xrdpig3iyxf"; + fetchSubmodules = true; + }; + "src/third_party/emoji-segmenter/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/emoji-segmenter.git"; + rev = "9ba6d25d0d9313569665d4a9d2b34f0f39f9a50e"; + sha256 = "06qn0sjprsak0b2schahfkl3nwrrrwbls7hhn02vp7ham806cgx1"; + fetchSubmodules = true; + }; + "src/third_party/espresso" = fetchcipd { + package = "chromium/third_party/espresso"; + version = "y8fIfH8Leo2cPm7iGCYnBxZpwOlgLv8rm2mlcmJlvGsC"; + sha256 = "1kiahac6knkm2zfi6b2avfpank3m5v1439wjrw9r37vh6lvxab2y"; + }; + "src/third_party/expat/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git"; + rev = "65a21f2b2a306d29b44e70264aca948aa0454219"; + sha256 = "1v9h33xzj34qc4am5r8d1dggqyx9yhpj6f1lwdqmv7a63lnffsbs"; + fetchSubmodules = true; + }; + "src/third_party/farmhash/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/farmhash.git"; + rev = "816a4ae622e964763ca0862d9dbd19324a1eaf45"; + sha256 = "1mqxsljq476n1hb8ilkrpb39yz3ip2hnc7rhzszz4sri8ma7qzp6"; + fetchSubmodules = true; + }; + "src/third_party/ffmpeg" = fetchgit { + url = "https://chromium.googlesource.com/chromium/third_party/ffmpeg.git"; + rev = "574c39cce3231c69bc9a02ac475c27d944bdb113"; + sha256 = "1ir1m8f8h20s7rffqpv7kxflj0qlhrxcbkj6ihf05yinfp9grgc8"; + fetchSubmodules = true; + }; + "src/third_party/flac" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/flac.git"; + rev = "af862024c8c8fa0ae07ced05e89013d881b00596"; + sha256 = "1y1pcdkza3fqvqam1pw5qm38pwy848mmfykqx06ir187p107c9d4"; + fetchSubmodules = true; + }; + "src/third_party/flatbuffers/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/flatbuffers.git"; + rev = "b8aaccee8248059b2af032cca0eb1d2ddbdb6cdc"; + sha256 = "0p33547fi72z1qh19ydg8ni9qlx9wc5lzl837h67bgy7qfksjsch"; + fetchSubmodules = true; + }; + "src/third_party/fontconfig/src" = fetchgit { + url = "https://chromium.googlesource.com/external/fontconfig.git"; + rev = "452be8125f0e2a18a7dfef469e05d19374d36307"; + sha256 = "1gfdqi80qvq3h4xbsrsfh9bmdzaiczzaaq95m0mxpd6xdqi6pizq"; + fetchSubmodules = true; + }; + "src/third_party/fp16/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/Maratyszcza/FP16.git"; + rev = "4dfe081cf6bcd15db339cf2680b9281b8451eeb3"; + sha256 = "06a8dfl3a29r93nxpp6hpywsajz5d555n3sqd3i6krybb6swnvh7"; + fetchSubmodules = true; + }; + "src/third_party/freetype-testing/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/freetype/freetype2-testing.git"; + rev = "fe2eddae6176f75e2101289eeda22a5ff3d808ca"; + sha256 = "1v6fxas665r8hvasqp6rrryh2scyp9ypbrmjq14lama60p94bmgc"; + fetchSubmodules = true; + }; + "src/third_party/freetype/src" = fetchgit { + url = "https://chromium.googlesource.com/chromium/src/third_party/freetype2.git"; + rev = "034e5dbf92ea3a7ea7c9322e47a3a50ff23f7b55"; + sha256 = "04z0fh7whs2gzpdfh1hndjg3ipmz1k48jcys01k45f1qhya6r8qn"; + fetchSubmodules = true; + }; + "src/third_party/gemmlowp/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/gemmlowp.git"; + rev = "13d57703abca3005d97b19df1f2db731607a7dc2"; + sha256 = "0w4ap82b73kh49pw913905al6q6lfqbgp666c0mcv2k01krh771v"; + fetchSubmodules = true; + }; + "src/third_party/glfw/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/glfw/glfw.git"; + rev = "94773111300fee0453844a4c9407af7e880b4df8"; + sha256 = "0q60nx877lc7grv2rfhja55zqvpvc6qdpr28hvs71dwyqy2q6225"; + fetchSubmodules = true; + }; + "src/third_party/google-truth" = fetchcipd { + package = "chromium/third_party/google-truth"; + version = "u8oovXxp24lStqX4d54htRovta-75Sy2w7ijg1TL07gC"; + sha256 = "0h8jl92i2lx2mgr5swirkpyvrq6af5nk6hagd8sfl4scsx0wf78b"; + }; + "src/third_party/googletest/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/googletest.git"; + rev = "ea55f1f52c489535f0d3b583c81529762c9cb5ea"; + sha256 = "15v9qyga4l2l561ymip1qk4dn5qjxavvc0lx2x08ck2vwn010rjf"; + fetchSubmodules = true; + }; + "src/third_party/grpc/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/grpc/grpc.git"; + rev = "754913545189b819829284b79ac5a4d31fddbdcc"; + sha256 = "09khmi69ds1w8syd6z0r2wlscgfn002fqmg7g9zha87bk7hs14jx"; + fetchSubmodules = true; + }; + "src/third_party/gvr-android-sdk/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/googlevr/gvr-android-sdk.git"; + rev = "233e7fe922a543e0bc55382d64cacd047307d0e7"; + sha256 = "1f9aqraqdx58gsahy94hqfxq6nib0a5nq02rb5r6gzrz3pdfdlaz"; + fetchSubmodules = true; + }; + "src/third_party/hamcrest" = fetchcipd { + package = "chromium/third_party/hamcrest"; + version = "37eccfc658fe79695d6abb6dd497463c4372032f"; + sha256 = "1yil3234fpgm27hrmnnxxvlrq3jv70fqgi365gfhvgq2cwgbjci2"; + }; + "src/third_party/harfbuzz-ng/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git"; + rev = "0acf466c44143de2e9b9cc0375cb25ec67cb132f"; + sha256 = "0053gzc7xfg11b0jxsm4lbw2h3bhja4f843wsvws64kz1kvqpg2n"; + fetchSubmodules = true; + }; + "src/third_party/highway/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/highway.git"; + rev = "424360251cdcfc314cfc528f53c872ecd63af0f0"; + sha256 = "0w5y8qwnvqq78pgc11bg4a4ilraymv57b95pljf1cqxwd17wkp1y"; + fetchSubmodules = true; + }; + "src/third_party/hunspell_dictionaries" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries.git"; + rev = "18e09b9197a3b1d771c077c530d1a4ebad04c167"; + sha256 = "0b5n1gf7z52gbf0p5xd4m30kaflz0myd2964v0rziki1nbczzpzy"; + fetchSubmodules = true; + }; + "src/third_party/icu" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/icu.git"; + rev = "e94822cd43d01722869c19053303a18e893ecd00"; + sha256 = "1m8dwkb6g0hk9bm7xlqdnfjyly0gfn4q4p1isc8hh8adzarnkp90"; + fetchSubmodules = true; + }; + "src/third_party/icu4j" = fetchcipd { + package = "chromium/third_party/icu4j"; + version = "e87e5bed2b4935913ee26a3ebd0b723ee2344354"; + sha256 = "04af162d1clvy532dpd623mnfhz92jsc3wl0zval375dxdyqn86b"; + }; + "src/third_party/jacoco" = fetchcipd { + package = "chromium/third_party/jacoco"; + version = "O8mNUqIbFxvOcBsSNfbvpdUFvY4nfrPY0QA2kHoO2pQC"; + sha256 = "1ynphf6gihdisn20gvfs1agnarnd5n7717hgh5zkfif2k0v0yk0w"; + }; + "src/third_party/javalang/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/c2nes/javalang.git"; + rev = "0664afb7f4d40254312693f2e833c1ed4ac551c7"; + sha256 = "1j799654grk7klixiijhih9v67qcxhzh3hjzqhqhfpgfnd26q0l9"; + fetchSubmodules = true; + }; + "src/third_party/jdk" = fetchcipd { + package = "chromium/third_party/jdk"; + version = "JhpgSvTpgVUkoKe56yQmYaR1jXNcY8NqlltA0mKIO4EC"; + sha256 = "0ialfgppc1fyqar0i96fsjswp269lyvyvjnm9g97g3bl8q1i6w7c"; + }; + "src/third_party/jdk/extras" = fetchcipd { + package = "chromium/third_party/jdk/extras"; + version = "-7m_pvgICYN60yQI3qmTj_8iKjtnT4NXicT0G_jJPqsC"; + sha256 = "17ingjlj3f1kkhl9hglzi4qp4vfr2wxaa535yb7xdza2hsvw4l4y"; + }; + "src/third_party/jsoncpp/source" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git"; + rev = "9059f5cad030ba11d37818847443a53918c327b1"; + sha256 = "0qnx5y6c90fphl9mj9d20j2dfgy6s5yr5l0xnzid0vh71zrp6jwv"; + fetchSubmodules = true; + }; + "src/third_party/junit/src" = fetchgit { + url = "https://chromium.googlesource.com/external/junit.git"; + rev = "64155f8a9babcfcf4263cf4d08253a1556e75481"; + sha256 = "1j8avi91px1z8rjc89cfikwrvfifdmmsarwiyrcnr59ynvpz0v8h"; + fetchSubmodules = true; + }; + "src/third_party/leveldatabase/src" = fetchgit { + url = "https://chromium.googlesource.com/external/leveldb.git"; + rev = "1b51a3a96821e5fd5175288724c95c1bde57b2f0"; + sha256 = "0hwxsm29dn0nyz0x684c1hapz9mf5z3j2ha2420qmdqkr6nvyazy"; + fetchSubmodules = true; + }; + "src/third_party/libFuzzer/src" = fetchgit { + url = "https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git"; + rev = "debe7d2d1982e540fbd6bd78604bf001753f9e74"; + sha256 = "0akak4x2njl2wxagiwbp30vms53k45jgy2kmfqhvx7lh28gclv8w"; + fetchSubmodules = true; + }; + "src/third_party/libaddressinput/src" = fetchgit { + url = "https://chromium.googlesource.com/external/libaddressinput.git"; + rev = "3b8ee157a8f3536bbf5ad2448e9e3370463c1e40"; + sha256 = "05d2a78fm85wbgxl1vg9rzifsspm7l3ypqgzp3csr5kmas1k9w9w"; + fetchSubmodules = true; + }; + "src/third_party/libaom/source/libaom" = fetchgit { + url = "https://aomedia.googlesource.com/aom.git"; + rev = "a08d3f6c329a25744712578a70715e5cfd749759"; + sha256 = "1xhch215finbrvi55qazr0nm2vngsll4hpi9s245asq9zfrg9lnn"; + fetchSubmodules = true; + }; + "src/third_party/libavif/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/AOMediaCodec/libavif.git"; + rev = "7a6d13be831da40859c6b61fb513b7a7a654a58b"; + sha256 = "0g5zls6lp3p72d1c9xdrys0m454aisdnb7vcr500v3h5fqs6xj74"; + fetchSubmodules = true; + }; + "src/third_party/libdrm/src" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/third_party/libdrm.git"; + rev = "0190f49a139e7069d7cad6a6890832831da1aa8b"; + sha256 = "1xr641kl61y1b7p71wrrjd6wsv5vcn2ilir8vg6ixwyfg9v6caim"; + fetchSubmodules = true; + }; + "src/third_party/libgav1/src" = fetchgit { + url = "https://chromium.googlesource.com/codecs/libgav1.git"; + rev = "58d08dbd45a3ee707e76f32a9c04d770c3d22e38"; + sha256 = "1jm4mydfaqnsq9wwd309hkv8qml33fgj0x3073hl9rl9f2mq3rfv"; + fetchSubmodules = true; + }; + "src/third_party/libgifcodec" = fetchgit { + url = "https://skia.googlesource.com/libgifcodec"; + rev = "d06d2a6d42baf6c0c91cacc28df2542a911d05fe"; + sha256 = "08mw637m0w6n9nga1mg06l1i3shszidp95d16rvaind35kk5gvci"; + fetchSubmodules = true; + }; + "src/third_party/libipp/libipp" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/platform2/libipp.git"; + rev = "6c45a4f3a05cb5dd700414fe4d94cf685159d3ce"; + sha256 = "079yzvpjqmjkc135ywn4nmqiwvmw6i01cs6f46l2hbzrx65xfhhv"; + fetchSubmodules = true; + }; + "src/third_party/libjpeg_turbo" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git"; + rev = "02959c3ee17abacfd1339ec22ea93301292ffd56"; + sha256 = "02fbqbxmslirx8sc7icsrixn12wxwac4d9i9v5hn2py225b83r3j"; + fetchSubmodules = true; + }; + "src/third_party/libjxl/src" = fetchgit { + url = "https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git"; + rev = "a205468bc5d3a353fb15dae2398a101dff52f2d3"; + sha256 = "17pvc5zgm9az5hfg2p80325f42w3dqspyb03iakrwg9x4n3vjckx"; + fetchSubmodules = true; + }; + "src/third_party/liblouis/src" = fetchgit { + url = "https://chromium.googlesource.com/external/liblouis-github.git"; + rev = "10f66b2735b7d1e3e44d98f6dedbb859d197ea57"; + sha256 = "0p1hs8aqgkv7xk2a81bv5a34vsascw4fcii4gihmgknfyilzxq5y"; + fetchSubmodules = true; + }; + "src/third_party/libphonenumber/dist" = fetchgit { + url = "https://chromium.googlesource.com/external/libphonenumber.git"; + rev = "68eba9d6ee8b11fb58ece36b6c46d07965d7f7ff"; + sha256 = "0xzl2pjiykspr4y0xrk6vpq4vkazk46m9hpjv2qap4zp8j6lfs9y"; + fetchSubmodules = true; + }; + "src/third_party/libprotobuf-mutator/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/libprotobuf-mutator.git"; + rev = "8942a9ba43d8bb196230c321d46d6a137957a719"; + sha256 = "0wp2xj242vlj8w6vrvfn86l4jds5y4n9mpc8fjc1mzzgmpmjk1vw"; + fetchSubmodules = true; + }; + "src/third_party/libsrtp" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/libsrtp.git"; + rev = "5b7c744eb8310250ccc534f3f86a2015b3887a0a"; + sha256 = "0dsd1kspi3gc4pnlm6q2k43czpsvk0v2jhcwclsgi4s6ca3wbwm5"; + fetchSubmodules = true; + }; + "src/third_party/libsync/src" = fetchgit { + url = "https://chromium.googlesource.com/aosp/platform/system/core/libsync.git"; + rev = "f4f4387b6bf2387efbcfd1453af4892e8982faf6"; + sha256 = "0qfz971xlqhbzjihbhc50bqys0x1kwjcc6q65xc785zia85plj9j"; + fetchSubmodules = true; + }; + "src/third_party/libunwindstack" = fetchgit { + url = "https://chromium.googlesource.com/chromium/src/third_party/libunwindstack.git"; + rev = "6868358481bb1e5e20d155c1084dc436c88b5e6b"; + sha256 = "0v861x7hfllzrlgzvw2sd3l8na0y49jx9y0w5v8zcdig40bk55v0"; + fetchSubmodules = true; + }; + "src/third_party/libvpx/source/libvpx" = fetchgit { + url = "https://chromium.googlesource.com/webm/libvpx.git"; + rev = "df0d06de6d3b64e35b9e75ad72c571af061bc7b3"; + sha256 = "0sxz7azry3a6s3207vmpmp3fyfa5k6ppb5ps9980dwic88mxz7r9"; + fetchSubmodules = true; + }; + "src/third_party/libwebm/source" = fetchgit { + url = "https://chromium.googlesource.com/webm/libwebm.git"; + rev = "e4fbea0c9751ae8aa86629b197a28d8276a2b0da"; + sha256 = "0jkhwdgvvyqx5gsk5jyvg8x625i2ljyjqkhyhpfkrl4xjy86gzmv"; + fetchSubmodules = true; + }; + "src/third_party/libyuv" = fetchgit { + url = "https://chromium.googlesource.com/libyuv/libyuv.git"; + rev = "b4ddbaf549a1bf5572bf703fd2862d1eb7380c6a"; + sha256 = "010h371w1nvzsbz1anszf8q1mxjb2j8di5ak64mjiri5iz7s4ym3"; + fetchSubmodules = true; + }; + "src/third_party/lss" = fetchgit { + url = "https://chromium.googlesource.com/linux-syscall-support.git"; + rev = "92a65a8f5d705d1928874420c8d0d15bde8c89e5"; + sha256 = "0f8fwk5ggacdzb0qxnclj0vwd5xgi4bwlp8hwarfklfsmi19pvhc"; + fetchSubmodules = true; + }; + "src/third_party/minigbm/src" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/platform/minigbm.git"; + rev = "2e63aaf616cdda26019d265989bd0d96ee11aab9"; + sha256 = "0i6mirig0sjx5bwmazina8czfi8dxr02fj2palf13zpq1g50cbmp"; + fetchSubmodules = true; + }; + "src/third_party/minizip/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/nmoinvaz/minizip"; + rev = "1ff40343b55e738d941abb51c70eddb803db16e2"; + sha256 = "1z27h19qmslzvzn9d0cdb8p11yaqph6ryija1vd6drjnk6h4crvh"; + fetchSubmodules = true; + }; + "src/third_party/mockito/src" = fetchgit { + url = "https://chromium.googlesource.com/external/mockito/mockito.git"; + rev = "04a2a289a4222f80ad20717c25144981210d2eac"; + sha256 = "10g549zf4yygni0lkpqjzpwwb8z42h2dpfa4c2zagjk9bzi54gia"; + fetchSubmodules = true; + }; + "src/third_party/nasm" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/nasm.git"; + rev = "9215e8e1d0fe474ffd3e16c1a07a0f97089e6224"; + sha256 = "0132nfd3d4l3z8245iff8qnralhm2inbljrc605910jg5jvd9d6s"; + fetchSubmodules = true; + }; + "src/third_party/nearby/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/nearby-connections.git"; + rev = "ae0337db3bac9b104a2b585be7312615bcc66262"; + sha256 = "09kyrpwrpl90c88xyid7j7k1fgrdmiwka0wk541vr6d14rfb7afm"; + fetchSubmodules = true; + }; + "src/third_party/neon_2_sse/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/intel/ARM_NEON_2_x86_SSE.git"; + rev = "8dbe2461c89760ac4b204aa0eafb72413a97957d"; + sha256 = "09bfcbkjsgn3r9ann8ayf65xqgycy3g5mrj9fnn70sfj10cmahvm"; + fetchSubmodules = true; + }; + "src/third_party/netty-tcnative/src" = fetchgit { + url = "https://chromium.googlesource.com/external/netty-tcnative.git"; + rev = "7eeb50be90c9ba0f6afa3375132df63942a0f32d"; + sha256 = "19qh20pc61l379l25a768ym7r92s9qk52f2z77zf0j5bcharf6sq"; + fetchSubmodules = true; + }; + "src/third_party/netty4/src" = fetchgit { + url = "https://chromium.googlesource.com/external/netty4.git"; + rev = "cc4420b13bb4eeea5b1cf4f93b2755644cd3b120"; + sha256 = "167d3474ax7kzplnkkfl4pxsz90diw5fwg3ks5xwnqplvj6ipl6x"; + fetchSubmodules = true; + }; + "src/third_party/objenesis" = fetchcipd { + package = "chromium/third_party/objenesis"; + version = "tknDblENYi8IaJYyD6tUahUyHYZlzJ_Y74_QZSz4DpIC"; + sha256 = "0qrkagpvybz1zz9w7ik05y7p48kd822228w7fn1xvnxgl1d8fjy5"; + }; + "src/third_party/openh264/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/cisco/openh264"; + rev = "b52786888ddce9d6bc06b7825ba9bffc65924e0c"; + sha256 = "046b6fhsr65s3qnhmkik48cb56c6s1arwgp4980dlc280f529vv4"; + fetchSubmodules = true; + }; + "src/third_party/openscreen/src" = fetchgit { + url = "https://chromium.googlesource.com/openscreen"; + rev = "0f4d256a3e5588144a81a848cdd5cf314dc52868"; + sha256 = "19g977cfmjs457i9fpq69csxdqh0gxrd63y9ld7417b9zciwzqw7"; + fetchSubmodules = true; + }; + "src/third_party/openscreen/src/third_party/tinycbor/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/intel/tinycbor.git"; + rev = "fc42a049853b802e45f49588f8148fc29d7b4d9c"; + sha256 = "1iaq7l11bfs3qlwbf4l19lvpycf5zrrkbz3s1jlh10fs0v26wz1m"; + fetchSubmodules = true; + }; + "src/third_party/ots/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/khaledhosny/ots.git"; + rev = "ee537ac096667eed6559124164c3e8482646fd77"; + sha256 = "0yg7g2ial5yb1i6d7jj9v77z81383qiwsdy1dd0bzrfncbfyp65s"; + fetchSubmodules = true; + }; + "src/third_party/pdfium" = fetchgit { + url = "https://pdfium.googlesource.com/pdfium.git"; + rev = "2fcb5025f65abf3f9446b3935ac3186a59a7dc90"; + sha256 = "1bbwjnzajzynms7kxy37gn2qhkyyc6wf7s9f8qbkl0n2cz7miqx6"; + fetchSubmodules = true; + }; + "src/third_party/perfetto" = fetchgit { + url = "https://android.googlesource.com/platform/external/perfetto.git"; + rev = "dfc6cffca9b6a34068386915d50040c6bc142717"; + sha256 = "0cpmhvwx6wb9g36bs6yfryckin6khfs3s5hpkj82v3y2fpgh6shk"; + fetchSubmodules = true; + }; + "src/third_party/proguard" = fetchcipd { + package = "chromium/third_party/proguard"; + version = "Fd91BJFVlmiO6c46YMTsdy7n2f5Sk2hVVGlzPLvqZPsC"; + sha256 = "07swiphqrkaz4j0mfmfyzabfwwm1rny3fcc1hdrqyaz15ai84svl"; + }; + "src/third_party/pyelftools" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/third_party/pyelftools.git"; + rev = "19b3e610c86fcadb837d252c794cb5e8008826ae"; + sha256 = "07hl6dpa35xixfdh55d20a2b1x9yghfr6f7bj7hgyz1gh7ffkzi3"; + fetchSubmodules = true; + }; + "src/third_party/pywebsocket3/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/pywebsocket3.git"; + rev = "50602a14f1b6da17e0b619833a13addc6ea78bc2"; + sha256 = "1145dll9wvshjlaki3bs4r2v0mzwzg023gzxgyfblz7vdyxsljjq"; + fetchSubmodules = true; + }; + "src/third_party/quic_trace/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/quic-trace.git"; + rev = "413c3a4a641c014193eabb8d282c2348ccec3c5b"; + sha256 = "1sii5a599q22xqbqsb77rv2xyrfixz76p99xi7is7ysk4iid1r7x"; + fetchSubmodules = true; + }; + "src/third_party/r8" = fetchcipd { + package = "chromium/third_party/r8"; + version = "cEv1yyfxfmP_MaZrG22cR7YPc7hehgHAZd82lRx0DFAC"; + sha256 = "1a9jbc5nmq7db66f67zlvx5gd54fcjhfsm0yhysp3ll2cslfj64y"; + }; + "src/third_party/re2/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/re2.git"; + rev = "885eb38accf49e2ccdd2fa6786f3590cf40a3e23"; + sha256 = "1gzdqy5a0ln9rwd8kmwbgis6qin63hapicwb35xkbnj3y84jj6yx"; + fetchSubmodules = true; + }; + "src/third_party/requests/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/kennethreitz/requests.git"; + rev = "c7e0fc087ceeadb8b4c84a0953a422c474093d6d"; + sha256 = "18dds0ifjhjy5x8mra2fspvc1b7xvzr4dk798igbvkwg9vkdzn1i"; + fetchSubmodules = true; + }; + "src/third_party/robolectric" = fetchcipd { + package = "chromium/third_party/robolectric"; + version = "Kdd6dNFAKqj9g9Bsfo2z1zQr52Vk60EL_wb9Bf2c8rcC"; + sha256 = "0502qqysagn02ig0cajizhzklmvrx91bc8i22hmf6jfi28sxcl4z"; + }; + "src/third_party/rust/serde_jsonrc/v0_1/crate" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/serde-rs/json"; + rev = "ca5782632fc8dc3f9cf2f22055b87f910cad761f"; + sha256 = "115f7v26jn7njja5x80a801i75xpx1374zkrc8r84j65ig9yk4sb"; + fetchSubmodules = true; + }; + "src/third_party/ruy/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/ruy.git"; + rev = "2d950b3bfa7ebfbe7a97ecb44b1cc4da5ac1d6f0"; + sha256 = "071jngh15qyy0lmjhp4spih11m3p6n2piqjhsfanw1s218yrg25q"; + fetchSubmodules = true; + }; + "src/third_party/securemessage/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/securemessage.git"; + rev = "fa07beb12babc3b25e0c5b1f38c16aa8cb6b8f84"; + sha256 = "0d1rq8mg4bj5kh9jg7lgfv3kqpnn8kdvm5rckgd8jmqihl2hcs8c"; + fetchSubmodules = true; + }; + "src/third_party/shaderc/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/shaderc.git"; + rev = "96b1dd72a827304817470274a470c4d3b2293451"; + sha256 = "1ax5wy04g9ca8c4533zdvjd9zrp5mzx0471s0rx71ipkq02pxi4c"; + fetchSubmodules = true; + }; + "src/third_party/skia" = fetchgit { + url = "https://skia.googlesource.com/skia.git"; + rev = "b524f580859d367e51591d8b5c16485d022844cb"; + sha256 = "09j8jvl0j34iacb0p7a0z5frgn2zcfwk1fh26g79ll73d3h2dlbi"; + fetchSubmodules = true; + }; + "src/third_party/smhasher/src" = fetchgit { + url = "https://chromium.googlesource.com/external/smhasher.git"; + rev = "e87738e57558e0ec472b2fc3a643b838e5b6e88f"; + sha256 = "0b4yxi80kixp0dr51q3a80ia2nv70spp1mhsbl31rwmlczzby827"; + fetchSubmodules = true; + }; + "src/third_party/snappy/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/snappy.git"; + rev = "65dc7b383985eb4f63cd3e752136db8d9b4be8c0"; + sha256 = "0jvl9m9f7syl8jscf9mkfmj0d5zsq150mzrnscvw9q6685rfnhm1"; + fetchSubmodules = true; + }; + "src/third_party/sqlite/src" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/sqlite.git"; + rev = "9ccd3058ec6dcfa5b0ebd2edb3e88c9b97813025"; + sha256 = "12swdcjvacds81hfixpvkbg99lz2rvdyfw7v2gdcyfy1y2b3yna4"; + fetchSubmodules = true; + }; + "src/third_party/sqlite4java" = fetchcipd { + package = "chromium/third_party/sqlite4java"; + version = "LofjKH9dgXIAJhRYCPQlMFywSwxYimrfDeBmaHc-Z5EC"; + sha256 = "1bckirpb79bknwnksjsybwcm7dc3ngmb5xslfglndjxrjfsw96k1"; + }; + "src/third_party/swiftshader" = fetchgit { + url = "https://swiftshader.googlesource.com/SwiftShader.git"; + rev = "043a8084c1cb680b30a46e8a316042f6bb9028ec"; + sha256 = "1mg3qwvwlac6p5ja6435l92w61clrja8zghhc8snzlj577j5svly"; + fetchSubmodules = false; + }; + "src/third_party/tflite/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/tensorflow/tensorflow.git"; + rev = "767b2cf99f1ebe27f9e61b672a48ddbb2142bfed"; + sha256 = "1lk2fr1a4ld6bcnrx9j50b8aw7iazvcgmpahmw34v3nndap2c2v6"; + fetchSubmodules = true; + }; + "src/third_party/turbine" = fetchcipd { + package = "chromium/third_party/turbine"; + version = "VhmfIPuSDHHeilnA7WC0MhR9ShZNF25tA0Te4RYIZG8C"; + sha256 = "104jhsyjgkrx6z20wz3invdcpbryr9fqxigwi3dbqafxg9v51pg8"; + }; + "src/third_party/ub-uiautomator/lib" = fetchgit { + url = "https://chromium.googlesource.com/chromium/third_party/ub-uiautomator.git"; + rev = "00270549ce3161ae72ceb24712618ea28b4f9434"; + sha256 = "08axh1pbssh3l4hgw5sllp96jaxrx8hbv9n69q695irdbrpbnr6b"; + fetchSubmodules = true; + }; + "src/third_party/ukey2/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/ukey2.git"; + rev = "0275885d8e6038c39b8a8ca55e75d1d4d1727f47"; + sha256 = "01z3ab54khwmbg52pcfvqlclsdd00pzi8mcalq5px1lnhcz6vp4d"; + fetchSubmodules = true; + }; + "src/third_party/usrsctp/usrsctplib" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/sctplab/usrsctp"; + rev = "62d7d0c928c9a040dce96aa2f16c00e7e67d59cb"; + sha256 = "0sy1ifbm56s0c31pw30fpcfngkr4dv11yysmwhzwax914d9kh4yn"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps" = fetchgit { + url = "https://chromium.googlesource.com/vulkan-deps"; + rev = "5fe1b21d6ba47a8dee59068d6927a4c157ec13a3"; + sha256 = "07hsqz35jpd5wpjis5w6n51ahlnp5isj7lmbj566azxk8dm8rb6j"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/glslang/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang"; + rev = "90d4bd05cd77ef5782a6779a0fe3d084440dc80d"; + sha256 = "153msf42wmj9y4vmnh6wkgh0is227vscq0n8c0bbgq7zv8cggbkk"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/spirv-cross/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross"; + rev = "64e058aa9b0c7a0d1cbc645b4496ddf4cdbca00d"; + sha256 = "0xfw6icp9a505kswh2wqdlmjqp2jr3scjwkqnj1wmkbgxzfnc3ib"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/spirv-headers/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers"; + rev = "6a55fade62dec6a406a5a721148f88a2211cbefa"; + sha256 = "06jwrp8ncs7j0mqv95bm7gk5f674ycd0axx9632zciha592yq9m6"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/spirv-tools/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools"; + rev = "d18d0d92e55f44da6af0dc87fb0e3c8034e9a3ac"; + sha256 = "1f8vc53858fidd60ka9c3jqnkqn6zd1si6bdkx7gvp36d0p6sar4"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/vulkan-headers/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers"; + rev = "b32da5329b50e3cb96229aaecba9ded032fe29cc"; + sha256 = "0n7ffbwwdrpbzgijsmw56qz0jpl9ib8xib8bqmbkfqpn1zk5zsvs"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/vulkan-loader/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader"; + rev = "edb793cf31480ae71f7462e8ae2bf13188143682"; + sha256 = "14mghmqikbigjwd08myry8f8hxawiphq7010pp3dcbs1pi5pr1aj"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/vulkan-tools/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools"; + rev = "5f9e5f14e572a6c9f7ff4d54e2fd4d82632bc393"; + sha256 = "0b4i4amnbsfwz2ir8jsy89nhszcka4w9ycjnnlycwqdz9lqiihmw"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/vulkan-validation-layers/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers"; + rev = "0b8873487d46fbcc7cafa917824a867151160933"; + sha256 = "1b67xhd94wbfwsa9f4g8xxi2mkn3r0w1gjh66mzdb318vj7ai16c"; + fetchSubmodules = true; + }; + "src/third_party/vulkan_memory_allocator" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git"; + rev = "ebe84bec02c041d28f902da0214bf442743fc907"; + sha256 = "1hclk1jm0d3sgfqbha4lzwk39dfi3dx1cgyg9h74105zfqy6w15c"; + fetchSubmodules = true; + }; + "src/third_party/wayland-protocols/gtk" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/GNOME/gtk.git"; + rev = "40ebed3a03aef096addc0af09fec4ec529d882a0"; + sha256 = "091ffkv5m46zgjklr4mpnsc3ykfnzbj4yin45isvpr05p6fcv5gg"; + fetchSubmodules = true; + }; + "src/third_party/wayland-protocols/kde" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KDE/plasma-wayland-protocols.git"; + rev = "0b07950714b3a36c9b9f71fc025fc7783e82926e"; + sha256 = "0rip7fvx3xg5s975dcw47pvwrmv0fi53xrpkqk6lxzmcd7zjjrqf"; + fetchSubmodules = true; + }; + "src/third_party/wayland-protocols/src" = fetchgit { + url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git"; + rev = "177ff9119da526462e5d35fbfde6c84794913787"; + sha256 = "1n3skg63lqpx35rarwdklcjyh5pd3fbjwk68lw30i9v554fk9xsn"; + fetchSubmodules = true; + }; + "src/third_party/wayland/src" = fetchgit { + url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland.git"; + rev = "e60398b1755bfcdf09f040d3769131fe0d9762fc"; + sha256 = "014zl3kp3gy2s8nmfp8vqy02fgpgqvajg8c9gxk6g4z460c8rbkj"; + fetchSubmodules = true; + }; + "src/third_party/webdriver/pylib" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/SeleniumHQ/selenium/py.git"; + rev = "d0045ec570c1a77612db35d1e92f05e1d27b4d53"; + sha256 = "0grjcv25ajbf8zbhp8s1qajba980aspz52pzicfnk4csmpamcwkw"; + fetchSubmodules = true; + }; + "src/third_party/webgl/src" = fetchgit { + url = "https://chromium.googlesource.com/external/khronosgroup/webgl.git"; + rev = "cf04aebdf9b53bb2853f22a81465688daf879ec6"; + sha256 = "043hy7sg6g0pdln83rr5phq7gqjb3586b3jcbqam2xpm5p102zmh"; + fetchSubmodules = true; + }; + "src/third_party/webgpu-cts/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/gpuweb/cts.git"; + rev = "bcac299eb80e8314ba22b8f012a31138b0686324"; + sha256 = "1q7jwg1n6iyk2n0ff9v93rgjm7rvr6hysw45lx9kjayr41s28c66"; + fetchSubmodules = true; + }; + "src/third_party/webpagereplay" = fetchcipd { + package = "infra/tools/wpr/linux_x86_64"; + version = "y28SfbEF6nHSkZ1eHysM1t711zpOCmtk7jUdxZB-QSMC"; + sha256 = "00i5c4wiwvap5faphfb672l86kdynn191qk1vhmv853rf0lka5c3"; + }; + "src/third_party/webrtc" = fetchgit { + url = "https://webrtc.googlesource.com/src.git"; + rev = "ffd9187dc0d9211ad52173bf0daa5001ca7d45ee"; + sha256 = "18naav5a294mb56dd8xzz1ms98jid0gqza6swbgbc56575a2cib5"; + fetchSubmodules = true; + }; + "src/third_party/weston/src" = fetchgit { + url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/weston.git"; + rev = "420cfd00f2de91de74bd9d4d8348e43c582d29f0"; + sha256 = "0ib9c6dlnmbj3gngllsvi0kax2ql678nz26lq9ynjmiwhfh7ma8h"; + fetchSubmodules = true; + }; + "src/third_party/wuffs/src" = fetchgit { + url = "https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git"; + rev = "ebbecaa2fb439eff0aeedafadb4c2a984446dee8"; + sha256 = "184878r794iz30cib90bg95b3pa31sm9mqnm3mpilkfhmync54mc"; + fetchSubmodules = true; + }; + "src/third_party/xdg-utils" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/xdg-utils.git"; + rev = "d80274d5869b17b8c9067a1022e4416ee7ed5e0d"; + sha256 = "0i72hw0lb4xjg1xh0bax6s5x5hjc3n0lmwzck4q04h94k7s9ayxp"; + fetchSubmodules = true; + }; + "src/tools/page_cycler/acid3" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/acid3.git"; + rev = "6be0a66a1ebd7ebc5abc1b2f405a945f6d871521"; + sha256 = "0dmkrbhb4kb7vk33i3zc0kv9ihbkxwy4cfvaw5fnfx9zp77jgdpv"; + fetchSubmodules = true; + }; + "src/tools/resultdb" = fetchcipd { + package = "infra/tools/result_adapter/${platform}"; + version = "git_revision:735a8a662d3874d8b1d795a40e46ea0f57b52758"; + sha256 = "1vbdwhn2wq8did768g3nijvrry6i6y2y1r00ww94n4phbydyk055"; + }; + "src/tools/skia_goldctl/linux" = fetchcipd { + package = "skia/tools/goldctl/linux-amd64"; + version = "njGzzVyYPSA__3tShsGxsvh8k5kJfL9V0wvLthXSUV4C"; + sha256 = "00b32xyxlcqa8hpa66djjlsql4jc3npcirh10n4wbgzd0wm07wl8"; + }; + "src/v8" = fetchgit { + url = "https://chromium.googlesource.com/v8/v8.git"; + rev = "b2490f598d9debd563bc32191cb3f777a16cbbb0"; + sha256 = "0j7i9p4fijb6r5ma4g55hv7qa3wld3yxwaldpj284xvan7jdj3p0"; + fetchSubmodules = true; + }; -"src/third_party/node/node_modules" = runCommand "download_from_google_storage-chromium-nodejs" {} '' - mkdir $out - tar xf ${fetchurl { - url = "https://commondatastorage.googleapis.com/chromium-nodejs/aad6877c8cd3cff0ef1ba628d71acc981c520c29"; - sha1 = "aad6877c8cd3cff0ef1ba628d71acc981c520c29"; - }} --strip-components=1 -C $out -''; + "src/third_party/node/node_modules" = + runCommand "download_from_google_storage-chromium-nodejs" { } + '' + mkdir $out + tar xf ${ + fetchurl { + url = "https://commondatastorage.googleapis.com/chromium-nodejs/aad6877c8cd3cff0ef1ba628d71acc981c520c29"; + sha1 = "aad6877c8cd3cff0ef1ba628d71acc981c520c29"; + } + } --strip-components=1 -C $out + ''; -"src/third_party/test_fonts/test_fonts" = runCommand "download_from_google_storage-chromium-fonts" {} '' - mkdir $out - tar xf ${fetchurl { - url = "https://commondatastorage.googleapis.com/chromium-fonts/cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb"; - sha1 = "cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb"; - }} --strip-components=1 -C $out -''; + "src/third_party/test_fonts/test_fonts" = + runCommand "download_from_google_storage-chromium-fonts" { } + '' + mkdir $out + tar xf ${ + fetchurl { + url = "https://commondatastorage.googleapis.com/chromium-fonts/cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb"; + sha1 = "cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb"; + } + } --strip-components=1 -C $out + ''; -"src/third_party/subresource-filter-ruleset/data/UnindexedRules" = fetchurl { - url = "https://commondatastorage.googleapis.com/chromium-ads-detection/a703507a694340bac1a78ce6e54dfbd641062da5"; - sha1 = "a703507a694340bac1a78ce6e54dfbd641062da5"; - }; + "src/third_party/subresource-filter-ruleset/data/UnindexedRules" = fetchurl { + url = "https://commondatastorage.googleapis.com/chromium-ads-detection/a703507a694340bac1a78ce6e54dfbd641062da5"; + sha1 = "a703507a694340bac1a78ce6e54dfbd641062da5"; + }; -"src/chrome/android/profiles/afdo.prof" = runCommand "download_afdo_profile" {} '' - bzip2 -d -c ${fetchurl { - url = "https://storage.googleapis.com/chromeos-prebuilt/afdo-job/llvm/chromeos-chrome-amd64-100.0.4896.62_rc-r1-merged.afdo.bz2"; - sha256 = "0i93na0w0p0ynnfg2ylq8ha4l3i2cfi0r57zzkj679hvszh4l70m"; - }} > $out -''; + "src/chrome/android/profiles/afdo.prof" = runCommand "download_afdo_profile" { } '' + bzip2 -d -c ${ + fetchurl { + url = "https://storage.googleapis.com/chromeos-prebuilt/afdo-job/llvm/chromeos-chrome-amd64-100.0.4896.62_rc-r1-merged.afdo.bz2"; + sha256 = "0i93na0w0p0ynnfg2ylq8ha4l3i2cfi0r57zzkj679hvszh4l70m"; + } + } > $out + ''; -"src/third_party/llvm-build/Release+Asserts" = runCommand "download_upstream_clang" {} '' + "src/third_party/llvm-build/Release+Asserts" = runCommand "download_upstream_clang" { } '' mkdir $out - tar xf ${fetchurl { - url = "https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-15-init-1995-g5bec1ea7-1.tgz"; - sha256 = "0pxx8jr958xi5szxl5hc7yq6gmppg1paw25v4myfnqb62gjzik62"; - }} -C $out -''; + tar xf ${ + fetchurl { + url = "https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-15-init-1995-g5bec1ea7-1.tgz"; + sha256 = "0pxx8jr958xi5szxl5hc7yq6gmppg1paw25v4myfnqb62gjzik62"; + } + } -C $out + ''; } diff --git a/apks/chromium/vendor-100.0.4896.135.nix b/apks/chromium/vendor-100.0.4896.135.nix index 29b25f2e..7d2b1033 100644 --- a/apks/chromium/vendor-100.0.4896.135.nix +++ b/apks/chromium/vendor-100.0.4896.135.nix @@ -1,393 +1,1952 @@ # GENERATED BY 'mk-vendor-file.py 100.0.4896.135' for unix, android -{fetchgit, fetchcipd, fetchurl, runCommand, symlinkJoin, platform}: { - "src" = fetchgit { url = "https://chromium.googlesource.com/chromium/src.git" ; rev = "1a90e060fd3231f69f387dd2ac33b4e3eeb0e3e3"; sha256 = "11nc6d2y29hpmxb619847n6kh4gciw6jl96d929j3jfcnnbvq9v1"; fetchSubmodules = true; }; - "src/android_webview/tools/cts_archive" = fetchcipd { package = "chromium/android_webview/tools/cts_archive"; version = "ai8Ig4HlO0vG6aP_JP2uhyruE2yPzze8PFP1g8Z4_hgC"; sha256 = "0lxgxd75lqsk7jpgx5gmkskmkz22mvmzrh82l3dh0z53b0ibb14v"; }; - "src/buildtools/clang_format/script" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git" ; rev = "e435ad79c17b1888b34df88d6a30a094936e3836"; sha256 = "0ifdbxg283v2zz5s6iy9b2iyynrzbzbsifpc5m90dq48743vb963"; fetchSubmodules = true; }; - "src/buildtools/linux64" = fetchcipd { package = "gn/gn/linux-amd64"; version = "git_revision:0725d7827575b239594fbc8fd5192873a1d62f44"; sha256 = "1y8csayrd9653fwyzw07l29i1dmb5jvwzrygks3ayh1d1yqbq36p"; }; - "src/buildtools/third_party/libc++/trunk" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git" ; rev = "79a2e924d96e2fc1e4b937c42efd08898fa472d7"; sha256 = "1k00bcyh3061k0cy0z7b03kiimfjxksmnyfk6vxhfl4kqhn3wx4z"; fetchSubmodules = true; }; - "src/buildtools/third_party/libc++abi/trunk" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git" ; rev = "738dc100c61890744f9e78cac27c71d0a2190781"; sha256 = "0k8nnjr3n7h0vzjzc02y2jhlamak49brliq8nzxcdl8z2dmj7kxh"; fetchSubmodules = true; }; - "src/buildtools/third_party/libunwind/trunk" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git" ; rev = "75396220433652a698b05c5fb648fe1f5e1d7a27"; sha256 = "04cqsbypd66n3jhnq2kmdvhkz46vr8fv8lsyf5g7ygkqjkd98x9a"; fetchSubmodules = true; }; - "src/chrome/test/data/perf/canvas_bench" = fetchgit { url = "https://chromium.googlesource.com/chromium/canvas_bench.git" ; rev = "a7b40ea5ae0239517d78845a5fc9b12976bfc732"; sha256 = "0cs215p1353dfp0s8x33jhz7ih0fh9ajwwax6d5q15la274axwxj"; fetchSubmodules = true; }; - "src/chrome/test/data/perf/frame_rate/content" = fetchgit { url = "https://chromium.googlesource.com/chromium/frame_rate/content.git" ; rev = "c10272c88463efeef6bb19c9ec07c42bc8fe22b9"; sha256 = "0yi9xc0qihr1pw9fllsy9x9p19211p534qn7j70l7bply6x1r2dp"; fetchSubmodules = true; }; - "src/chrome/test/data/xr/webvr_info" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/toji/webvr.info.git" ; rev = "c58ae99b9ff9e2aa4c524633519570bf33536248"; sha256 = "1s7131k4m20cpmsb0jhmz1sqmnhld8n8fsirs7i6l498rv0hzh06"; fetchSubmodules = true; }; - "src/docs/website" = fetchgit { url = "https://chromium.googlesource.com/website.git" ; rev = "66779576a0d84e821a11e288acc94859fdcbe0bd"; sha256 = "106qw68w6ndwj1hl4zf7rzffnqx826cqg3l281vcd054pvb90xpd"; fetchSubmodules = true; }; - "src/media/cdm/api" = fetchgit { url = "https://chromium.googlesource.com/chromium/cdm.git" ; rev = "fc5afac6847dc61addc1177103aa602e71a9ecac"; sha256 = "0yai4nk0p4qkbn61sjs2g6yapraqbzy0amkw1wrdqb7rajhn0aqi"; fetchSubmodules = true; }; - "src/native_client" = fetchgit { url = "https://chromium.googlesource.com/native_client/src/native_client.git" ; rev = "7adc7525b68ffb888135f9541bde1b1f62ca5b70"; sha256 = "0sanjp8yh1ffnd4kcj4b3l9jxigjg7c712aa9061f17skxi6bm5b"; fetchSubmodules = true; }; - "src/net/third_party/quiche/src" = fetchgit { url = "https://quiche.googlesource.com/quiche.git" ; rev = "a778d65990c3be7b6eafac08d14c345d1090eec2"; sha256 = "0man8pykmb65vln41z6s0wfvn2bw5pr55il3lpr0v5p21dpgj6zr"; fetchSubmodules = true; }; - "src/third_party/accessibility_test_framework" = fetchcipd { package = "chromium/third_party/accessibility-test-framework"; version = "b5ec1e56e58e56bc1a0c77d43111c37f9b512c8a"; sha256 = "0q4bb1nylbaals9b9qrd5c0f62nlyr2np0g6i8fbvawwrbr7qxrm"; }; - "src/third_party/android_build_tools/aapt2" = fetchcipd { package = "chromium/third_party/android_build_tools/aapt2"; version = "yQIf5Ev_-q9u6Pr_a0APd1dHcImJSmotVADw4Pj151QC"; sha256 = "1i7c9yiwlgrqg6ca85k1m39dcakvqr5fqlh2vs8x11rx70bzykka"; }; - "src/third_party/android_build_tools/art" = fetchcipd { package = "chromium/third_party/android_build_tools/art"; version = "87169fbc701d244c311e6aa8843591a7f1710bc0"; sha256 = "0p6yn4rzavyd16krq29wnbw97fmak4qd47zmk7d3wq0jbzjqj18m"; }; - "src/third_party/android_build_tools/bundletool" = fetchcipd { package = "chromium/third_party/android_build_tools/bundletool"; version = "2ZcLVDxyRwp8FzpeYLtLT0TfSRweZxvwh1-Kx1jZ_FoC"; sha256 = "0b39ygw9qk4bv7q20j378q1xmx0xdcgqsd6xfvc1vka6avwlb5nr"; }; - "src/third_party/android_deps/libs/android_arch_core_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_core_common"; version = "version:2@1.1.1.cr0"; sha256 = "183y5pijhr2dypkm1dfy5yc88p477razlq73kzd72c0gz5z6kwpy"; }; - "src/third_party/android_deps/libs/android_arch_core_runtime" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_core_runtime"; version = "version:2@1.1.1.cr0"; sha256 = "0g0akycdbr9chy0gswpklwzw8m6cpb7242vnnvpzqfhjdcjg5fba"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_common"; version = "version:2@1.1.1.cr0"; sha256 = "0x3mdil15ld7rlm0n0x53fsz81dc7vx1pccwz7klb4zdl9w3mxbr"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_common_java8" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_common_java8"; version = "version:2@1.1.1.cr0"; sha256 = "0b464w5argc8sajrwqnzizhh0chi9vl1vbnrc76rxifjg2ym6fgh"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_livedata" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata"; version = "version:2@1.1.1.cr0"; sha256 = "18bf42hfbdjhi7f0lx8zvsn3372m69j5xdjrwgas26a32dg7n5yj"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_livedata_core" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata_core"; version = "version:2@1.1.1.cr0"; sha256 = "1wws684w3qwyhp715ia78pvk16w3jaj40a3vvbndnzfcglyrg2a8"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_runtime" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_runtime"; version = "version:2@1.1.1.cr0"; sha256 = "1d4kr0js2xxcy0bgjwnz0sacwrq9b2knmdkysh0130vp0fv9i44v"; }; - "src/third_party/android_deps/libs/android_arch_lifecycle_viewmodel" = fetchcipd { package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_viewmodel"; version = "version:2@1.1.1.cr0"; sha256 = "1fs0w8nk9rnjv7rvc70111sqdvp9579c63phv61j978wkfq349cy"; }; - "src/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent" = fetchcipd { package = "chromium/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent"; version = "version:2@3.1.cr0"; sha256 = "1k4z2zgc07bk0pnckbc7m5xph71vn4zkrl95jnzw8xwk46qbli7n"; }; - "src/third_party/android_deps/libs/classworlds_classworlds" = fetchcipd { package = "chromium/third_party/android_deps/libs/classworlds_classworlds"; version = "version:2@1.1-alpha-2.cr0"; sha256 = "1y5p5m7wykp1rc6dz700jqjbqkwzrv4zjdapfnja9cxmgwdwvlgr"; }; - "src/third_party/android_deps/libs/com_android_support_animated_vector_drawable" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_animated_vector_drawable"; version = "version:2@28.0.0.cr0"; sha256 = "1xmq1l0ms4i3f1lsrman1ans7z2cfjaw5bxd02g9jzq7ar0g07k6"; }; - "src/third_party/android_deps/libs/com_android_support_appcompat_v7" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_appcompat_v7"; version = "version:2@28.0.0.cr0"; sha256 = "1xka020529x68sx2jmfl5vmrdr8k1k97dk4k6p2nkf80gsd9kswi"; }; - "src/third_party/android_deps/libs/com_android_support_asynclayoutinflater" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_asynclayoutinflater"; version = "version:2@28.0.0.cr0"; sha256 = "1dk1gwvph89mbgaj1hmfiqyndgjhgb9vqsaqz48lqvq8a8mj9whd"; }; - "src/third_party/android_deps/libs/com_android_support_cardview_v7" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_cardview_v7"; version = "version:2@28.0.0.cr0"; sha256 = "0xynb0mssa0zyiy34lxjsvymg5zrfxqg5rfv254ibm531ar0s7c9"; }; - "src/third_party/android_deps/libs/com_android_support_collections" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_collections"; version = "version:2@28.0.0.cr0"; sha256 = "0gy8gnin8hljn4shmxfj6k4ahmwpx5m9lsz2630m63zqiplvhmls"; }; - "src/third_party/android_deps/libs/com_android_support_coordinatorlayout" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_coordinatorlayout"; version = "version:2@28.0.0.cr0"; sha256 = "047fi1kh08gkkcv1kcqizjq7qn9xcc5rgs6l33ypckrm9xlpf6w7"; }; - "src/third_party/android_deps/libs/com_android_support_cursoradapter" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_cursoradapter"; version = "version:2@28.0.0.cr0"; sha256 = "06z3ba5bqcqv1379aj16pvqcs09pff2ss8sjwah3w6yp0bw46i1i"; }; - "src/third_party/android_deps/libs/com_android_support_customview" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_customview"; version = "version:2@28.0.0.cr0"; sha256 = "1vhd792m113r7s13jly2fc2l72h6lqs99fjynlvh7ppfsl3ha16n"; }; - "src/third_party/android_deps/libs/com_android_support_design" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_design"; version = "version:2@28.0.0.cr0"; sha256 = "0q6ygv1h3lbmz20b989w2p0sf0bh69537xwkmin1xbw7bm357wk4"; }; - "src/third_party/android_deps/libs/com_android_support_documentfile" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_documentfile"; version = "version:2@28.0.0.cr0"; sha256 = "0s6wnbdsfxabgy7j2d3yh0nkz7zkjn22ngswmq3jgd7ymlpvldbn"; }; - "src/third_party/android_deps/libs/com_android_support_drawerlayout" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_drawerlayout"; version = "version:2@28.0.0.cr0"; sha256 = "1gymfjq1dnrj6yp77pvm7hpqfwq2v5l2z92jvdsrkp3dj3c04q2l"; }; - "src/third_party/android_deps/libs/com_android_support_interpolator" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_interpolator"; version = "version:2@28.0.0.cr0"; sha256 = "0j73f8dwxip1ad312x66d5iw39dc45gzbm0p56qd113dv6nq7jpf"; }; - "src/third_party/android_deps/libs/com_android_support_loader" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_loader"; version = "version:2@28.0.0.cr0"; sha256 = "1mwj2q0xppama4sw8j41krqnbs6qqjbas6gdr89r3laxvhfhfj1j"; }; - "src/third_party/android_deps/libs/com_android_support_localbroadcastmanager" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_localbroadcastmanager"; version = "version:2@28.0.0.cr0"; sha256 = "06895mn7r86z02xjfz2vxw1114zhsby4jbc8m20g7n5irpzvcscv"; }; - "src/third_party/android_deps/libs/com_android_support_multidex" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_multidex"; version = "version:2@1.0.0.cr0"; sha256 = "0cxvhw4sfxmc9czbrwy365949vinnjwrp3i4a74pvg35sm2wasgx"; }; - "src/third_party/android_deps/libs/com_android_support_print" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_print"; version = "version:2@28.0.0.cr0"; sha256 = "0bhgwpw62wvzpjrkjp8vq0b05cn040x6i97hdvvkrq9nn6qrlnvh"; }; - "src/third_party/android_deps/libs/com_android_support_recyclerview_v7" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_recyclerview_v7"; version = "version:2@28.0.0.cr0"; sha256 = "00gr45k3jnb8h2kmij6p0p2irgkvxxqmj7idl7afl1ip4z6nm71c"; }; - "src/third_party/android_deps/libs/com_android_support_slidingpanelayout" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_slidingpanelayout"; version = "version:2@28.0.0.cr0"; sha256 = "1n9lgjwcpb8w7wjixv935khkrphw0nbg2ww87gqh8jb82pj6k0fs"; }; - "src/third_party/android_deps/libs/com_android_support_support_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_annotations"; version = "version:2@28.0.0.cr0"; sha256 = "0dda57cs8yvdpbi7jaw50ndvf4szhm9alk1iszq696m89flmky4n"; }; - "src/third_party/android_deps/libs/com_android_support_support_compat" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_compat"; version = "version:2@28.0.0.cr0"; sha256 = "1zc1341is7qw7wzdg87i1c7wibwyw0zjyb9mcn4pv1gcr66a3kqa"; }; - "src/third_party/android_deps/libs/com_android_support_support_core_ui" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_core_ui"; version = "version:2@28.0.0.cr0"; sha256 = "07xdb6n38zbh421g1shiwp46dlm2fiv5p5i89n5ra9npyydx9jya"; }; - "src/third_party/android_deps/libs/com_android_support_support_core_utils" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_core_utils"; version = "version:2@28.0.0.cr0"; sha256 = "1sw7xvn4zg4qa9fyd9jl6ric03jkp7a6pims54hif09dp6i79sz8"; }; - "src/third_party/android_deps/libs/com_android_support_support_fragment" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_fragment"; version = "version:2@28.0.0.cr0"; sha256 = "1wzdvxmvkk0vpxc43y9a5wxl177aw3npy5ssmv3z8gmyhmixv5bf"; }; - "src/third_party/android_deps/libs/com_android_support_support_media_compat" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_media_compat"; version = "version:2@28.0.0.cr0"; sha256 = "08fmh9xa2pn77viv97k9sscrkx5002hjmwhskf3c9nj8g7bd65gx"; }; - "src/third_party/android_deps/libs/com_android_support_support_v4" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_v4"; version = "version:2@28.0.0.cr0"; sha256 = "0l4sc961kx2w8yc8qf80ak383gsq940y4dfhshbfcb98k207fxvs"; }; - "src/third_party/android_deps/libs/com_android_support_support_vector_drawable" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_support_vector_drawable"; version = "version:2@28.0.0.cr0"; sha256 = "1gf7da8463fhm60ggmyp4hrkn7jrrpplmq8kqfxvd9p7vdn7jai0"; }; - "src/third_party/android_deps/libs/com_android_support_swiperefreshlayout" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_swiperefreshlayout"; version = "version:2@28.0.0.cr0"; sha256 = "0vv2aggcgbqza2sdkb75fgpi4kjysxnpw4zy2sx63y24vzbf8ld0"; }; - "src/third_party/android_deps/libs/com_android_support_transition" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_transition"; version = "version:2@28.0.0.cr0"; sha256 = "0nqgiwc7rcfnlkf8p896bylfvfycjkcxdvs41rjcyarc6d8wxa4y"; }; - "src/third_party/android_deps/libs/com_android_support_versionedparcelable" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_versionedparcelable"; version = "version:2@28.0.0.cr0"; sha256 = "16mp3wijcs7473szl35dvbji6w41cfjm8hkkic4c67gqxb4b8g18"; }; - "src/third_party/android_deps/libs/com_android_support_viewpager" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_support_viewpager"; version = "version:2@28.0.0.cr0"; sha256 = "02xilasqj0ik476dpdx3lk0xxqij9za8vcgldhyiwikh60hkq86c"; }; - "src/third_party/android_deps/libs/com_android_tools_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_common"; version = "version:2@30.2.0-beta01.cr0"; sha256 = "1h8ng5z5ac3fr1q18v2xn6vm2zja3yhzv98fwgyr9ffsvk9wf3qm"; }; - "src/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs"; version = "version:2@1.1.5.cr1"; sha256 = "1zg0lpyx03qb48b4bhpwcz0n3g2vpc60gx1gdkpg3gvn4n2z1wkr"; }; - "src/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration"; version = "version:2@1.1.5.cr1"; sha256 = "0gwyygyiwjqcffq88v7v3pw9qz3xvfr6nr5v2q5h87sf17w5q7bh"; }; - "src/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api"; version = "version:2@30.2.0-beta01.cr0"; sha256 = "0a1iwi1p11v2mgf6826x1kxg2jzvr1xbkf5jy232mrghh26w9wvy"; }; - "src/third_party/android_deps/libs/com_android_tools_sdk_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_android_tools_sdk_common"; version = "version:2@30.2.0-beta01.cr0"; sha256 = "0fx75xprag7i5iylp75r10x9fcr2i7r2jnspaa0vdbi72fhi04dd"; }; - "src/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine"; version = "version:2@2.8.8.cr0"; sha256 = "0j8s8ys4w4f072lwfidmv9xmmfqg0s0s03zhp51if1g46bxqggij"; }; - "src/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms"; version = "version:2@1.0.cr0"; sha256 = "1q2gd5pprgwlpq982dgb747kmh4h0v1agl1wa755ybjwcwnq17dn"; }; - "src/third_party/android_deps/libs/com_google_android_datatransport_transport_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_datatransport_transport_api"; version = "version:2@2.2.1.cr0"; sha256 = "06ww0c1dbzf6i62n2wrag5l0iq68kccrfgf47h2356g8j90pisnb"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth"; version = "version:2@17.0.0.cr0"; sha256 = "0s2m4d6s3p2bc1wc3mcb2qc9wzh7c3pibv4i541r0gc0vw7krih2"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone"; version = "version:2@17.5.0.cr0"; sha256 = "1qnaib8q0vasa9w3ad8aljir6rqm1kvg4sa72jv4rxlmvsjp60x3"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base"; version = "version:2@17.0.0.cr0"; sha256 = "1f6rixxs1597iiw04smrprplhg6rp7a7i66d4n3nsi7asgmi4g96"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_base" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_base"; version = "version:2@17.5.0.cr0"; sha256 = "1vgyhdzsyll887xif4n882qz8ra2lxkiavmwfff0lqi8w7yxgkda"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_basement" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_basement"; version = "version:2@17.5.0.cr0"; sha256 = "1zbhrspj4cll1mnxjawxr6wssdmi9q9r0p8hi0mk1kzgkff44ndb"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_cast" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast"; version = "version:2@17.0.0.cr0"; sha256 = "0xkpymnsj3gh8c37b7kxpaghrhwgv6fyxnv39shkkp5zbynpj6vi"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework"; version = "version:2@17.0.0.cr0"; sha256 = "0cgic5rscg8gack8nq1k22flg5caaxg6zvsm2kk1z1dbplhr9giz"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut"; version = "version:2@17.0.0.cr0"; sha256 = "0l5ylparlzynqks7kvrxck21lbpay6smnfxlhgz4zy6w82qb8inn"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging"; version = "version:2@16.0.0.cr0"; sha256 = "1rbnhmiqfvg2a1fbi5p9178p9xgvazlich227lz2sx32rggv4a7s"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_fido" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_fido"; version = "version:2@19.0.0-beta.cr0"; sha256 = "1vxsqg8ksb8allcq26ic5wxsfzm4argrawfdl6qsnbphi52r4150"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_flags" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_flags"; version = "version:2@17.0.0.cr0"; sha256 = "0bkkvhss45ghmc51n9316jkp29am0ymrk18l65nkfh19v921yw44"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_gcm" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_gcm"; version = "version:2@17.0.0.cr0"; sha256 = "09rkrv5akx7vydbi969z61b6wvgyzl4xl2m4l0vhdldcpfbp9lbv"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_iid" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_iid"; version = "version:2@17.0.0.cr0"; sha256 = "09m0jlnrzc9408p2piwr9n39s9c9bj0jxa0xm4a7nbypff51im2j"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps"; version = "version:2@17.0.0.cr0"; sha256 = "185r0vclirvvnr0vzxbi3zyywkbxbisahgky85zjvpf2270rz84k"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_location" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_location"; version = "version:2@17.0.0.cr0"; sha256 = "1vyni1fxsgn30q1xa0c0j2xzdmkjbv0cfg6j2j0n45nqiwbdw34q"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype"; version = "version:2@17.0.0.cr0"; sha256 = "1kk0sz6lhcbi6k35b8lq0inqplyzwiw18r20imk6g8s9bc0kwjgj"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport"; version = "version:2@17.0.0.cr0"; sha256 = "044xj4zvy18gjzli83lyxiky7kr9h498q3ssv0439vj4d84g1drk"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_stats" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_stats"; version = "version:2@17.0.0.cr0"; sha256 = "1y5mcgp84x77gsxmzcg69f93zl7xr37glmkkidh0b60n3g4givay"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_tasks" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_tasks"; version = "version:2@17.2.0.cr0"; sha256 = "1rbriq4wx2p7c5x0zmvvhv5772gkd2gyzprg4149cz4qrmkxjs03"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_vision" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision"; version = "version:2@18.0.0.cr0"; sha256 = "0am270a5db85z2nyw1y6r0s8axknmn8hhsyqndw4f79mjc1164v1"; }; - "src/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common"; version = "version:2@18.0.0.cr0"; sha256 = "0mjmfysdgziis487kfhgmqwsfyg2bs8mh8cxzkv0vw35bmh578mv"; }; - "src/third_party/android_deps/libs/com_google_android_material_material" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_material_material"; version = "version:2@1.6.0-alpha01.cr0"; sha256 = "15adm09x6j5kksa2kvf1p1lcgqk24s23141ynz3bq943qm32chmg"; }; - "src/third_party/android_deps/libs/com_google_android_play_core" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_android_play_core"; version = "version:2@1.10.0.cr0"; sha256 = "1gl3ry64xrajrkaka48bi9hidcwiim1v89yc0h6vvb7kkk9cfjz2"; }; - "src/third_party/android_deps/libs/com_google_auto_auto_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_auto_auto_common"; version = "version:2@1.1.2.cr0"; sha256 = "0lyckf6vgg7frjalp0npjs640p72x8f50zfqwyghjwb8cm2ydv2i"; }; - "src/third_party/android_deps/libs/com_google_auto_service_auto_service" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_auto_service_auto_service"; version = "version:2@1.0-rc6.cr0"; sha256 = "0hf9jzqxy95v034ha776xnf3f8faghyrix2489nzl6sq2kc52mcw"; }; - "src/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations"; version = "version:2@1.0-rc6.cr0"; sha256 = "0n0jqc90f741xgk34654lggkzkqxadxy14qmaiy3dhsvvn126drx"; }; - "src/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations"; version = "version:2@1.7.cr0"; sha256 = "1za1d6il5gs78rf3flnhmkwd5l58lcj032av3psszsv5lv7jglm8"; }; - "src/third_party/android_deps/libs/com_google_code_findbugs_jformatstring" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_code_findbugs_jformatstring"; version = "version:2@3.0.0.cr0"; sha256 = "0b5g8z79g1wj6r2njpxjq76izfrx4kmc65dlmaw1ng6fjh4w108i"; }; - "src/third_party/android_deps/libs/com_google_code_findbugs_jsr305" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_code_findbugs_jsr305"; version = "version:2@3.0.2.cr0"; sha256 = "16iw2vv7wvpb63ih228ybsshnim23x1b5l75svvivk05cx27l2yq"; }; - "src/third_party/android_deps/libs/com_google_code_gson_gson" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_code_gson_gson"; version = "version:2@2.8.0.cr0"; sha256 = "0mchxd8zc8y8qyx9f3a02623kb0r6pn00pscbprgfb2vr547vgks"; }; - "src/third_party/android_deps/libs/com_google_dagger_dagger" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger"; version = "version:2@2.30.cr0"; sha256 = "11i2624s87b50drifl6rc2k3dnwwx8xll3jfwad7sid7pxq2h46k"; }; - "src/third_party/android_deps/libs/com_google_dagger_dagger_compiler" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_compiler"; version = "version:2@2.30.cr0"; sha256 = "1i5flcqxvgh0ihm70l5xyg9zvl3p80qh2nfl2fspw1zqj6763f3k"; }; - "src/third_party/android_deps/libs/com_google_dagger_dagger_producers" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_producers"; version = "version:2@2.30.cr0"; sha256 = "0vcplnf2m0hd914isjswvp8prnnih57fhxixhnngcgjjagygijx0"; }; - "src/third_party/android_deps/libs/com_google_dagger_dagger_spi" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_spi"; version = "version:2@2.30.cr0"; sha256 = "1jsljm97r1z7y2hn8k2jpmidx3r0l8bghmhi8nykasi4pjpgmssh"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation"; version = "version:2@2.10.0.cr0"; sha256 = "0ccklipp0v1nd5gjw8k0gb0x13pjs1j9bh7pfbn1m4gdrw3rgwvm"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations"; version = "version:2@2.10.0.cr0"; sha256 = "0x8g5hd1znvakcncy74ar0n0sjvnd7p2is8p0cqnb34v3l0pb502"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api"; version = "version:2@2.10.0.cr0"; sha256 = "06vq6nyc16pdj6hb8dgxl95cylnd6w7l99rxgl671fp8yz5cqasb"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_core" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_core"; version = "version:2@2.10.0.cr0"; sha256 = "0iahrp0sgl82kvhb1208dnh2gl93nv0ms58zk5bhadsq48wczypd"; }; - "src/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations"; version = "version:2@2.10.0.cr0"; sha256 = "0jmcvmp54ifflvb09q7k75zwyv9fiabv5fi74996s7rfkypsk83i"; }; - "src/third_party/android_deps/libs/com_google_errorprone_javac" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_javac"; version = "version:2@9+181-r4173-1.cr0"; sha256 = "1h1xrshv2a3hx6x9x1mrwijpiyhrigimzp0ji4w4fnflyv52kzpc"; }; - "src/third_party/android_deps/libs/com_google_errorprone_javac_shaded" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_errorprone_javac_shaded"; version = "version:2@9-dev-r4023-3.cr0"; sha256 = "01ag9435x9dqw0jidrl7nm5cflikh9pkxk8a1ywnq4c4d634g60m"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_annotations"; version = "version:2@16.0.0.cr0"; sha256 = "11rdw5aqwyb2nx9ni83gr6jmd4344jk5zvf1f3sm2bbij1js7hkj"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_common"; version = "version:2@19.5.0.cr0"; sha256 = "12fazvay20mqf0km2d4jyx1mfrxy4a0i5pqph8syh1lzm3b3y399"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_components" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_components"; version = "version:2@16.1.0.cr0"; sha256 = "1xly7a2qaxscp2p1hmkggsrlni325aj6z5y3sm5qhmazci4bxnm0"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_encoders" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders"; version = "version:2@16.1.0.cr0"; sha256 = "045ba4l7jvz53nn425w24jdgvlp1jwag2kb09q3pyiw6rwwqabfw"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json"; version = "version:2@17.1.0.cr0"; sha256 = "0zllj52nc7lv56wc6lvis0hxi1gii7y9frkvdfmmid6wrrlw00xx"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_iid" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid"; version = "version:2@21.0.1.cr0"; sha256 = "0v6x78z8qpdz07dqb9sbv98ij7ylj3x8lbbxlnxdgs3373pyg9q1"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop"; version = "version:2@17.0.0.cr0"; sha256 = "146kilgl7x7xigmpqzv1fcdsmwidirqqf6hclz9rmmx5mg42c53l"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_installations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations"; version = "version:2@16.3.5.cr0"; sha256 = "1x9nlyj9nphn6wfwnjkyizxgv21mvkpw2gs4cjj4m2ng44r73qs2"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop"; version = "version:2@16.0.1.cr0"; sha256 = "0kmv1r0vckl22qjmhmmbg6i0k1iqcdf61pswx8pkq31yvx1xahxk"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector"; version = "version:2@18.0.0.cr0"; sha256 = "115s741xrpazn0z2mi4arp2f2y02jxnlinag49h7yzr4f43p4qwy"; }; - "src/third_party/android_deps/libs/com_google_firebase_firebase_messaging" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_messaging"; version = "version:2@21.0.1.cr0"; sha256 = "1fbjzf622qha3m8k5q1ks2ys2l7wz4qljbqfxb34x4xskkvdqfjk"; }; - "src/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java"; version = "version:2@2.0.3.cr0"; sha256 = "1whzndx6lf0k8dyyxb0fdinqd6lb7l1mkkgds1frxhfgg115dvyf"; }; - "src/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format"; version = "version:2@1.5.cr0"; sha256 = "16kp7w3c3skrjbx6g71k5wmh0a8ygm3fc9nxfn8kxh7qiy4axyqc"; }; - "src/third_party/android_deps/libs/com_google_guava_failureaccess" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_guava_failureaccess"; version = "version:2@1.0.1.cr0"; sha256 = "0z0mp28k0d59v41qmr3kinb4wyhpi2h12ppkjgx0kppw3nz7cbq4"; }; - "src/third_party/android_deps/libs/com_google_guava_guava" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_guava_guava"; version = "version:2@31.0-jre.cr0"; sha256 = "0fyvgj7x6an5a5zaq88xbapxa0r9j4izqwy83ml1qwlrlvi6xjnx"; }; - "src/third_party/android_deps/libs/com_google_guava_guava_android" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_guava_guava_android"; version = "version:2@31.0-android.cr0"; sha256 = "0wrfxqrpic10bcr2a2vjybqqnzcmnjmhl4xfxkah65aj9945x3p6"; }; - "src/third_party/android_deps/libs/com_google_guava_listenablefuture" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_guava_listenablefuture"; version = "version:2@1.0.cr0"; sha256 = "187dhlm3naks9dq0rw2710d566sfbckricxrzvskf9swmc6aw7q2"; }; - "src/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations"; version = "version:2@1.3.cr0"; sha256 = "166rvbzy6v2kdjljqj6xihi76f3i1nvmblmyb9bnx67biil4cxc5"; }; - "src/third_party/android_deps/libs/com_google_protobuf_protobuf_java" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_java"; version = "version:2@3.4.0.cr0"; sha256 = "18xdgm0qy8a1ms5lbdkmk7kh5dpxkg8icvqa7zhsii47sglr04hy"; }; - "src/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite"; version = "version:2@3.19.3.cr0"; sha256 = "0x2y8d0c3j02wjy9zn6jz9x5cn2min5dpyg7hmn6yssw5vww323d"; }; - "src/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils"; version = "version:2@1.3.0.cr0"; sha256 = "1zqbqnbs03i8c8xp2prj01acrg36w9mm0fjkxyjkppiwblcdhfih"; }; - "src/third_party/android_deps/libs/com_squareup_javapoet" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_squareup_javapoet"; version = "version:2@1.13.0.cr0"; sha256 = "1c0n842klp8rmdla7k35rya4wsam8wambb8j7c2mxvhn1vmwzs7a"; }; - "src/third_party/android_deps/libs/com_squareup_javawriter" = fetchcipd { package = "chromium/third_party/android_deps/libs/com_squareup_javawriter"; version = "version:2@2.1.1.cr0"; sha256 = "066cj5sqnw32rcbzbf00695n8nlk6rjxfslxmmzkl9ka8r5d2ahf"; }; - "src/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils" = fetchcipd { package = "chromium/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils"; version = "version:2@4.0.cr0"; sha256 = "1jkdnma8wlcy4fiisbdihybhn783hq03pjm1pag0x25h0rx0h0yz"; }; - "src/third_party/android_deps/libs/javax_annotation_javax_annotation_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/javax_annotation_javax_annotation_api"; version = "version:2@1.3.2.cr0"; sha256 = "0h3ha41h7cj1rp30iwsyabzsmd9i1ydlzigljm65mrmpk8cni9vz"; }; - "src/third_party/android_deps/libs/javax_annotation_jsr250_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/javax_annotation_jsr250_api"; version = "version:2@1.0.cr0"; sha256 = "0lsp20gny3inm5k2cahyldizqm8xryb56lhdzripc5vw2fp5jady"; }; - "src/third_party/android_deps/libs/javax_inject_javax_inject" = fetchcipd { package = "chromium/third_party/android_deps/libs/javax_inject_javax_inject"; version = "version:2@1.cr0"; sha256 = "10wyr7izgi6n2fl2mi0kki2xkcp77nc42ar5pysf1dvh6d52h20d"; }; - "src/third_party/android_deps/libs/nekohtml_nekohtml" = fetchcipd { package = "chromium/third_party/android_deps/libs/nekohtml_nekohtml"; version = "version:2@1.9.6.2.cr0"; sha256 = "14id93112xhb47ic78acc6r6ypmcryq4hddvhmq927cd0klxf44n"; }; - "src/third_party/android_deps/libs/nekohtml_xercesminimal" = fetchcipd { package = "chromium/third_party/android_deps/libs/nekohtml_xercesminimal"; version = "version:2@1.9.6.2.cr0"; sha256 = "1w0x6z4792nvg69pfxkqpmqnfwdghdgfaajw68s3z522dzhrv3iz"; }; - "src/third_party/android_deps/libs/net_ltgt_gradle_incap_incap" = fetchcipd { package = "chromium/third_party/android_deps/libs/net_ltgt_gradle_incap_incap"; version = "version:2@0.2.cr0"; sha256 = "15zb0bfh59jccj43zndfh8v235jw37cr9j4nd3bj92anslyrz7ya"; }; - "src/third_party/android_deps/libs/net_sf_kxml_kxml2" = fetchcipd { package = "chromium/third_party/android_deps/libs/net_sf_kxml_kxml2"; version = "version:2@2.3.0.cr0"; sha256 = "11w4gzw2ygy9ifv64pi1dky7f20229phpxkkawr45cyy1cnkcl06"; }; - "src/third_party/android_deps/libs/org_apache_ant_ant" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_ant_ant"; version = "version:2@1.8.0.cr0"; sha256 = "0lqbgw8apkyx6sv9h273wn0k758zbkb2r6g9y9s93yc4m9lcpha2"; }; - "src/third_party/android_deps/libs/org_apache_ant_ant_launcher" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_ant_ant_launcher"; version = "version:2@1.8.0.cr0"; sha256 = "1r8rbxppalkdkrcajhwad3s2xidxp3a4kn7cngyyj6f6cvkd61an"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks"; version = "version:2@2.1.3.cr0"; sha256 = "0c0wpmzldl8xwxkmz7sg336a60g1dq90z1691wsy6nkjcbzx5fig"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_artifact" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact"; version = "version:2@2.2.1.cr0"; sha256 = "0sryj92ly4kl77z39454whnp86p9yi5mncdj4pn3rw46hgz5k464"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager"; version = "version:2@2.2.1.cr0"; sha256 = "1l4bbj7z9aw62acjnsnwz6bmhf147naffg95zzxwxf486dpzym0l"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics"; version = "version:2@2.2.1.cr0"; sha256 = "14njx071kqnqw6rxg1chz1pzgmxv8f6z4kqdkql8n5mmc4kygkzq"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_model" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_model"; version = "version:2@2.2.1.cr0"; sha256 = "0d5snhc9klrsz735ng4dzzp408jrwa9v4bh5cn9nkjf0azp9c504"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry"; version = "version:2@2.2.1.cr0"; sha256 = "1hxw7vgr2qcc9k9i4g5y6ixras23lfp434nzcycjis81ymj608qq"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_profile" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_profile"; version = "version:2@2.2.1.cr0"; sha256 = "06vk8m41p1xazq42xp700dh3izr1h4fsp1afan2lgp4jh9pnvyxk"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_project" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_project"; version = "version:2@2.2.1.cr0"; sha256 = "1q3fxdsiw6wd5zcx0zgskg5s8kwlq3x92hxgis84lpkz05jj33h3"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata"; version = "version:2@2.2.1.cr0"; sha256 = "13228089dpfz5n4i9zlm2wjqklv4s5gzbrr6vzbjxik5cl562a3f"; }; - "src/third_party/android_deps/libs/org_apache_maven_maven_settings" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_settings"; version = "version:2@2.2.1.cr0"; sha256 = "0gkf2z0cga4khhba2gp0cpk0l43d8x7xrppv42cl7p8znyxip6cs"; }; - "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file"; version = "version:2@1.0-beta-6.cr0"; sha256 = "0ap8mz7g1d29jka84jlaqvfgnjfp57pcv9jg79wbfja9xvfswvy9"; }; - "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight"; version = "version:2@1.0-beta-6.cr0"; sha256 = "0pj4lbq54c88pf5xzwf5inbc3083lnqmrb2n6xsyggrf79ir2mhj"; }; - "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared"; version = "version:2@1.0-beta-6.cr0"; sha256 = "0h3lfgn2aa0c2jrgdjlzhrhjxp8wj3b0hm8n96c9wnfp7dqrdiah"; }; - "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api"; version = "version:2@1.0-beta-6.cr0"; sha256 = "01cc4s4g4f9hcziap1p0529k8p7mqpscjc23qjvc7sv5jk9yd6dc"; }; - "src/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup"; version = "version:2@1.2.1.cr0"; sha256 = "03i164wm6lwqiqgzwwhjvhfwmj5hqpr5f6i6hzl75plkq90rxjhp"; }; - "src/third_party/android_deps/libs/org_checkerframework_checker_compat_qual" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_checkerframework_checker_compat_qual"; version = "version:2@2.5.5.cr0"; sha256 = "0v1nkl6fjpmy4w3h2cdkghc9s8sdyfdi5pmvmhvzpc536dk844i4"; }; - "src/third_party/android_deps/libs/org_checkerframework_checker_qual" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_checkerframework_checker_qual"; version = "version:2@3.12.0.cr0"; sha256 = "089ycxas3ya1abkm4kk1y7v1gz57dm159ld7mck6ha7rhis803kj"; }; - "src/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone"; version = "version:2@3.15.0.cr0"; sha256 = "0sgfknqkwl7c4zykrlx88qlp5jya7rnhyyb3cadkgc4bhbyb9kvc"; }; - "src/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations"; version = "version:2@1.17.cr0"; sha256 = "1xfchxaklc8w1rjj46yiqc3v9sljvzwp018yscb0wzqmrarv689q"; }; - "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default"; version = "version:2@1.0-alpha-9-stable-1.cr0"; sha256 = "1xvw9r8gz3cc6qw2mz165z3ib95ldi9kkagascd951nmvdacl06j"; }; - "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation"; version = "version:2@1.11.cr0"; sha256 = "1akvdbcmh0nramh97n0yw4ddgasr6f2ypgc853ni9g3rgafm4fcv"; }; - "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils"; version = "version:2@1.5.15.cr0"; sha256 = "1vmgr1dm88i7mjc82z5s29svhxy121zs1f39g22prwjygksdpilv"; }; - "src/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit"; version = "version:2@4.4.1.201607150455-r.cr0"; sha256 = "1086c3y6f213pnyizlr5aqy0x9f37xpjbpsl6mv5bvy8y6f8dvmw"; }; - "src/third_party/android_deps/libs/org_jetbrains_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_annotations"; version = "version:2@13.0.cr0"; sha256 = "1l75bqhnrbynaknclp7236wv1i4bhy4mwp0qnp4rl5hglxjdsg38"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib"; version = "version:2@1.6.10.cr0"; sha256 = "1wym3wh62xjki85y7gksq3nv8ism8in0gv4ar4pa3xhs1n64hyfd"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common"; version = "version:2@1.6.10.cr0"; sha256 = "1qsk426jqa7vdpzdfig2ricbdbggp1fkkaiarzh04nd47my02spi"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7"; version = "version:2@1.5.0.cr0"; sha256 = "038bblp1s0p06nx2f79dc3dnxwp9imrmjdyr3igh8mmn46lyr306"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8"; version = "version:2@1.5.0.cr0"; sha256 = "012yrnn7digalil885737ygf2fdhx3g294xszhcyr097289whv4m"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android"; version = "version:2@1.5.0.cr0"; sha256 = "05x6w0mj89qvvfxnb806mhnsf7p165da8cab4ns7vk1w9zvh3gjv"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm"; version = "version:2@1.5.0.cr0"; sha256 = "18sn0if3cxmram0r053bvy9xvl6kxbhi347h7vkdrq8sxh6sll5i"; }; - "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm"; version = "version:2@0.1.0.cr0"; sha256 = "06b2iya1cvhflslnl5ij0hsha4jwgal64xwrl2l5i6yyzaii8mpm"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm"; version = "version:2@7.0.cr0"; sha256 = "1j2mxgrj76cr780xqawxylwcslnmgfh0fp8cnwb0lrz1qlspmvbv"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm_analysis" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_analysis"; version = "version:2@7.0.cr0"; sha256 = "1k7ghsaqb5d2xyx965prp39grpqajk7p4qpwzc3wvdxmgcxcb68s"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm_commons" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_commons"; version = "version:2@7.0.cr0"; sha256 = "1x0ck0bjcbirwkm8xh43w5y2ghwgrpvakzsszlwlnarawcadk0lz"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm_tree" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_tree"; version = "version:2@7.0.cr0"; sha256 = "18n8q2gxzw42icsa47nsp98ja0bgm63i91x1qgbn3pjm8fiax3q3"; }; - "src/third_party/android_deps/libs/org_ow2_asm_asm_util" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_util"; version = "version:2@7.0.cr0"; sha256 = "171s0xhdjsxmvm8pxzjkabdzl0nm1a29bylwxhsmz8i986xy56xr"; }; - "src/third_party/android_deps/libs/org_pcollections_pcollections" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_pcollections_pcollections"; version = "version:2@2.1.2.cr0"; sha256 = "1c8i3znyqjkhq4wi3qryvqramzjhkymczxxn0iiky4hij6gwajza"; }; - "src/third_party/android_deps/libs/org_robolectric_annotations" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_annotations"; version = "version:2@4.3.1.cr0"; sha256 = "1mpbd90ynigkvm74n9wfvp8f3zv87nyw1g88nihj7dcna03l4y05"; }; - "src/third_party/android_deps/libs/org_robolectric_junit" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_junit"; version = "version:2@4.3.1.cr0"; sha256 = "1cgpc8bx66x6i0kam05y4q17ikazzc19q2ykfdgpcwyj2kmca66g"; }; - "src/third_party/android_deps/libs/org_robolectric_pluginapi" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_pluginapi"; version = "version:2@4.3.1.cr0"; sha256 = "0r7fdjj09jmxah0lm7lbiy3ihw1g2myx3rbf4wky8pyvqxx589vi"; }; - "src/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver"; version = "version:2@4.3.1.cr0"; sha256 = "1nyrqpvvagvnvlb5k1yk89a8jndy510xd81j4gy8q2xxypdvwphq"; }; - "src/third_party/android_deps/libs/org_robolectric_resources" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_resources"; version = "version:2@4.3.1.cr0"; sha256 = "0mqyk7r1943h7bhz7kf5yhcd6cbp65swlabkxv7alr9svslzs5a9"; }; - "src/third_party/android_deps/libs/org_robolectric_robolectric" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_robolectric"; version = "version:2@4.3.1.cr0"; sha256 = "0k8qfnil5xl2pdf12qfcf49h9mzs1l612r7khdvnpa64l5npwa31"; }; - "src/third_party/android_deps/libs/org_robolectric_sandbox" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_sandbox"; version = "version:2@4.3.1.cr0"; sha256 = "126aws364b1bxmwspbn2jk2nzw2w8rrcrp03rl3ggnq26al6gysp"; }; - "src/third_party/android_deps/libs/org_robolectric_shadowapi" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_shadowapi"; version = "version:2@4.3.1.cr0"; sha256 = "0jnaxvm9hwz2fj8qgnpxdwbcnjph11qcrjp2nf5z0657gxbfwscj"; }; - "src/third_party/android_deps/libs/org_robolectric_shadows_framework" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_framework"; version = "version:2@4.3.1.cr0"; sha256 = "1gvqzlxmvlhgyd1q3fgds8fw679hmjqxaas6irjy0xnkj8qpyw1y"; }; - "src/third_party/android_deps/libs/org_robolectric_shadows_multidex" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_multidex"; version = "version:4.3.1-cr1"; sha256 = "1f4q4dspngfblqfdasydv64ik4bgw4jmrfb1686l5jv8dj27dn2k"; }; - "src/third_party/android_deps/libs/org_robolectric_shadows_playservices" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_playservices"; version = "version:2@4.3.1.cr0"; sha256 = "0ms20s8ds7mkslayngv9ll957zpxqr535ch7ykdfsfqqj3cvaj20"; }; - "src/third_party/android_deps/libs/org_robolectric_utils" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_utils"; version = "version:2@4.3.1.cr0"; sha256 = "022fpdpfhy63vcw7gvdp0knw5a3xf0ix9v4mf63bb8i2630zh53c"; }; - "src/third_party/android_deps/libs/org_robolectric_utils_reflector" = fetchcipd { package = "chromium/third_party/android_deps/libs/org_robolectric_utils_reflector"; version = "version:2@4.3.1.cr0"; sha256 = "1v5mz4rr6kqk2fg4kl26hsjhdwzaahdv6lkqkpiw6n908dcr4wdf"; }; - "src/third_party/android_ndk" = fetchgit { url = "https://chromium.googlesource.com/android_ndk.git" ; rev = "9644104c8cf85bf1bdce5b1c0691e9778572c3f8"; sha256 = "0wjkpsk5kns5mq1mscy0sia4pqxlcf97cl2kzdnp33mxa9mjgw6b"; fetchSubmodules = true; }; - "src/third_party/android_protobuf/src" = fetchgit { url = "https://android.googlesource.com/platform/external/protobuf.git" ; rev = "7fca48d8ce97f7ba3ab8eea5c472f1ad3711762f"; sha256 = "1icb2s3lp1vsximymk3cm8adwj7xk3awb4a7plxj88zqphydkk0d"; fetchSubmodules = true; }; - "src/third_party/android_protoc" = fetchcipd { package = "chromium/third_party/android_protoc"; version = "sLsJWojddBL2u8NYwNh6pJsqp_bL1ttmYIlBnhiIQ1QC"; sha256 = "00qag88lcvgz2f3krqlj8fgjy56ck3lkafk7dq8x6lxz1h1m5wim"; }; - "src/third_party/android_rust_toolchain/toolchain" = fetchcipd { package = "chromium/third_party/android_rust_toolchain/linux-amd64"; version = "BKAbvHjGv4-os-v8MS3I54bPsY-397xgaJ3yBeIVS20C"; sha256 = "11k51g71jm6qfxb0ncghdm5ccv0q63zpyc0qz5q76w65h3402l47"; }; - "src/third_party/android_sdk/androidx_browser/src" = fetchgit { url = "https://chromium.googlesource.com/external/gob/android/platform/frameworks/support/browser.git" ; rev = "65086eb5e52c16778fa7b4f157156d17b176fcb3"; sha256 = "1ypad79hb6m88bhrzlklz4cbba6gmrzxcls91z923ip3wdsg90wl"; fetchSubmodules = true; }; - "src/third_party/android_sdk/public" = - symlinkJoin { name = "cipd-joined"; paths = [ - (fetchcipd { package = "chromium/third_party/android_sdk/public/build-tools/31.0.0"; version = "tRoD45SCi7UleQqSV7MrMQO1_e5P8ysphkCcj6z_cCQC"; sha256 = "0q81fbacrram3b8qzv1icwpa5wl16plv5giqyh2xy9gaz1xnh56h"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/cmdline-tools"; version = "PGPmqJtSIQ84If155ba7iTU846h5WJ-bL5d_OoUWEWYC"; sha256 = "1svag2krs4k2lq7cj2yhg2z7lmbyshpgppzsv6i451bdzaccbj2j"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/emulator"; version = "gMHhUuoQRKfxr-MBn3fNNXZtkAVXtOwMwT7kfx8jkIgC"; sha256 = "0a872r5yfpp1bk191951zf1akrcvxabdi2axiqxmmslzqqds6gi4"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/extras"; version = "ppQ4TnqDvBHQ3lXx5KPq97egzF5X2FFyOrVHkGmiTMQC"; sha256 = "0zxfabvlmnh6avqcfs8g8w83ci1nnm9n68jvprsx5baiisqzv0ss"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/patcher"; version = "I6FNMhrXlpB-E1lOhMlvld7xt9lBVNOO83KIluXDyA0C"; sha256 = "1q03jm591c7fn1jra007pl43bs6hxm46cynnv3xx8rwyiwpbdwy0"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/platform-tools"; version = "g7n_-r6yJd_SGRklujGB1wEt8iyr77FZTUJVS9w6O34C"; sha256 = "1mzk6j31wd0lsznwgydbcfiw1iqf22rr606nx8149ygkfybrwic1"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/platforms/android-31"; version = "lL3IGexKjYlwjO_1Ga-xwxgwbE_w-lmi2Zi1uOlWUIAC"; sha256 = "0i5zlry2zllmlmzymwv2b622rpmhp5qpxjp2vggffyaz627y4gn9"; }) -(fetchcipd { package = "chromium/third_party/android_sdk/public/sources/android-31"; version = "_a_BcnANjPYw5mSKlNHa7GFY8yc1kdqj2rmQgac7yUcC"; sha256 = "154bn5dkk67zm6ayivxl8s6nxhr8rz1zi13ms52gkbd08zshnqsq"; }) - ]; } - ; - "src/third_party/android_support_test_runner" = fetchcipd { package = "chromium/third_party/android_support_test_runner"; version = "96d4bf848cd210fdcbca6bcc8c1b4b39cbd93141"; sha256 = "1xk3b48zwan3pyg94mjkmain8r2iyld7lvzy3zd8yaz5bairfhif"; }; - "src/third_party/android_system_sdk" = fetchcipd { package = "chromium/third_party/android_system_sdk/public"; version = "oSfDIvHlCa6W0gS79Q5OOfB9E4eBg3uAvi3BEDN21U0C"; sha256 = "06nl413nfdj51ahaxwh7n95lpjjvrincwjgnq9s1a1092zhig0zb"; }; - "src/third_party/androidx" = fetchcipd { package = "chromium/third_party/androidx"; version = "nPCy7pWgirlw8qxgh7t5Rh6g8Dzl-p9fGdw86SNpKFUC"; sha256 = "1ya92mq5wjscc5fvnsqg85fh494kzdkc4yjfhax8g900vinkys60"; }; - "src/third_party/angle" = fetchgit { url = "https://chromium.googlesource.com/angle/angle.git" ; rev = "cc8b741c6ba4cf3cd56d6bc1173b029c816f8ced"; sha256 = "11s212x0l28dwzf9lmlgsgl329pyqf0gnvvlgnzbdbqqgkj1yy0b"; fetchSubmodules = true; }; - "src/third_party/angle/third_party/VK-GL-CTS/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS" ; rev = "834c2e16ae1c4977b705be66508a35a54fd3f4ad"; sha256 = "0y3pm4h8wxg9jzcf3178vycjaz7jbdrv210gkshc87h189z078cx"; fetchSubmodules = true; }; - "src/third_party/angle/third_party/glmark2/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/glmark2/glmark2" ; rev = "ca8de51fedb70bace5351c6b002eb952c747e889"; sha256 = "1fdfk4rwsnp8wwkmpdq7aqvyrd3amwqyr3b3hs2wb7rarmcb7grg"; fetchSubmodules = true; }; - "src/third_party/angle/third_party/rapidjson/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/Tencent/rapidjson" ; rev = "7484e06c589873e1ed80382d262087e4fa80fb63"; sha256 = "1g7syqklm3bpsixa5gybvqhv3yi9bgf173k11as55wvlshmkmjgp"; fetchSubmodules = true; }; - "src/third_party/apache-linux" = fetchcipd { package = "infra/3pp/tools/httpd-php/${platform}"; version = "version:2@httpd2.4.38.php7.3.31.chromium.3"; sha256 = "1p9srk6a014a1adl4bf1wgd9r5bis7860z940m9b6216jl734mhp"; }; - "src/third_party/apache-portable-runtime/src" = fetchgit { url = "https://chromium.googlesource.com/external/apache-portable-runtime.git" ; rev = "c3f11fcd86b42922834cae91103cf068246c6bb6"; sha256 = "1qb3qgwhn94v56kfw4ciaxbzfad834d1dgdhckhj3vcr86bchj5j"; fetchSubmodules = true; }; - "src/third_party/arcore-android-sdk-client" = fetchcipd { package = "chromium/third_party/arcore-android-sdk-client"; version = "fUSZ4jxIhIx34TxRIcrmOu76-khcka_Gpn0_t9lKCWQC"; sha256 = "0bm7wrp9nq76hnrwaq2j2qwkvywlmyvc04wlqvvw77vqgh0q0lid"; }; - "src/third_party/arcore-android-sdk/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google-ar/arcore-android-sdk.git" ; rev = "eaa85941f2d724c60671bf94f46de7178baba7e6"; sha256 = "12frfx2g3i8hynkb0shvp817qh9j5267j5ynq21kagab2c9ph14s"; fetchSubmodules = true; }; - "src/third_party/boringssl/src" = fetchgit { url = "https://boringssl.googlesource.com/boringssl.git" ; rev = "68addd2f719422cd00f44f06c330457269d3facf"; sha256 = "0fa9966n096269cjdqlqw073iij959c965djxfmnrirjpf868b99"; fetchSubmodules = true; }; - "src/third_party/bouncycastle" = fetchcipd { package = "chromium/third_party/bouncycastle"; version = "c078e87552ba26e776566fdaf0f22cd8712743d0"; sha256 = "0r1a513bllx5pv9v2bp4rcy8ca79ahx38iy1zp7ac6xjz8527pwr"; }; - "src/third_party/breakpad/breakpad" = fetchgit { url = "https://chromium.googlesource.com/breakpad/breakpad.git" ; rev = "08bd844599bf04c71707e8f59a8013a941264695"; sha256 = "0r8v1jzzrl0y0pibg8s7xzn1dyg4dq3nnh4a1shm69kq49wby6rx"; fetchSubmodules = true; }; - "src/third_party/byte_buddy" = fetchcipd { package = "chromium/third_party/byte_buddy"; version = "c9b53316603fc2d997c899c7ca1707f809b918cd"; sha256 = "1dffk7k27ng3h5zkx7qgaynydpm9czk3zp8crkghjs6xzdkzfdry"; }; - "src/third_party/byte_buddy/android_sdk_build_tools_25_0_2" = fetchcipd { package = "chromium/third_party/android_sdk/public/build-tools"; version = "kwIs2vdfTm93yEP8LG5aSnchN4BVEdVxbqQtF4XpPdkC"; sha256 = "0bs6lp21wpbhg3cfna1s7ncjn0l6j7zdx83fk22xw3350mjlbnm7"; }; - "src/third_party/cast_core/public/src" = fetchgit { url = "https://chromium.googlesource.com/cast_core/public" ; rev = "e7dac9fd5f5bf0158015b33a2594e30c1e4ae610"; sha256 = "1bxq0lzbr1xb2k56yq1p8ifwgdhknc6wllnp44vqv5cdqlsb9jyq"; fetchSubmodules = true; }; - "src/third_party/catapult" = fetchgit { url = "https://chromium.googlesource.com/catapult.git" ; rev = "1fe05501cf4f6f9f95a85b12f04e59a4485e1ffe"; sha256 = "1ssv8dc1pwi7sj2qf0hmffjmrhdgak6rl8ima0gc08mjvd6p50x6"; fetchSubmodules = true; }; - "src/third_party/ced/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git" ; rev = "ba412eaaacd3186085babcd901679a48863c7dd5"; sha256 = "09jjr2nffp2b6sqrk0bx4zrqvbqf8isq0i2v7qzng2zn33hvn8f9"; fetchSubmodules = true; }; - "src/third_party/checkstyle" = fetchcipd { package = "chromium/third_party/checkstyle"; version = "UAf8iarsiPx9B6ClHuyeRNM6py76TUVdylyGLTmpb4IC"; sha256 = "0m3n0zhjljnyankcli97p48kkji7c9nwrr32j29l806dmpysqzqa"; }; - "src/third_party/cld_3/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/cld_3.git" ; rev = "576305689d23da93e2f5e04a3de5afbe60d339da"; sha256 = "046kjrwy9k82wdss48y1bdzzry03il59lanfk28lzgsgsa5h7h06"; fetchSubmodules = true; }; - "src/third_party/colorama/src" = fetchgit { url = "https://chromium.googlesource.com/external/colorama.git" ; rev = "799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8"; sha256 = "0llfx0c2rs270431s8yi8ffmn45zxncwxmwby42q3adv45il87qq"; fetchSubmodules = true; }; - "src/third_party/crc32c/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/crc32c.git" ; rev = "fa5ade41ee480003d9c5af6f43567ba22e4e17e6"; sha256 = "0vivyzhljrsz6yp5fyyq86bq3hih1zxv77jv41j82c251yym60kz"; fetchSubmodules = true; }; - "src/third_party/cros_system_api" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/platform2/system_api.git" ; rev = "8b6ea1312fc4959c28a16526ca20d5d703c51f83"; sha256 = "0fl34yf4hy52bfz6czjimagjshbcfdkfaypphpq7vpgi44ygkc57"; fetchSubmodules = true; }; - "src/third_party/dav1d/libdav1d" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/videolan/dav1d.git" ; rev = "cce2b0564d3b0aa1a5e4ec0c561b6a1b8497cebb"; sha256 = "0ndx24c9a5218xwa2siiys4d580mc1rrvpcmm54zn8hrvzj2jc42"; fetchSubmodules = true; }; - "src/third_party/dawn" = fetchgit { url = "https://dawn.googlesource.com/dawn.git" ; rev = "e846fefc34da4ba904c681cd275ada191674cfb5"; sha256 = "0xc36lg3qyp9j83ckhldb3dv7kjjiyzcscyrl6x7n19700sa25al"; fetchSubmodules = true; }; - "src/third_party/dawn/third_party/tint" = fetchgit { url = "https://dawn.googlesource.com/tint" ; rev = "555e94e7e36551ec8ae577a2ea1e958c8052f3fd"; sha256 = "1qb1hdvjk8hcj1s77m67waa71f5a57arffs7rfx1ilpq3rsjv6b8"; fetchSubmodules = true; }; - "src/third_party/depot_tools" = fetchgit { url = "https://chromium.googlesource.com/chromium/tools/depot_tools.git" ; rev = "988c0af5bed05e97d351297ed9f3221bfe42a205"; sha256 = "0jhxr2gp4nqsqplqsrrzxxw53m3rl9qdmbiq6sxm1icscpndr991"; fetchSubmodules = true; }; - "src/third_party/devtools-frontend/src" = fetchgit { url = "https://chromium.googlesource.com/devtools/devtools-frontend" ; rev = "23dc975793cd9335a2e51b4440c76268a4d56159"; sha256 = "1mgwsix918v6gnlhna2ahi2r34hvai9azcv7h8yrp9y8zawwvvmv"; fetchSubmodules = true; }; - "src/third_party/devtools-frontend/src/third_party/esbuild" = fetchcipd { package = "infra/3pp/tools/esbuild/${platform}"; version = "version:2@0.14.13.chromium.2"; sha256 = "048cv3givcy0yssgg994z17qfsr8ixjjmz42apqmpwgz7bmysij1"; }; - "src/third_party/dom_distiller_js/dist" = fetchgit { url = "https://chromium.googlesource.com/chromium/dom-distiller/dist.git" ; rev = "199de96b345ada7c6e7e6ba3d2fa7a6911b8767d"; sha256 = "170qd75bwc0gld86vf32w36smc15wrafxqlg332mv5fhcl7h3qfa"; fetchSubmodules = true; }; - "src/third_party/eigen3/src" = fetchgit { url = "https://chromium.googlesource.com/external/gitlab.com/libeigen/eigen.git" ; rev = "7db0ac977acf276fb0817cfb89e490cdbae0ab56"; sha256 = "0n1r7ry9n5ii74995issik7qh762yb91pmn6d89p3xrdpig3iyxf"; fetchSubmodules = true; }; - "src/third_party/emoji-segmenter/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/emoji-segmenter.git" ; rev = "9ba6d25d0d9313569665d4a9d2b34f0f39f9a50e"; sha256 = "06qn0sjprsak0b2schahfkl3nwrrrwbls7hhn02vp7ham806cgx1"; fetchSubmodules = true; }; - "src/third_party/espresso" = fetchcipd { package = "chromium/third_party/espresso"; version = "y8fIfH8Leo2cPm7iGCYnBxZpwOlgLv8rm2mlcmJlvGsC"; sha256 = "1kiahac6knkm2zfi6b2avfpank3m5v1439wjrw9r37vh6lvxab2y"; }; - "src/third_party/expat/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git" ; rev = "65a21f2b2a306d29b44e70264aca948aa0454219"; sha256 = "1v9h33xzj34qc4am5r8d1dggqyx9yhpj6f1lwdqmv7a63lnffsbs"; fetchSubmodules = true; }; - "src/third_party/farmhash/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/farmhash.git" ; rev = "816a4ae622e964763ca0862d9dbd19324a1eaf45"; sha256 = "1mqxsljq476n1hb8ilkrpb39yz3ip2hnc7rhzszz4sri8ma7qzp6"; fetchSubmodules = true; }; - "src/third_party/ffmpeg" = fetchgit { url = "https://chromium.googlesource.com/chromium/third_party/ffmpeg.git" ; rev = "574c39cce3231c69bc9a02ac475c27d944bdb113"; sha256 = "1ir1m8f8h20s7rffqpv7kxflj0qlhrxcbkj6ihf05yinfp9grgc8"; fetchSubmodules = true; }; - "src/third_party/flac" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/flac.git" ; rev = "af862024c8c8fa0ae07ced05e89013d881b00596"; sha256 = "1y1pcdkza3fqvqam1pw5qm38pwy848mmfykqx06ir187p107c9d4"; fetchSubmodules = true; }; - "src/third_party/flatbuffers/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/flatbuffers.git" ; rev = "b8aaccee8248059b2af032cca0eb1d2ddbdb6cdc"; sha256 = "0p33547fi72z1qh19ydg8ni9qlx9wc5lzl837h67bgy7qfksjsch"; fetchSubmodules = true; }; - "src/third_party/fontconfig/src" = fetchgit { url = "https://chromium.googlesource.com/external/fontconfig.git" ; rev = "452be8125f0e2a18a7dfef469e05d19374d36307"; sha256 = "1gfdqi80qvq3h4xbsrsfh9bmdzaiczzaaq95m0mxpd6xdqi6pizq"; fetchSubmodules = true; }; - "src/third_party/fp16/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/Maratyszcza/FP16.git" ; rev = "4dfe081cf6bcd15db339cf2680b9281b8451eeb3"; sha256 = "06a8dfl3a29r93nxpp6hpywsajz5d555n3sqd3i6krybb6swnvh7"; fetchSubmodules = true; }; - "src/third_party/freetype-testing/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/freetype/freetype2-testing.git" ; rev = "fe2eddae6176f75e2101289eeda22a5ff3d808ca"; sha256 = "1v6fxas665r8hvasqp6rrryh2scyp9ypbrmjq14lama60p94bmgc"; fetchSubmodules = true; }; - "src/third_party/freetype/src" = fetchgit { url = "https://chromium.googlesource.com/chromium/src/third_party/freetype2.git" ; rev = "034e5dbf92ea3a7ea7c9322e47a3a50ff23f7b55"; sha256 = "04z0fh7whs2gzpdfh1hndjg3ipmz1k48jcys01k45f1qhya6r8qn"; fetchSubmodules = true; }; - "src/third_party/gemmlowp/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/gemmlowp.git" ; rev = "13d57703abca3005d97b19df1f2db731607a7dc2"; sha256 = "0w4ap82b73kh49pw913905al6q6lfqbgp666c0mcv2k01krh771v"; fetchSubmodules = true; }; - "src/third_party/glfw/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/glfw/glfw.git" ; rev = "94773111300fee0453844a4c9407af7e880b4df8"; sha256 = "0q60nx877lc7grv2rfhja55zqvpvc6qdpr28hvs71dwyqy2q6225"; fetchSubmodules = true; }; - "src/third_party/google-truth" = fetchcipd { package = "chromium/third_party/google-truth"; version = "u8oovXxp24lStqX4d54htRovta-75Sy2w7ijg1TL07gC"; sha256 = "0h8jl92i2lx2mgr5swirkpyvrq6af5nk6hagd8sfl4scsx0wf78b"; }; - "src/third_party/googletest/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/googletest.git" ; rev = "ea55f1f52c489535f0d3b583c81529762c9cb5ea"; sha256 = "15v9qyga4l2l561ymip1qk4dn5qjxavvc0lx2x08ck2vwn010rjf"; fetchSubmodules = true; }; - "src/third_party/grpc/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/grpc/grpc.git" ; rev = "754913545189b819829284b79ac5a4d31fddbdcc"; sha256 = "09khmi69ds1w8syd6z0r2wlscgfn002fqmg7g9zha87bk7hs14jx"; fetchSubmodules = true; }; - "src/third_party/gvr-android-sdk/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/googlevr/gvr-android-sdk.git" ; rev = "233e7fe922a543e0bc55382d64cacd047307d0e7"; sha256 = "1f9aqraqdx58gsahy94hqfxq6nib0a5nq02rb5r6gzrz3pdfdlaz"; fetchSubmodules = true; }; - "src/third_party/hamcrest" = fetchcipd { package = "chromium/third_party/hamcrest"; version = "37eccfc658fe79695d6abb6dd497463c4372032f"; sha256 = "1yil3234fpgm27hrmnnxxvlrq3jv70fqgi365gfhvgq2cwgbjci2"; }; - "src/third_party/harfbuzz-ng/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git" ; rev = "0acf466c44143de2e9b9cc0375cb25ec67cb132f"; sha256 = "0053gzc7xfg11b0jxsm4lbw2h3bhja4f843wsvws64kz1kvqpg2n"; fetchSubmodules = true; }; - "src/third_party/highway/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/highway.git" ; rev = "424360251cdcfc314cfc528f53c872ecd63af0f0"; sha256 = "0w5y8qwnvqq78pgc11bg4a4ilraymv57b95pljf1cqxwd17wkp1y"; fetchSubmodules = true; }; - "src/third_party/hunspell_dictionaries" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries.git" ; rev = "18e09b9197a3b1d771c077c530d1a4ebad04c167"; sha256 = "0b5n1gf7z52gbf0p5xd4m30kaflz0myd2964v0rziki1nbczzpzy"; fetchSubmodules = true; }; - "src/third_party/icu" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/icu.git" ; rev = "e94822cd43d01722869c19053303a18e893ecd00"; sha256 = "1m8dwkb6g0hk9bm7xlqdnfjyly0gfn4q4p1isc8hh8adzarnkp90"; fetchSubmodules = true; }; - "src/third_party/icu4j" = fetchcipd { package = "chromium/third_party/icu4j"; version = "e87e5bed2b4935913ee26a3ebd0b723ee2344354"; sha256 = "04af162d1clvy532dpd623mnfhz92jsc3wl0zval375dxdyqn86b"; }; - "src/third_party/jacoco" = fetchcipd { package = "chromium/third_party/jacoco"; version = "O8mNUqIbFxvOcBsSNfbvpdUFvY4nfrPY0QA2kHoO2pQC"; sha256 = "1ynphf6gihdisn20gvfs1agnarnd5n7717hgh5zkfif2k0v0yk0w"; }; - "src/third_party/javalang/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/c2nes/javalang.git" ; rev = "0664afb7f4d40254312693f2e833c1ed4ac551c7"; sha256 = "1j799654grk7klixiijhih9v67qcxhzh3hjzqhqhfpgfnd26q0l9"; fetchSubmodules = true; }; - "src/third_party/jdk" = fetchcipd { package = "chromium/third_party/jdk"; version = "JhpgSvTpgVUkoKe56yQmYaR1jXNcY8NqlltA0mKIO4EC"; sha256 = "0ialfgppc1fyqar0i96fsjswp269lyvyvjnm9g97g3bl8q1i6w7c"; }; - "src/third_party/jdk/extras" = fetchcipd { package = "chromium/third_party/jdk/extras"; version = "-7m_pvgICYN60yQI3qmTj_8iKjtnT4NXicT0G_jJPqsC"; sha256 = "17ingjlj3f1kkhl9hglzi4qp4vfr2wxaa535yb7xdza2hsvw4l4y"; }; - "src/third_party/jsoncpp/source" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git" ; rev = "9059f5cad030ba11d37818847443a53918c327b1"; sha256 = "0qnx5y6c90fphl9mj9d20j2dfgy6s5yr5l0xnzid0vh71zrp6jwv"; fetchSubmodules = true; }; - "src/third_party/junit/src" = fetchgit { url = "https://chromium.googlesource.com/external/junit.git" ; rev = "64155f8a9babcfcf4263cf4d08253a1556e75481"; sha256 = "1j8avi91px1z8rjc89cfikwrvfifdmmsarwiyrcnr59ynvpz0v8h"; fetchSubmodules = true; }; - "src/third_party/leveldatabase/src" = fetchgit { url = "https://chromium.googlesource.com/external/leveldb.git" ; rev = "1b51a3a96821e5fd5175288724c95c1bde57b2f0"; sha256 = "0hwxsm29dn0nyz0x684c1hapz9mf5z3j2ha2420qmdqkr6nvyazy"; fetchSubmodules = true; }; - "src/third_party/libFuzzer/src" = fetchgit { url = "https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git" ; rev = "debe7d2d1982e540fbd6bd78604bf001753f9e74"; sha256 = "0akak4x2njl2wxagiwbp30vms53k45jgy2kmfqhvx7lh28gclv8w"; fetchSubmodules = true; }; - "src/third_party/libaddressinput/src" = fetchgit { url = "https://chromium.googlesource.com/external/libaddressinput.git" ; rev = "3b8ee157a8f3536bbf5ad2448e9e3370463c1e40"; sha256 = "05d2a78fm85wbgxl1vg9rzifsspm7l3ypqgzp3csr5kmas1k9w9w"; fetchSubmodules = true; }; - "src/third_party/libaom/source/libaom" = fetchgit { url = "https://aomedia.googlesource.com/aom.git" ; rev = "a08d3f6c329a25744712578a70715e5cfd749759"; sha256 = "1xhch215finbrvi55qazr0nm2vngsll4hpi9s245asq9zfrg9lnn"; fetchSubmodules = true; }; - "src/third_party/libavif/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/AOMediaCodec/libavif.git" ; rev = "7a6d13be831da40859c6b61fb513b7a7a654a58b"; sha256 = "0g5zls6lp3p72d1c9xdrys0m454aisdnb7vcr500v3h5fqs6xj74"; fetchSubmodules = true; }; - "src/third_party/libdrm/src" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/third_party/libdrm.git" ; rev = "0190f49a139e7069d7cad6a6890832831da1aa8b"; sha256 = "1xr641kl61y1b7p71wrrjd6wsv5vcn2ilir8vg6ixwyfg9v6caim"; fetchSubmodules = true; }; - "src/third_party/libgav1/src" = fetchgit { url = "https://chromium.googlesource.com/codecs/libgav1.git" ; rev = "58d08dbd45a3ee707e76f32a9c04d770c3d22e38"; sha256 = "1jm4mydfaqnsq9wwd309hkv8qml33fgj0x3073hl9rl9f2mq3rfv"; fetchSubmodules = true; }; - "src/third_party/libgifcodec" = fetchgit { url = "https://skia.googlesource.com/libgifcodec" ; rev = "d06d2a6d42baf6c0c91cacc28df2542a911d05fe"; sha256 = "08mw637m0w6n9nga1mg06l1i3shszidp95d16rvaind35kk5gvci"; fetchSubmodules = true; }; - "src/third_party/libipp/libipp" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/platform2/libipp.git" ; rev = "6c45a4f3a05cb5dd700414fe4d94cf685159d3ce"; sha256 = "079yzvpjqmjkc135ywn4nmqiwvmw6i01cs6f46l2hbzrx65xfhhv"; fetchSubmodules = true; }; - "src/third_party/libjpeg_turbo" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git" ; rev = "02959c3ee17abacfd1339ec22ea93301292ffd56"; sha256 = "02fbqbxmslirx8sc7icsrixn12wxwac4d9i9v5hn2py225b83r3j"; fetchSubmodules = true; }; - "src/third_party/libjxl/src" = fetchgit { url = "https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git" ; rev = "a205468bc5d3a353fb15dae2398a101dff52f2d3"; sha256 = "17pvc5zgm9az5hfg2p80325f42w3dqspyb03iakrwg9x4n3vjckx"; fetchSubmodules = true; }; - "src/third_party/liblouis/src" = fetchgit { url = "https://chromium.googlesource.com/external/liblouis-github.git" ; rev = "10f66b2735b7d1e3e44d98f6dedbb859d197ea57"; sha256 = "0p1hs8aqgkv7xk2a81bv5a34vsascw4fcii4gihmgknfyilzxq5y"; fetchSubmodules = true; }; - "src/third_party/libphonenumber/dist" = fetchgit { url = "https://chromium.googlesource.com/external/libphonenumber.git" ; rev = "68eba9d6ee8b11fb58ece36b6c46d07965d7f7ff"; sha256 = "0xzl2pjiykspr4y0xrk6vpq4vkazk46m9hpjv2qap4zp8j6lfs9y"; fetchSubmodules = true; }; - "src/third_party/libprotobuf-mutator/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/libprotobuf-mutator.git" ; rev = "8942a9ba43d8bb196230c321d46d6a137957a719"; sha256 = "0wp2xj242vlj8w6vrvfn86l4jds5y4n9mpc8fjc1mzzgmpmjk1vw"; fetchSubmodules = true; }; - "src/third_party/libsrtp" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/libsrtp.git" ; rev = "5b7c744eb8310250ccc534f3f86a2015b3887a0a"; sha256 = "0dsd1kspi3gc4pnlm6q2k43czpsvk0v2jhcwclsgi4s6ca3wbwm5"; fetchSubmodules = true; }; - "src/third_party/libsync/src" = fetchgit { url = "https://chromium.googlesource.com/aosp/platform/system/core/libsync.git" ; rev = "f4f4387b6bf2387efbcfd1453af4892e8982faf6"; sha256 = "0qfz971xlqhbzjihbhc50bqys0x1kwjcc6q65xc785zia85plj9j"; fetchSubmodules = true; }; - "src/third_party/libunwindstack" = fetchgit { url = "https://chromium.googlesource.com/chromium/src/third_party/libunwindstack.git" ; rev = "6868358481bb1e5e20d155c1084dc436c88b5e6b"; sha256 = "0v861x7hfllzrlgzvw2sd3l8na0y49jx9y0w5v8zcdig40bk55v0"; fetchSubmodules = true; }; - "src/third_party/libvpx/source/libvpx" = fetchgit { url = "https://chromium.googlesource.com/webm/libvpx.git" ; rev = "df0d06de6d3b64e35b9e75ad72c571af061bc7b3"; sha256 = "0sxz7azry3a6s3207vmpmp3fyfa5k6ppb5ps9980dwic88mxz7r9"; fetchSubmodules = true; }; - "src/third_party/libwebm/source" = fetchgit { url = "https://chromium.googlesource.com/webm/libwebm.git" ; rev = "e4fbea0c9751ae8aa86629b197a28d8276a2b0da"; sha256 = "0jkhwdgvvyqx5gsk5jyvg8x625i2ljyjqkhyhpfkrl4xjy86gzmv"; fetchSubmodules = true; }; - "src/third_party/libyuv" = fetchgit { url = "https://chromium.googlesource.com/libyuv/libyuv.git" ; rev = "b4ddbaf549a1bf5572bf703fd2862d1eb7380c6a"; sha256 = "010h371w1nvzsbz1anszf8q1mxjb2j8di5ak64mjiri5iz7s4ym3"; fetchSubmodules = true; }; - "src/third_party/lss" = fetchgit { url = "https://chromium.googlesource.com/linux-syscall-support.git" ; rev = "92a65a8f5d705d1928874420c8d0d15bde8c89e5"; sha256 = "0f8fwk5ggacdzb0qxnclj0vwd5xgi4bwlp8hwarfklfsmi19pvhc"; fetchSubmodules = true; }; - "src/third_party/minigbm/src" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/platform/minigbm.git" ; rev = "2e63aaf616cdda26019d265989bd0d96ee11aab9"; sha256 = "0i6mirig0sjx5bwmazina8czfi8dxr02fj2palf13zpq1g50cbmp"; fetchSubmodules = true; }; - "src/third_party/minizip/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/nmoinvaz/minizip" ; rev = "1ff40343b55e738d941abb51c70eddb803db16e2"; sha256 = "1z27h19qmslzvzn9d0cdb8p11yaqph6ryija1vd6drjnk6h4crvh"; fetchSubmodules = true; }; - "src/third_party/mockito/src" = fetchgit { url = "https://chromium.googlesource.com/external/mockito/mockito.git" ; rev = "04a2a289a4222f80ad20717c25144981210d2eac"; sha256 = "10g549zf4yygni0lkpqjzpwwb8z42h2dpfa4c2zagjk9bzi54gia"; fetchSubmodules = true; }; - "src/third_party/nasm" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/nasm.git" ; rev = "9215e8e1d0fe474ffd3e16c1a07a0f97089e6224"; sha256 = "0132nfd3d4l3z8245iff8qnralhm2inbljrc605910jg5jvd9d6s"; fetchSubmodules = true; }; - "src/third_party/nearby/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/nearby-connections.git" ; rev = "ae0337db3bac9b104a2b585be7312615bcc66262"; sha256 = "09kyrpwrpl90c88xyid7j7k1fgrdmiwka0wk541vr6d14rfb7afm"; fetchSubmodules = true; }; - "src/third_party/neon_2_sse/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/intel/ARM_NEON_2_x86_SSE.git" ; rev = "8dbe2461c89760ac4b204aa0eafb72413a97957d"; sha256 = "09bfcbkjsgn3r9ann8ayf65xqgycy3g5mrj9fnn70sfj10cmahvm"; fetchSubmodules = true; }; - "src/third_party/netty-tcnative/src" = fetchgit { url = "https://chromium.googlesource.com/external/netty-tcnative.git" ; rev = "7eeb50be90c9ba0f6afa3375132df63942a0f32d"; sha256 = "19qh20pc61l379l25a768ym7r92s9qk52f2z77zf0j5bcharf6sq"; fetchSubmodules = true; }; - "src/third_party/netty4/src" = fetchgit { url = "https://chromium.googlesource.com/external/netty4.git" ; rev = "cc4420b13bb4eeea5b1cf4f93b2755644cd3b120"; sha256 = "167d3474ax7kzplnkkfl4pxsz90diw5fwg3ks5xwnqplvj6ipl6x"; fetchSubmodules = true; }; - "src/third_party/objenesis" = fetchcipd { package = "chromium/third_party/objenesis"; version = "tknDblENYi8IaJYyD6tUahUyHYZlzJ_Y74_QZSz4DpIC"; sha256 = "0qrkagpvybz1zz9w7ik05y7p48kd822228w7fn1xvnxgl1d8fjy5"; }; - "src/third_party/openh264/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/cisco/openh264" ; rev = "b52786888ddce9d6bc06b7825ba9bffc65924e0c"; sha256 = "046b6fhsr65s3qnhmkik48cb56c6s1arwgp4980dlc280f529vv4"; fetchSubmodules = true; }; - "src/third_party/openscreen/src" = fetchgit { url = "https://chromium.googlesource.com/openscreen" ; rev = "0f4d256a3e5588144a81a848cdd5cf314dc52868"; sha256 = "19g977cfmjs457i9fpq69csxdqh0gxrd63y9ld7417b9zciwzqw7"; fetchSubmodules = true; }; - "src/third_party/openscreen/src/third_party/tinycbor/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/intel/tinycbor.git" ; rev = "fc42a049853b802e45f49588f8148fc29d7b4d9c"; sha256 = "1iaq7l11bfs3qlwbf4l19lvpycf5zrrkbz3s1jlh10fs0v26wz1m"; fetchSubmodules = true; }; - "src/third_party/ots/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/khaledhosny/ots.git" ; rev = "ee537ac096667eed6559124164c3e8482646fd77"; sha256 = "0yg7g2ial5yb1i6d7jj9v77z81383qiwsdy1dd0bzrfncbfyp65s"; fetchSubmodules = true; }; - "src/third_party/pdfium" = fetchgit { url = "https://pdfium.googlesource.com/pdfium.git" ; rev = "2fcb5025f65abf3f9446b3935ac3186a59a7dc90"; sha256 = "1bbwjnzajzynms7kxy37gn2qhkyyc6wf7s9f8qbkl0n2cz7miqx6"; fetchSubmodules = true; }; - "src/third_party/perfetto" = fetchgit { url = "https://android.googlesource.com/platform/external/perfetto.git" ; rev = "dfc6cffca9b6a34068386915d50040c6bc142717"; sha256 = "0cpmhvwx6wb9g36bs6yfryckin6khfs3s5hpkj82v3y2fpgh6shk"; fetchSubmodules = true; }; - "src/third_party/proguard" = fetchcipd { package = "chromium/third_party/proguard"; version = "Fd91BJFVlmiO6c46YMTsdy7n2f5Sk2hVVGlzPLvqZPsC"; sha256 = "07swiphqrkaz4j0mfmfyzabfwwm1rny3fcc1hdrqyaz15ai84svl"; }; - "src/third_party/pyelftools" = fetchgit { url = "https://chromium.googlesource.com/chromiumos/third_party/pyelftools.git" ; rev = "19b3e610c86fcadb837d252c794cb5e8008826ae"; sha256 = "07hl6dpa35xixfdh55d20a2b1x9yghfr6f7bj7hgyz1gh7ffkzi3"; fetchSubmodules = true; }; - "src/third_party/pywebsocket3/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/pywebsocket3.git" ; rev = "50602a14f1b6da17e0b619833a13addc6ea78bc2"; sha256 = "1145dll9wvshjlaki3bs4r2v0mzwzg023gzxgyfblz7vdyxsljjq"; fetchSubmodules = true; }; - "src/third_party/quic_trace/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/quic-trace.git" ; rev = "413c3a4a641c014193eabb8d282c2348ccec3c5b"; sha256 = "1sii5a599q22xqbqsb77rv2xyrfixz76p99xi7is7ysk4iid1r7x"; fetchSubmodules = true; }; - "src/third_party/r8" = fetchcipd { package = "chromium/third_party/r8"; version = "cEv1yyfxfmP_MaZrG22cR7YPc7hehgHAZd82lRx0DFAC"; sha256 = "1a9jbc5nmq7db66f67zlvx5gd54fcjhfsm0yhysp3ll2cslfj64y"; }; - "src/third_party/re2/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/re2.git" ; rev = "885eb38accf49e2ccdd2fa6786f3590cf40a3e23"; sha256 = "1gzdqy5a0ln9rwd8kmwbgis6qin63hapicwb35xkbnj3y84jj6yx"; fetchSubmodules = true; }; - "src/third_party/requests/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/kennethreitz/requests.git" ; rev = "c7e0fc087ceeadb8b4c84a0953a422c474093d6d"; sha256 = "18dds0ifjhjy5x8mra2fspvc1b7xvzr4dk798igbvkwg9vkdzn1i"; fetchSubmodules = true; }; - "src/third_party/robolectric" = fetchcipd { package = "chromium/third_party/robolectric"; version = "Kdd6dNFAKqj9g9Bsfo2z1zQr52Vk60EL_wb9Bf2c8rcC"; sha256 = "0502qqysagn02ig0cajizhzklmvrx91bc8i22hmf6jfi28sxcl4z"; }; - "src/third_party/rust/serde_jsonrc/v0_1/crate" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/serde-rs/json" ; rev = "ca5782632fc8dc3f9cf2f22055b87f910cad761f"; sha256 = "115f7v26jn7njja5x80a801i75xpx1374zkrc8r84j65ig9yk4sb"; fetchSubmodules = true; }; - "src/third_party/ruy/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/ruy.git" ; rev = "7ef39c5745a61f43071e699c6a96da41701ae59f"; sha256 = "1g7p1ykd6jbx5i25h1c0crgifcbr3azpm7c5l2fil38ba1ccd4sd"; fetchSubmodules = true; }; - "src/third_party/securemessage/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/securemessage.git" ; rev = "fa07beb12babc3b25e0c5b1f38c16aa8cb6b8f84"; sha256 = "0d1rq8mg4bj5kh9jg7lgfv3kqpnn8kdvm5rckgd8jmqihl2hcs8c"; fetchSubmodules = true; }; - "src/third_party/shaderc/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/shaderc.git" ; rev = "96b1dd72a827304817470274a470c4d3b2293451"; sha256 = "1ax5wy04g9ca8c4533zdvjd9zrp5mzx0471s0rx71ipkq02pxi4c"; fetchSubmodules = true; }; - "src/third_party/skia" = fetchgit { url = "https://skia.googlesource.com/skia.git" ; rev = "b524f580859d367e51591d8b5c16485d022844cb"; sha256 = "09j8jvl0j34iacb0p7a0z5frgn2zcfwk1fh26g79ll73d3h2dlbi"; fetchSubmodules = true; }; - "src/third_party/smhasher/src" = fetchgit { url = "https://chromium.googlesource.com/external/smhasher.git" ; rev = "e87738e57558e0ec472b2fc3a643b838e5b6e88f"; sha256 = "0b4yxi80kixp0dr51q3a80ia2nv70spp1mhsbl31rwmlczzby827"; fetchSubmodules = true; }; - "src/third_party/snappy/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/snappy.git" ; rev = "65dc7b383985eb4f63cd3e752136db8d9b4be8c0"; sha256 = "0jvl9m9f7syl8jscf9mkfmj0d5zsq150mzrnscvw9q6685rfnhm1"; fetchSubmodules = true; }; - "src/third_party/sqlite/src" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/sqlite.git" ; rev = "9ccd3058ec6dcfa5b0ebd2edb3e88c9b97813025"; sha256 = "12swdcjvacds81hfixpvkbg99lz2rvdyfw7v2gdcyfy1y2b3yna4"; fetchSubmodules = true; }; - "src/third_party/sqlite4java" = fetchcipd { package = "chromium/third_party/sqlite4java"; version = "LofjKH9dgXIAJhRYCPQlMFywSwxYimrfDeBmaHc-Z5EC"; sha256 = "1bckirpb79bknwnksjsybwcm7dc3ngmb5xslfglndjxrjfsw96k1"; }; - "src/third_party/swiftshader" = fetchgit { url = "https://swiftshader.googlesource.com/SwiftShader.git" ; rev = "043a8084c1cb680b30a46e8a316042f6bb9028ec"; sha256 = "1mg3qwvwlac6p5ja6435l92w61clrja8zghhc8snzlj577j5svly"; fetchSubmodules = false; }; - "src/third_party/tflite/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/tensorflow/tensorflow.git" ; rev = "767b2cf99f1ebe27f9e61b672a48ddbb2142bfed"; sha256 = "1lk2fr1a4ld6bcnrx9j50b8aw7iazvcgmpahmw34v3nndap2c2v6"; fetchSubmodules = true; }; - "src/third_party/turbine" = fetchcipd { package = "chromium/third_party/turbine"; version = "VhmfIPuSDHHeilnA7WC0MhR9ShZNF25tA0Te4RYIZG8C"; sha256 = "104jhsyjgkrx6z20wz3invdcpbryr9fqxigwi3dbqafxg9v51pg8"; }; - "src/third_party/ub-uiautomator/lib" = fetchgit { url = "https://chromium.googlesource.com/chromium/third_party/ub-uiautomator.git" ; rev = "00270549ce3161ae72ceb24712618ea28b4f9434"; sha256 = "08axh1pbssh3l4hgw5sllp96jaxrx8hbv9n69q695irdbrpbnr6b"; fetchSubmodules = true; }; - "src/third_party/ukey2/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/google/ukey2.git" ; rev = "0275885d8e6038c39b8a8ca55e75d1d4d1727f47"; sha256 = "01z3ab54khwmbg52pcfvqlclsdd00pzi8mcalq5px1lnhcz6vp4d"; fetchSubmodules = true; }; - "src/third_party/usrsctp/usrsctplib" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/sctplab/usrsctp" ; rev = "62d7d0c928c9a040dce96aa2f16c00e7e67d59cb"; sha256 = "0sy1ifbm56s0c31pw30fpcfngkr4dv11yysmwhzwax914d9kh4yn"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps" = fetchgit { url = "https://chromium.googlesource.com/vulkan-deps" ; rev = "5fe1b21d6ba47a8dee59068d6927a4c157ec13a3"; sha256 = "07hsqz35jpd5wpjis5w6n51ahlnp5isj7lmbj566azxk8dm8rb6j"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/glslang/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang" ; rev = "90d4bd05cd77ef5782a6779a0fe3d084440dc80d"; sha256 = "153msf42wmj9y4vmnh6wkgh0is227vscq0n8c0bbgq7zv8cggbkk"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/spirv-cross/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross" ; rev = "64e058aa9b0c7a0d1cbc645b4496ddf4cdbca00d"; sha256 = "0xfw6icp9a505kswh2wqdlmjqp2jr3scjwkqnj1wmkbgxzfnc3ib"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/spirv-headers/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers" ; rev = "6a55fade62dec6a406a5a721148f88a2211cbefa"; sha256 = "06jwrp8ncs7j0mqv95bm7gk5f674ycd0axx9632zciha592yq9m6"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/spirv-tools/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools" ; rev = "d18d0d92e55f44da6af0dc87fb0e3c8034e9a3ac"; sha256 = "1f8vc53858fidd60ka9c3jqnkqn6zd1si6bdkx7gvp36d0p6sar4"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/vulkan-headers/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers" ; rev = "b32da5329b50e3cb96229aaecba9ded032fe29cc"; sha256 = "0n7ffbwwdrpbzgijsmw56qz0jpl9ib8xib8bqmbkfqpn1zk5zsvs"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/vulkan-loader/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader" ; rev = "edb793cf31480ae71f7462e8ae2bf13188143682"; sha256 = "14mghmqikbigjwd08myry8f8hxawiphq7010pp3dcbs1pi5pr1aj"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/vulkan-tools/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools" ; rev = "5f9e5f14e572a6c9f7ff4d54e2fd4d82632bc393"; sha256 = "0b4i4amnbsfwz2ir8jsy89nhszcka4w9ycjnnlycwqdz9lqiihmw"; fetchSubmodules = true; }; - "src/third_party/vulkan-deps/vulkan-validation-layers/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers" ; rev = "0b8873487d46fbcc7cafa917824a867151160933"; sha256 = "1b67xhd94wbfwsa9f4g8xxi2mkn3r0w1gjh66mzdb318vj7ai16c"; fetchSubmodules = true; }; - "src/third_party/vulkan_memory_allocator" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git" ; rev = "ebe84bec02c041d28f902da0214bf442743fc907"; sha256 = "1hclk1jm0d3sgfqbha4lzwk39dfi3dx1cgyg9h74105zfqy6w15c"; fetchSubmodules = true; }; - "src/third_party/wayland-protocols/gtk" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/GNOME/gtk.git" ; rev = "40ebed3a03aef096addc0af09fec4ec529d882a0"; sha256 = "091ffkv5m46zgjklr4mpnsc3ykfnzbj4yin45isvpr05p6fcv5gg"; fetchSubmodules = true; }; - "src/third_party/wayland-protocols/kde" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/KDE/plasma-wayland-protocols.git" ; rev = "0b07950714b3a36c9b9f71fc025fc7783e82926e"; sha256 = "0rip7fvx3xg5s975dcw47pvwrmv0fi53xrpkqk6lxzmcd7zjjrqf"; fetchSubmodules = true; }; - "src/third_party/wayland-protocols/src" = fetchgit { url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git" ; rev = "177ff9119da526462e5d35fbfde6c84794913787"; sha256 = "1n3skg63lqpx35rarwdklcjyh5pd3fbjwk68lw30i9v554fk9xsn"; fetchSubmodules = true; }; - "src/third_party/wayland/src" = fetchgit { url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland.git" ; rev = "e60398b1755bfcdf09f040d3769131fe0d9762fc"; sha256 = "014zl3kp3gy2s8nmfp8vqy02fgpgqvajg8c9gxk6g4z460c8rbkj"; fetchSubmodules = true; }; - "src/third_party/webdriver/pylib" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/SeleniumHQ/selenium/py.git" ; rev = "d0045ec570c1a77612db35d1e92f05e1d27b4d53"; sha256 = "0grjcv25ajbf8zbhp8s1qajba980aspz52pzicfnk4csmpamcwkw"; fetchSubmodules = true; }; - "src/third_party/webgl/src" = fetchgit { url = "https://chromium.googlesource.com/external/khronosgroup/webgl.git" ; rev = "cf04aebdf9b53bb2853f22a81465688daf879ec6"; sha256 = "043hy7sg6g0pdln83rr5phq7gqjb3586b3jcbqam2xpm5p102zmh"; fetchSubmodules = true; }; - "src/third_party/webgpu-cts/src" = fetchgit { url = "https://chromium.googlesource.com/external/github.com/gpuweb/cts.git" ; rev = "bcac299eb80e8314ba22b8f012a31138b0686324"; sha256 = "1q7jwg1n6iyk2n0ff9v93rgjm7rvr6hysw45lx9kjayr41s28c66"; fetchSubmodules = true; }; - "src/third_party/webpagereplay" = fetchcipd { package = "infra/tools/wpr/linux_x86_64"; version = "y28SfbEF6nHSkZ1eHysM1t711zpOCmtk7jUdxZB-QSMC"; sha256 = "00i5c4wiwvap5faphfb672l86kdynn191qk1vhmv853rf0lka5c3"; }; - "src/third_party/webrtc" = fetchgit { url = "https://webrtc.googlesource.com/src.git" ; rev = "ffd9187dc0d9211ad52173bf0daa5001ca7d45ee"; sha256 = "18naav5a294mb56dd8xzz1ms98jid0gqza6swbgbc56575a2cib5"; fetchSubmodules = true; }; - "src/third_party/weston/src" = fetchgit { url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/weston.git" ; rev = "420cfd00f2de91de74bd9d4d8348e43c582d29f0"; sha256 = "0ib9c6dlnmbj3gngllsvi0kax2ql678nz26lq9ynjmiwhfh7ma8h"; fetchSubmodules = true; }; - "src/third_party/wuffs/src" = fetchgit { url = "https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git" ; rev = "ebbecaa2fb439eff0aeedafadb4c2a984446dee8"; sha256 = "184878r794iz30cib90bg95b3pa31sm9mqnm3mpilkfhmync54mc"; fetchSubmodules = true; }; - "src/third_party/xdg-utils" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/xdg-utils.git" ; rev = "d80274d5869b17b8c9067a1022e4416ee7ed5e0d"; sha256 = "0i72hw0lb4xjg1xh0bax6s5x5hjc3n0lmwzck4q04h94k7s9ayxp"; fetchSubmodules = true; }; - "src/tools/page_cycler/acid3" = fetchgit { url = "https://chromium.googlesource.com/chromium/deps/acid3.git" ; rev = "6be0a66a1ebd7ebc5abc1b2f405a945f6d871521"; sha256 = "0dmkrbhb4kb7vk33i3zc0kv9ihbkxwy4cfvaw5fnfx9zp77jgdpv"; fetchSubmodules = true; }; - "src/tools/resultdb" = fetchcipd { package = "infra/tools/result_adapter/${platform}"; version = "git_revision:735a8a662d3874d8b1d795a40e46ea0f57b52758"; sha256 = "1vbdwhn2wq8did768g3nijvrry6i6y2y1r00ww94n4phbydyk055"; }; - "src/tools/skia_goldctl/linux" = fetchcipd { package = "skia/tools/goldctl/linux-amd64"; version = "njGzzVyYPSA__3tShsGxsvh8k5kJfL9V0wvLthXSUV4C"; sha256 = "00b32xyxlcqa8hpa66djjlsql4jc3npcirh10n4wbgzd0wm07wl8"; }; - "src/v8" = fetchgit { url = "https://chromium.googlesource.com/v8/v8.git" ; rev = "b2490f598d9debd563bc32191cb3f777a16cbbb0"; sha256 = "0j7i9p4fijb6r5ma4g55hv7qa3wld3yxwaldpj284xvan7jdj3p0"; fetchSubmodules = true; }; + fetchgit, + fetchcipd, + fetchurl, + runCommand, + symlinkJoin, + platform, +}: +{ + "src" = fetchgit { + url = "https://chromium.googlesource.com/chromium/src.git"; + rev = "1a90e060fd3231f69f387dd2ac33b4e3eeb0e3e3"; + sha256 = "11nc6d2y29hpmxb619847n6kh4gciw6jl96d929j3jfcnnbvq9v1"; + fetchSubmodules = true; + }; + "src/android_webview/tools/cts_archive" = fetchcipd { + package = "chromium/android_webview/tools/cts_archive"; + version = "ai8Ig4HlO0vG6aP_JP2uhyruE2yPzze8PFP1g8Z4_hgC"; + sha256 = "0lxgxd75lqsk7jpgx5gmkskmkz22mvmzrh82l3dh0z53b0ibb14v"; + }; + "src/buildtools/clang_format/script" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git"; + rev = "e435ad79c17b1888b34df88d6a30a094936e3836"; + sha256 = "0ifdbxg283v2zz5s6iy9b2iyynrzbzbsifpc5m90dq48743vb963"; + fetchSubmodules = true; + }; + "src/buildtools/linux64" = fetchcipd { + package = "gn/gn/linux-amd64"; + version = "git_revision:0725d7827575b239594fbc8fd5192873a1d62f44"; + sha256 = "1y8csayrd9653fwyzw07l29i1dmb5jvwzrygks3ayh1d1yqbq36p"; + }; + "src/buildtools/third_party/libc++/trunk" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git"; + rev = "79a2e924d96e2fc1e4b937c42efd08898fa472d7"; + sha256 = "1k00bcyh3061k0cy0z7b03kiimfjxksmnyfk6vxhfl4kqhn3wx4z"; + fetchSubmodules = true; + }; + "src/buildtools/third_party/libc++abi/trunk" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git"; + rev = "738dc100c61890744f9e78cac27c71d0a2190781"; + sha256 = "0k8nnjr3n7h0vzjzc02y2jhlamak49brliq8nzxcdl8z2dmj7kxh"; + fetchSubmodules = true; + }; + "src/buildtools/third_party/libunwind/trunk" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git"; + rev = "75396220433652a698b05c5fb648fe1f5e1d7a27"; + sha256 = "04cqsbypd66n3jhnq2kmdvhkz46vr8fv8lsyf5g7ygkqjkd98x9a"; + fetchSubmodules = true; + }; + "src/chrome/test/data/perf/canvas_bench" = fetchgit { + url = "https://chromium.googlesource.com/chromium/canvas_bench.git"; + rev = "a7b40ea5ae0239517d78845a5fc9b12976bfc732"; + sha256 = "0cs215p1353dfp0s8x33jhz7ih0fh9ajwwax6d5q15la274axwxj"; + fetchSubmodules = true; + }; + "src/chrome/test/data/perf/frame_rate/content" = fetchgit { + url = "https://chromium.googlesource.com/chromium/frame_rate/content.git"; + rev = "c10272c88463efeef6bb19c9ec07c42bc8fe22b9"; + sha256 = "0yi9xc0qihr1pw9fllsy9x9p19211p534qn7j70l7bply6x1r2dp"; + fetchSubmodules = true; + }; + "src/chrome/test/data/xr/webvr_info" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/toji/webvr.info.git"; + rev = "c58ae99b9ff9e2aa4c524633519570bf33536248"; + sha256 = "1s7131k4m20cpmsb0jhmz1sqmnhld8n8fsirs7i6l498rv0hzh06"; + fetchSubmodules = true; + }; + "src/docs/website" = fetchgit { + url = "https://chromium.googlesource.com/website.git"; + rev = "66779576a0d84e821a11e288acc94859fdcbe0bd"; + sha256 = "106qw68w6ndwj1hl4zf7rzffnqx826cqg3l281vcd054pvb90xpd"; + fetchSubmodules = true; + }; + "src/media/cdm/api" = fetchgit { + url = "https://chromium.googlesource.com/chromium/cdm.git"; + rev = "fc5afac6847dc61addc1177103aa602e71a9ecac"; + sha256 = "0yai4nk0p4qkbn61sjs2g6yapraqbzy0amkw1wrdqb7rajhn0aqi"; + fetchSubmodules = true; + }; + "src/native_client" = fetchgit { + url = "https://chromium.googlesource.com/native_client/src/native_client.git"; + rev = "7adc7525b68ffb888135f9541bde1b1f62ca5b70"; + sha256 = "0sanjp8yh1ffnd4kcj4b3l9jxigjg7c712aa9061f17skxi6bm5b"; + fetchSubmodules = true; + }; + "src/net/third_party/quiche/src" = fetchgit { + url = "https://quiche.googlesource.com/quiche.git"; + rev = "a778d65990c3be7b6eafac08d14c345d1090eec2"; + sha256 = "0man8pykmb65vln41z6s0wfvn2bw5pr55il3lpr0v5p21dpgj6zr"; + fetchSubmodules = true; + }; + "src/third_party/accessibility_test_framework" = fetchcipd { + package = "chromium/third_party/accessibility-test-framework"; + version = "b5ec1e56e58e56bc1a0c77d43111c37f9b512c8a"; + sha256 = "0q4bb1nylbaals9b9qrd5c0f62nlyr2np0g6i8fbvawwrbr7qxrm"; + }; + "src/third_party/android_build_tools/aapt2" = fetchcipd { + package = "chromium/third_party/android_build_tools/aapt2"; + version = "yQIf5Ev_-q9u6Pr_a0APd1dHcImJSmotVADw4Pj151QC"; + sha256 = "1i7c9yiwlgrqg6ca85k1m39dcakvqr5fqlh2vs8x11rx70bzykka"; + }; + "src/third_party/android_build_tools/art" = fetchcipd { + package = "chromium/third_party/android_build_tools/art"; + version = "87169fbc701d244c311e6aa8843591a7f1710bc0"; + sha256 = "0p6yn4rzavyd16krq29wnbw97fmak4qd47zmk7d3wq0jbzjqj18m"; + }; + "src/third_party/android_build_tools/bundletool" = fetchcipd { + package = "chromium/third_party/android_build_tools/bundletool"; + version = "2ZcLVDxyRwp8FzpeYLtLT0TfSRweZxvwh1-Kx1jZ_FoC"; + sha256 = "0b39ygw9qk4bv7q20j378q1xmx0xdcgqsd6xfvc1vka6avwlb5nr"; + }; + "src/third_party/android_deps/libs/android_arch_core_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_core_common"; + version = "version:2@1.1.1.cr0"; + sha256 = "183y5pijhr2dypkm1dfy5yc88p477razlq73kzd72c0gz5z6kwpy"; + }; + "src/third_party/android_deps/libs/android_arch_core_runtime" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_core_runtime"; + version = "version:2@1.1.1.cr0"; + sha256 = "0g0akycdbr9chy0gswpklwzw8m6cpb7242vnnvpzqfhjdcjg5fba"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_common"; + version = "version:2@1.1.1.cr0"; + sha256 = "0x3mdil15ld7rlm0n0x53fsz81dc7vx1pccwz7klb4zdl9w3mxbr"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_common_java8" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_common_java8"; + version = "version:2@1.1.1.cr0"; + sha256 = "0b464w5argc8sajrwqnzizhh0chi9vl1vbnrc76rxifjg2ym6fgh"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_livedata" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata"; + version = "version:2@1.1.1.cr0"; + sha256 = "18bf42hfbdjhi7f0lx8zvsn3372m69j5xdjrwgas26a32dg7n5yj"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_livedata_core" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata_core"; + version = "version:2@1.1.1.cr0"; + sha256 = "1wws684w3qwyhp715ia78pvk16w3jaj40a3vvbndnzfcglyrg2a8"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_runtime" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_runtime"; + version = "version:2@1.1.1.cr0"; + sha256 = "1d4kr0js2xxcy0bgjwnz0sacwrq9b2knmdkysh0130vp0fv9i44v"; + }; + "src/third_party/android_deps/libs/android_arch_lifecycle_viewmodel" = fetchcipd { + package = "chromium/third_party/android_deps/libs/android_arch_lifecycle_viewmodel"; + version = "version:2@1.1.1.cr0"; + sha256 = "1fs0w8nk9rnjv7rvc70111sqdvp9579c63phv61j978wkfq349cy"; + }; + "src/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent" = fetchcipd { + package = "chromium/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent"; + version = "version:2@3.1.cr0"; + sha256 = "1k4z2zgc07bk0pnckbc7m5xph71vn4zkrl95jnzw8xwk46qbli7n"; + }; + "src/third_party/android_deps/libs/classworlds_classworlds" = fetchcipd { + package = "chromium/third_party/android_deps/libs/classworlds_classworlds"; + version = "version:2@1.1-alpha-2.cr0"; + sha256 = "1y5p5m7wykp1rc6dz700jqjbqkwzrv4zjdapfnja9cxmgwdwvlgr"; + }; + "src/third_party/android_deps/libs/com_android_support_animated_vector_drawable" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_animated_vector_drawable"; + version = "version:2@28.0.0.cr0"; + sha256 = "1xmq1l0ms4i3f1lsrman1ans7z2cfjaw5bxd02g9jzq7ar0g07k6"; + }; + "src/third_party/android_deps/libs/com_android_support_appcompat_v7" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_appcompat_v7"; + version = "version:2@28.0.0.cr0"; + sha256 = "1xka020529x68sx2jmfl5vmrdr8k1k97dk4k6p2nkf80gsd9kswi"; + }; + "src/third_party/android_deps/libs/com_android_support_asynclayoutinflater" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_asynclayoutinflater"; + version = "version:2@28.0.0.cr0"; + sha256 = "1dk1gwvph89mbgaj1hmfiqyndgjhgb9vqsaqz48lqvq8a8mj9whd"; + }; + "src/third_party/android_deps/libs/com_android_support_cardview_v7" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_cardview_v7"; + version = "version:2@28.0.0.cr0"; + sha256 = "0xynb0mssa0zyiy34lxjsvymg5zrfxqg5rfv254ibm531ar0s7c9"; + }; + "src/third_party/android_deps/libs/com_android_support_collections" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_collections"; + version = "version:2@28.0.0.cr0"; + sha256 = "0gy8gnin8hljn4shmxfj6k4ahmwpx5m9lsz2630m63zqiplvhmls"; + }; + "src/third_party/android_deps/libs/com_android_support_coordinatorlayout" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_coordinatorlayout"; + version = "version:2@28.0.0.cr0"; + sha256 = "047fi1kh08gkkcv1kcqizjq7qn9xcc5rgs6l33ypckrm9xlpf6w7"; + }; + "src/third_party/android_deps/libs/com_android_support_cursoradapter" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_cursoradapter"; + version = "version:2@28.0.0.cr0"; + sha256 = "06z3ba5bqcqv1379aj16pvqcs09pff2ss8sjwah3w6yp0bw46i1i"; + }; + "src/third_party/android_deps/libs/com_android_support_customview" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_customview"; + version = "version:2@28.0.0.cr0"; + sha256 = "1vhd792m113r7s13jly2fc2l72h6lqs99fjynlvh7ppfsl3ha16n"; + }; + "src/third_party/android_deps/libs/com_android_support_design" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_design"; + version = "version:2@28.0.0.cr0"; + sha256 = "0q6ygv1h3lbmz20b989w2p0sf0bh69537xwkmin1xbw7bm357wk4"; + }; + "src/third_party/android_deps/libs/com_android_support_documentfile" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_documentfile"; + version = "version:2@28.0.0.cr0"; + sha256 = "0s6wnbdsfxabgy7j2d3yh0nkz7zkjn22ngswmq3jgd7ymlpvldbn"; + }; + "src/third_party/android_deps/libs/com_android_support_drawerlayout" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_drawerlayout"; + version = "version:2@28.0.0.cr0"; + sha256 = "1gymfjq1dnrj6yp77pvm7hpqfwq2v5l2z92jvdsrkp3dj3c04q2l"; + }; + "src/third_party/android_deps/libs/com_android_support_interpolator" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_interpolator"; + version = "version:2@28.0.0.cr0"; + sha256 = "0j73f8dwxip1ad312x66d5iw39dc45gzbm0p56qd113dv6nq7jpf"; + }; + "src/third_party/android_deps/libs/com_android_support_loader" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_loader"; + version = "version:2@28.0.0.cr0"; + sha256 = "1mwj2q0xppama4sw8j41krqnbs6qqjbas6gdr89r3laxvhfhfj1j"; + }; + "src/third_party/android_deps/libs/com_android_support_localbroadcastmanager" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_localbroadcastmanager"; + version = "version:2@28.0.0.cr0"; + sha256 = "06895mn7r86z02xjfz2vxw1114zhsby4jbc8m20g7n5irpzvcscv"; + }; + "src/third_party/android_deps/libs/com_android_support_multidex" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_multidex"; + version = "version:2@1.0.0.cr0"; + sha256 = "0cxvhw4sfxmc9czbrwy365949vinnjwrp3i4a74pvg35sm2wasgx"; + }; + "src/third_party/android_deps/libs/com_android_support_print" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_print"; + version = "version:2@28.0.0.cr0"; + sha256 = "0bhgwpw62wvzpjrkjp8vq0b05cn040x6i97hdvvkrq9nn6qrlnvh"; + }; + "src/third_party/android_deps/libs/com_android_support_recyclerview_v7" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_recyclerview_v7"; + version = "version:2@28.0.0.cr0"; + sha256 = "00gr45k3jnb8h2kmij6p0p2irgkvxxqmj7idl7afl1ip4z6nm71c"; + }; + "src/third_party/android_deps/libs/com_android_support_slidingpanelayout" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_slidingpanelayout"; + version = "version:2@28.0.0.cr0"; + sha256 = "1n9lgjwcpb8w7wjixv935khkrphw0nbg2ww87gqh8jb82pj6k0fs"; + }; + "src/third_party/android_deps/libs/com_android_support_support_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_annotations"; + version = "version:2@28.0.0.cr0"; + sha256 = "0dda57cs8yvdpbi7jaw50ndvf4szhm9alk1iszq696m89flmky4n"; + }; + "src/third_party/android_deps/libs/com_android_support_support_compat" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_compat"; + version = "version:2@28.0.0.cr0"; + sha256 = "1zc1341is7qw7wzdg87i1c7wibwyw0zjyb9mcn4pv1gcr66a3kqa"; + }; + "src/third_party/android_deps/libs/com_android_support_support_core_ui" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_core_ui"; + version = "version:2@28.0.0.cr0"; + sha256 = "07xdb6n38zbh421g1shiwp46dlm2fiv5p5i89n5ra9npyydx9jya"; + }; + "src/third_party/android_deps/libs/com_android_support_support_core_utils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_core_utils"; + version = "version:2@28.0.0.cr0"; + sha256 = "1sw7xvn4zg4qa9fyd9jl6ric03jkp7a6pims54hif09dp6i79sz8"; + }; + "src/third_party/android_deps/libs/com_android_support_support_fragment" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_fragment"; + version = "version:2@28.0.0.cr0"; + sha256 = "1wzdvxmvkk0vpxc43y9a5wxl177aw3npy5ssmv3z8gmyhmixv5bf"; + }; + "src/third_party/android_deps/libs/com_android_support_support_media_compat" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_media_compat"; + version = "version:2@28.0.0.cr0"; + sha256 = "08fmh9xa2pn77viv97k9sscrkx5002hjmwhskf3c9nj8g7bd65gx"; + }; + "src/third_party/android_deps/libs/com_android_support_support_v4" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_v4"; + version = "version:2@28.0.0.cr0"; + sha256 = "0l4sc961kx2w8yc8qf80ak383gsq940y4dfhshbfcb98k207fxvs"; + }; + "src/third_party/android_deps/libs/com_android_support_support_vector_drawable" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_support_vector_drawable"; + version = "version:2@28.0.0.cr0"; + sha256 = "1gf7da8463fhm60ggmyp4hrkn7jrrpplmq8kqfxvd9p7vdn7jai0"; + }; + "src/third_party/android_deps/libs/com_android_support_swiperefreshlayout" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_swiperefreshlayout"; + version = "version:2@28.0.0.cr0"; + sha256 = "0vv2aggcgbqza2sdkb75fgpi4kjysxnpw4zy2sx63y24vzbf8ld0"; + }; + "src/third_party/android_deps/libs/com_android_support_transition" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_transition"; + version = "version:2@28.0.0.cr0"; + sha256 = "0nqgiwc7rcfnlkf8p896bylfvfycjkcxdvs41rjcyarc6d8wxa4y"; + }; + "src/third_party/android_deps/libs/com_android_support_versionedparcelable" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_versionedparcelable"; + version = "version:2@28.0.0.cr0"; + sha256 = "16mp3wijcs7473szl35dvbji6w41cfjm8hkkic4c67gqxb4b8g18"; + }; + "src/third_party/android_deps/libs/com_android_support_viewpager" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_support_viewpager"; + version = "version:2@28.0.0.cr0"; + sha256 = "02xilasqj0ik476dpdx3lk0xxqij9za8vcgldhyiwikh60hkq86c"; + }; + "src/third_party/android_deps/libs/com_android_tools_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_common"; + version = "version:2@30.2.0-beta01.cr0"; + sha256 = "1h8ng5z5ac3fr1q18v2xn6vm2zja3yhzv98fwgyr9ffsvk9wf3qm"; + }; + "src/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs"; + version = "version:2@1.1.5.cr1"; + sha256 = "1zg0lpyx03qb48b4bhpwcz0n3g2vpc60gx1gdkpg3gvn4n2z1wkr"; + }; + "src/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration"; + version = "version:2@1.1.5.cr1"; + sha256 = "0gwyygyiwjqcffq88v7v3pw9qz3xvfr6nr5v2q5h87sf17w5q7bh"; + }; + "src/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api"; + version = "version:2@30.2.0-beta01.cr0"; + sha256 = "0a1iwi1p11v2mgf6826x1kxg2jzvr1xbkf5jy232mrghh26w9wvy"; + }; + "src/third_party/android_deps/libs/com_android_tools_sdk_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_android_tools_sdk_common"; + version = "version:2@30.2.0-beta01.cr0"; + sha256 = "0fx75xprag7i5iylp75r10x9fcr2i7r2jnspaa0vdbi72fhi04dd"; + }; + "src/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine"; + version = "version:2@2.8.8.cr0"; + sha256 = "0j8s8ys4w4f072lwfidmv9xmmfqg0s0s03zhp51if1g46bxqggij"; + }; + "src/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms"; + version = "version:2@1.0.cr0"; + sha256 = "1q2gd5pprgwlpq982dgb747kmh4h0v1agl1wa755ybjwcwnq17dn"; + }; + "src/third_party/android_deps/libs/com_google_android_datatransport_transport_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_datatransport_transport_api"; + version = "version:2@2.2.1.cr0"; + sha256 = "06ww0c1dbzf6i62n2wrag5l0iq68kccrfgf47h2356g8j90pisnb"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth"; + version = "version:2@17.0.0.cr0"; + sha256 = "0s2m4d6s3p2bc1wc3mcb2qc9wzh7c3pibv4i541r0gc0vw7krih2"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone" = + fetchcipd + { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone"; + version = "version:2@17.5.0.cr0"; + sha256 = "1qnaib8q0vasa9w3ad8aljir6rqm1kvg4sa72jv4rxlmvsjp60x3"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base"; + version = "version:2@17.0.0.cr0"; + sha256 = "1f6rixxs1597iiw04smrprplhg6rp7a7i66d4n3nsi7asgmi4g96"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_base" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_base"; + version = "version:2@17.5.0.cr0"; + sha256 = "1vgyhdzsyll887xif4n882qz8ra2lxkiavmwfff0lqi8w7yxgkda"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_basement" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_basement"; + version = "version:2@17.5.0.cr0"; + sha256 = "1zbhrspj4cll1mnxjawxr6wssdmi9q9r0p8hi0mk1kzgkff44ndb"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_cast" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast"; + version = "version:2@17.0.0.cr0"; + sha256 = "0xkpymnsj3gh8c37b7kxpaghrhwgv6fyxnv39shkkp5zbynpj6vi"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework" = + fetchcipd + { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework"; + version = "version:2@17.0.0.cr0"; + sha256 = "0cgic5rscg8gack8nq1k22flg5caaxg6zvsm2kk1z1dbplhr9giz"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut"; + version = "version:2@17.0.0.cr0"; + sha256 = "0l5ylparlzynqks7kvrxck21lbpay6smnfxlhgz4zy6w82qb8inn"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging" = + fetchcipd + { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging"; + version = "version:2@16.0.0.cr0"; + sha256 = "1rbnhmiqfvg2a1fbi5p9178p9xgvazlich227lz2sx32rggv4a7s"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_fido" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_fido"; + version = "version:2@19.0.0-beta.cr0"; + sha256 = "1vxsqg8ksb8allcq26ic5wxsfzm4argrawfdl6qsnbphi52r4150"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_flags" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_flags"; + version = "version:2@17.0.0.cr0"; + sha256 = "0bkkvhss45ghmc51n9316jkp29am0ymrk18l65nkfh19v921yw44"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_gcm" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_gcm"; + version = "version:2@17.0.0.cr0"; + sha256 = "09rkrv5akx7vydbi969z61b6wvgyzl4xl2m4l0vhdldcpfbp9lbv"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_iid" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_iid"; + version = "version:2@17.0.0.cr0"; + sha256 = "09m0jlnrzc9408p2piwr9n39s9c9bj0jxa0xm4a7nbypff51im2j"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps"; + version = "version:2@17.0.0.cr0"; + sha256 = "185r0vclirvvnr0vzxbi3zyywkbxbisahgky85zjvpf2270rz84k"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_location" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_location"; + version = "version:2@17.0.0.cr0"; + sha256 = "1vyni1fxsgn30q1xa0c0j2xzdmkjbv0cfg6j2j0n45nqiwbdw34q"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype"; + version = "version:2@17.0.0.cr0"; + sha256 = "1kk0sz6lhcbi6k35b8lq0inqplyzwiw18r20imk6g8s9bc0kwjgj"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport" = + fetchcipd + { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport"; + version = "version:2@17.0.0.cr0"; + sha256 = "044xj4zvy18gjzli83lyxiky7kr9h498q3ssv0439vj4d84g1drk"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_stats" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_stats"; + version = "version:2@17.0.0.cr0"; + sha256 = "1y5mcgp84x77gsxmzcg69f93zl7xr37glmkkidh0b60n3g4givay"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_tasks" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_tasks"; + version = "version:2@17.2.0.cr0"; + sha256 = "1rbriq4wx2p7c5x0zmvvhv5772gkd2gyzprg4149cz4qrmkxjs03"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_vision" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision"; + version = "version:2@18.0.0.cr0"; + sha256 = "0am270a5db85z2nyw1y6r0s8axknmn8hhsyqndw4f79mjc1164v1"; + }; + "src/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common"; + version = "version:2@18.0.0.cr0"; + sha256 = "0mjmfysdgziis487kfhgmqwsfyg2bs8mh8cxzkv0vw35bmh578mv"; + }; + "src/third_party/android_deps/libs/com_google_android_material_material" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_material_material"; + version = "version:2@1.6.0-alpha01.cr0"; + sha256 = "15adm09x6j5kksa2kvf1p1lcgqk24s23141ynz3bq943qm32chmg"; + }; + "src/third_party/android_deps/libs/com_google_android_play_core" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_android_play_core"; + version = "version:2@1.10.0.cr0"; + sha256 = "1gl3ry64xrajrkaka48bi9hidcwiim1v89yc0h6vvb7kkk9cfjz2"; + }; + "src/third_party/android_deps/libs/com_google_auto_auto_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_auto_auto_common"; + version = "version:2@1.1.2.cr0"; + sha256 = "0lyckf6vgg7frjalp0npjs640p72x8f50zfqwyghjwb8cm2ydv2i"; + }; + "src/third_party/android_deps/libs/com_google_auto_service_auto_service" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_auto_service_auto_service"; + version = "version:2@1.0-rc6.cr0"; + sha256 = "0hf9jzqxy95v034ha776xnf3f8faghyrix2489nzl6sq2kc52mcw"; + }; + "src/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations"; + version = "version:2@1.0-rc6.cr0"; + sha256 = "0n0jqc90f741xgk34654lggkzkqxadxy14qmaiy3dhsvvn126drx"; + }; + "src/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations"; + version = "version:2@1.7.cr0"; + sha256 = "1za1d6il5gs78rf3flnhmkwd5l58lcj032av3psszsv5lv7jglm8"; + }; + "src/third_party/android_deps/libs/com_google_code_findbugs_jformatstring" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_code_findbugs_jformatstring"; + version = "version:2@3.0.0.cr0"; + sha256 = "0b5g8z79g1wj6r2njpxjq76izfrx4kmc65dlmaw1ng6fjh4w108i"; + }; + "src/third_party/android_deps/libs/com_google_code_findbugs_jsr305" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_code_findbugs_jsr305"; + version = "version:2@3.0.2.cr0"; + sha256 = "16iw2vv7wvpb63ih228ybsshnim23x1b5l75svvivk05cx27l2yq"; + }; + "src/third_party/android_deps/libs/com_google_code_gson_gson" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_code_gson_gson"; + version = "version:2@2.8.0.cr0"; + sha256 = "0mchxd8zc8y8qyx9f3a02623kb0r6pn00pscbprgfb2vr547vgks"; + }; + "src/third_party/android_deps/libs/com_google_dagger_dagger" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger"; + version = "version:2@2.30.cr0"; + sha256 = "11i2624s87b50drifl6rc2k3dnwwx8xll3jfwad7sid7pxq2h46k"; + }; + "src/third_party/android_deps/libs/com_google_dagger_dagger_compiler" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_compiler"; + version = "version:2@2.30.cr0"; + sha256 = "1i5flcqxvgh0ihm70l5xyg9zvl3p80qh2nfl2fspw1zqj6763f3k"; + }; + "src/third_party/android_deps/libs/com_google_dagger_dagger_producers" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_producers"; + version = "version:2@2.30.cr0"; + sha256 = "0vcplnf2m0hd914isjswvp8prnnih57fhxixhnngcgjjagygijx0"; + }; + "src/third_party/android_deps/libs/com_google_dagger_dagger_spi" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_dagger_dagger_spi"; + version = "version:2@2.30.cr0"; + sha256 = "1jsljm97r1z7y2hn8k2jpmidx3r0l8bghmhi8nykasi4pjpgmssh"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation"; + version = "version:2@2.10.0.cr0"; + sha256 = "0ccklipp0v1nd5gjw8k0gb0x13pjs1j9bh7pfbn1m4gdrw3rgwvm"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations"; + version = "version:2@2.10.0.cr0"; + sha256 = "0x8g5hd1znvakcncy74ar0n0sjvnd7p2is8p0cqnb34v3l0pb502"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api"; + version = "version:2@2.10.0.cr0"; + sha256 = "06vq6nyc16pdj6hb8dgxl95cylnd6w7l99rxgl671fp8yz5cqasb"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_core" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_core"; + version = "version:2@2.10.0.cr0"; + sha256 = "0iahrp0sgl82kvhb1208dnh2gl93nv0ms58zk5bhadsq48wczypd"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations"; + version = "version:2@2.10.0.cr0"; + sha256 = "0jmcvmp54ifflvb09q7k75zwyv9fiabv5fi74996s7rfkypsk83i"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_javac" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_javac"; + version = "version:2@9+181-r4173-1.cr0"; + sha256 = "1h1xrshv2a3hx6x9x1mrwijpiyhrigimzp0ji4w4fnflyv52kzpc"; + }; + "src/third_party/android_deps/libs/com_google_errorprone_javac_shaded" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_errorprone_javac_shaded"; + version = "version:2@9-dev-r4023-3.cr0"; + sha256 = "01ag9435x9dqw0jidrl7nm5cflikh9pkxk8a1ywnq4c4d634g60m"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_annotations"; + version = "version:2@16.0.0.cr0"; + sha256 = "11rdw5aqwyb2nx9ni83gr6jmd4344jk5zvf1f3sm2bbij1js7hkj"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_common"; + version = "version:2@19.5.0.cr0"; + sha256 = "12fazvay20mqf0km2d4jyx1mfrxy4a0i5pqph8syh1lzm3b3y399"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_components" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_components"; + version = "version:2@16.1.0.cr0"; + sha256 = "1xly7a2qaxscp2p1hmkggsrlni325aj6z5y3sm5qhmazci4bxnm0"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_encoders" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders"; + version = "version:2@16.1.0.cr0"; + sha256 = "045ba4l7jvz53nn425w24jdgvlp1jwag2kb09q3pyiw6rwwqabfw"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json"; + version = "version:2@17.1.0.cr0"; + sha256 = "0zllj52nc7lv56wc6lvis0hxi1gii7y9frkvdfmmid6wrrlw00xx"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_iid" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid"; + version = "version:2@21.0.1.cr0"; + sha256 = "0v6x78z8qpdz07dqb9sbv98ij7ylj3x8lbbxlnxdgs3373pyg9q1"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop"; + version = "version:2@17.0.0.cr0"; + sha256 = "146kilgl7x7xigmpqzv1fcdsmwidirqqf6hclz9rmmx5mg42c53l"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_installations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations"; + version = "version:2@16.3.5.cr0"; + sha256 = "1x9nlyj9nphn6wfwnjkyizxgv21mvkpw2gs4cjj4m2ng44r73qs2"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop"; + version = "version:2@16.0.1.cr0"; + sha256 = "0kmv1r0vckl22qjmhmmbg6i0k1iqcdf61pswx8pkq31yvx1xahxk"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector"; + version = "version:2@18.0.0.cr0"; + sha256 = "115s741xrpazn0z2mi4arp2f2y02jxnlinag49h7yzr4f43p4qwy"; + }; + "src/third_party/android_deps/libs/com_google_firebase_firebase_messaging" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_firebase_firebase_messaging"; + version = "version:2@21.0.1.cr0"; + sha256 = "1fbjzf622qha3m8k5q1ks2ys2l7wz4qljbqfxb34x4xskkvdqfjk"; + }; + "src/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java"; + version = "version:2@2.0.3.cr0"; + sha256 = "1whzndx6lf0k8dyyxb0fdinqd6lb7l1mkkgds1frxhfgg115dvyf"; + }; + "src/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format"; + version = "version:2@1.5.cr0"; + sha256 = "16kp7w3c3skrjbx6g71k5wmh0a8ygm3fc9nxfn8kxh7qiy4axyqc"; + }; + "src/third_party/android_deps/libs/com_google_guava_failureaccess" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_guava_failureaccess"; + version = "version:2@1.0.1.cr0"; + sha256 = "0z0mp28k0d59v41qmr3kinb4wyhpi2h12ppkjgx0kppw3nz7cbq4"; + }; + "src/third_party/android_deps/libs/com_google_guava_guava" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_guava_guava"; + version = "version:2@31.0-jre.cr0"; + sha256 = "0fyvgj7x6an5a5zaq88xbapxa0r9j4izqwy83ml1qwlrlvi6xjnx"; + }; + "src/third_party/android_deps/libs/com_google_guava_guava_android" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_guava_guava_android"; + version = "version:2@31.0-android.cr0"; + sha256 = "0wrfxqrpic10bcr2a2vjybqqnzcmnjmhl4xfxkah65aj9945x3p6"; + }; + "src/third_party/android_deps/libs/com_google_guava_listenablefuture" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_guava_listenablefuture"; + version = "version:2@1.0.cr0"; + sha256 = "187dhlm3naks9dq0rw2710d566sfbckricxrzvskf9swmc6aw7q2"; + }; + "src/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations"; + version = "version:2@1.3.cr0"; + sha256 = "166rvbzy6v2kdjljqj6xihi76f3i1nvmblmyb9bnx67biil4cxc5"; + }; + "src/third_party/android_deps/libs/com_google_protobuf_protobuf_java" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_java"; + version = "version:2@3.4.0.cr0"; + sha256 = "18xdgm0qy8a1ms5lbdkmk7kh5dpxkg8icvqa7zhsii47sglr04hy"; + }; + "src/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite"; + version = "version:2@3.19.3.cr0"; + sha256 = "0x2y8d0c3j02wjy9zn6jz9x5cn2min5dpyg7hmn6yssw5vww323d"; + }; + "src/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils"; + version = "version:2@1.3.0.cr0"; + sha256 = "1zqbqnbs03i8c8xp2prj01acrg36w9mm0fjkxyjkppiwblcdhfih"; + }; + "src/third_party/android_deps/libs/com_squareup_javapoet" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_squareup_javapoet"; + version = "version:2@1.13.0.cr0"; + sha256 = "1c0n842klp8rmdla7k35rya4wsam8wambb8j7c2mxvhn1vmwzs7a"; + }; + "src/third_party/android_deps/libs/com_squareup_javawriter" = fetchcipd { + package = "chromium/third_party/android_deps/libs/com_squareup_javawriter"; + version = "version:2@2.1.1.cr0"; + sha256 = "066cj5sqnw32rcbzbf00695n8nlk6rjxfslxmmzkl9ka8r5d2ahf"; + }; + "src/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils"; + version = "version:2@4.0.cr0"; + sha256 = "1jkdnma8wlcy4fiisbdihybhn783hq03pjm1pag0x25h0rx0h0yz"; + }; + "src/third_party/android_deps/libs/javax_annotation_javax_annotation_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/javax_annotation_javax_annotation_api"; + version = "version:2@1.3.2.cr0"; + sha256 = "0h3ha41h7cj1rp30iwsyabzsmd9i1ydlzigljm65mrmpk8cni9vz"; + }; + "src/third_party/android_deps/libs/javax_annotation_jsr250_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/javax_annotation_jsr250_api"; + version = "version:2@1.0.cr0"; + sha256 = "0lsp20gny3inm5k2cahyldizqm8xryb56lhdzripc5vw2fp5jady"; + }; + "src/third_party/android_deps/libs/javax_inject_javax_inject" = fetchcipd { + package = "chromium/third_party/android_deps/libs/javax_inject_javax_inject"; + version = "version:2@1.cr0"; + sha256 = "10wyr7izgi6n2fl2mi0kki2xkcp77nc42ar5pysf1dvh6d52h20d"; + }; + "src/third_party/android_deps/libs/nekohtml_nekohtml" = fetchcipd { + package = "chromium/third_party/android_deps/libs/nekohtml_nekohtml"; + version = "version:2@1.9.6.2.cr0"; + sha256 = "14id93112xhb47ic78acc6r6ypmcryq4hddvhmq927cd0klxf44n"; + }; + "src/third_party/android_deps/libs/nekohtml_xercesminimal" = fetchcipd { + package = "chromium/third_party/android_deps/libs/nekohtml_xercesminimal"; + version = "version:2@1.9.6.2.cr0"; + sha256 = "1w0x6z4792nvg69pfxkqpmqnfwdghdgfaajw68s3z522dzhrv3iz"; + }; + "src/third_party/android_deps/libs/net_ltgt_gradle_incap_incap" = fetchcipd { + package = "chromium/third_party/android_deps/libs/net_ltgt_gradle_incap_incap"; + version = "version:2@0.2.cr0"; + sha256 = "15zb0bfh59jccj43zndfh8v235jw37cr9j4nd3bj92anslyrz7ya"; + }; + "src/third_party/android_deps/libs/net_sf_kxml_kxml2" = fetchcipd { + package = "chromium/third_party/android_deps/libs/net_sf_kxml_kxml2"; + version = "version:2@2.3.0.cr0"; + sha256 = "11w4gzw2ygy9ifv64pi1dky7f20229phpxkkawr45cyy1cnkcl06"; + }; + "src/third_party/android_deps/libs/org_apache_ant_ant" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_ant_ant"; + version = "version:2@1.8.0.cr0"; + sha256 = "0lqbgw8apkyx6sv9h273wn0k758zbkb2r6g9y9s93yc4m9lcpha2"; + }; + "src/third_party/android_deps/libs/org_apache_ant_ant_launcher" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_ant_ant_launcher"; + version = "version:2@1.8.0.cr0"; + sha256 = "1r8rbxppalkdkrcajhwad3s2xidxp3a4kn7cngyyj6f6cvkd61an"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks"; + version = "version:2@2.1.3.cr0"; + sha256 = "0c0wpmzldl8xwxkmz7sg336a60g1dq90z1691wsy6nkjcbzx5fig"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_artifact" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact"; + version = "version:2@2.2.1.cr0"; + sha256 = "0sryj92ly4kl77z39454whnp86p9yi5mncdj4pn3rw46hgz5k464"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager"; + version = "version:2@2.2.1.cr0"; + sha256 = "1l4bbj7z9aw62acjnsnwz6bmhf147naffg95zzxwxf486dpzym0l"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics"; + version = "version:2@2.2.1.cr0"; + sha256 = "14njx071kqnqw6rxg1chz1pzgmxv8f6z4kqdkql8n5mmc4kygkzq"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_model" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_model"; + version = "version:2@2.2.1.cr0"; + sha256 = "0d5snhc9klrsz735ng4dzzp408jrwa9v4bh5cn9nkjf0azp9c504"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry"; + version = "version:2@2.2.1.cr0"; + sha256 = "1hxw7vgr2qcc9k9i4g5y6ixras23lfp434nzcycjis81ymj608qq"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_profile" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_profile"; + version = "version:2@2.2.1.cr0"; + sha256 = "06vk8m41p1xazq42xp700dh3izr1h4fsp1afan2lgp4jh9pnvyxk"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_project" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_project"; + version = "version:2@2.2.1.cr0"; + sha256 = "1q3fxdsiw6wd5zcx0zgskg5s8kwlq3x92hxgis84lpkz05jj33h3"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata"; + version = "version:2@2.2.1.cr0"; + sha256 = "13228089dpfz5n4i9zlm2wjqklv4s5gzbrr6vzbjxik5cl562a3f"; + }; + "src/third_party/android_deps/libs/org_apache_maven_maven_settings" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_maven_settings"; + version = "version:2@2.2.1.cr0"; + sha256 = "0gkf2z0cga4khhba2gp0cpk0l43d8x7xrppv42cl7p8znyxip6cs"; + }; + "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file"; + version = "version:2@1.0-beta-6.cr0"; + sha256 = "0ap8mz7g1d29jka84jlaqvfgnjfp57pcv9jg79wbfja9xvfswvy9"; + }; + "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight"; + version = "version:2@1.0-beta-6.cr0"; + sha256 = "0pj4lbq54c88pf5xzwf5inbc3083lnqmrb2n6xsyggrf79ir2mhj"; + }; + "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared"; + version = "version:2@1.0-beta-6.cr0"; + sha256 = "0h3lfgn2aa0c2jrgdjlzhrhjxp8wj3b0hm8n96c9wnfp7dqrdiah"; + }; + "src/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api"; + version = "version:2@1.0-beta-6.cr0"; + sha256 = "01cc4s4g4f9hcziap1p0529k8p7mqpscjc23qjvc7sv5jk9yd6dc"; + }; + "src/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup"; + version = "version:2@1.2.1.cr0"; + sha256 = "03i164wm6lwqiqgzwwhjvhfwmj5hqpr5f6i6hzl75plkq90rxjhp"; + }; + "src/third_party/android_deps/libs/org_checkerframework_checker_compat_qual" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_checkerframework_checker_compat_qual"; + version = "version:2@2.5.5.cr0"; + sha256 = "0v1nkl6fjpmy4w3h2cdkghc9s8sdyfdi5pmvmhvzpc536dk844i4"; + }; + "src/third_party/android_deps/libs/org_checkerframework_checker_qual" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_checkerframework_checker_qual"; + version = "version:2@3.12.0.cr0"; + sha256 = "089ycxas3ya1abkm4kk1y7v1gz57dm159ld7mck6ha7rhis803kj"; + }; + "src/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone"; + version = "version:2@3.15.0.cr0"; + sha256 = "0sgfknqkwl7c4zykrlx88qlp5jya7rnhyyb3cadkgc4bhbyb9kvc"; + }; + "src/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations"; + version = "version:2@1.17.cr0"; + sha256 = "1xfchxaklc8w1rjj46yiqc3v9sljvzwp018yscb0wzqmrarv689q"; + }; + "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default"; + version = "version:2@1.0-alpha-9-stable-1.cr0"; + sha256 = "1xvw9r8gz3cc6qw2mz165z3ib95ldi9kkagascd951nmvdacl06j"; + }; + "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation"; + version = "version:2@1.11.cr0"; + sha256 = "1akvdbcmh0nramh97n0yw4ddgasr6f2ypgc853ni9g3rgafm4fcv"; + }; + "src/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils"; + version = "version:2@1.5.15.cr0"; + sha256 = "1vmgr1dm88i7mjc82z5s29svhxy121zs1f39g22prwjygksdpilv"; + }; + "src/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit"; + version = "version:2@4.4.1.201607150455-r.cr0"; + sha256 = "1086c3y6f213pnyizlr5aqy0x9f37xpjbpsl6mv5bvy8y6f8dvmw"; + }; + "src/third_party/android_deps/libs/org_jetbrains_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_annotations"; + version = "version:2@13.0.cr0"; + sha256 = "1l75bqhnrbynaknclp7236wv1i4bhy4mwp0qnp4rl5hglxjdsg38"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib"; + version = "version:2@1.6.10.cr0"; + sha256 = "1wym3wh62xjki85y7gksq3nv8ism8in0gv4ar4pa3xhs1n64hyfd"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common"; + version = "version:2@1.6.10.cr0"; + sha256 = "1qsk426jqa7vdpzdfig2ricbdbggp1fkkaiarzh04nd47my02spi"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7"; + version = "version:2@1.5.0.cr0"; + sha256 = "038bblp1s0p06nx2f79dc3dnxwp9imrmjdyr3igh8mmn46lyr306"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8"; + version = "version:2@1.5.0.cr0"; + sha256 = "012yrnn7digalil885737ygf2fdhx3g294xszhcyr097289whv4m"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android"; + version = "version:2@1.5.0.cr0"; + sha256 = "05x6w0mj89qvvfxnb806mhnsf7p165da8cab4ns7vk1w9zvh3gjv"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm"; + version = "version:2@1.5.0.cr0"; + sha256 = "18sn0if3cxmram0r053bvy9xvl6kxbhi347h7vkdrq8sxh6sll5i"; + }; + "src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm"; + version = "version:2@0.1.0.cr0"; + sha256 = "06b2iya1cvhflslnl5ij0hsha4jwgal64xwrl2l5i6yyzaii8mpm"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm"; + version = "version:2@7.0.cr0"; + sha256 = "1j2mxgrj76cr780xqawxylwcslnmgfh0fp8cnwb0lrz1qlspmvbv"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm_analysis" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_analysis"; + version = "version:2@7.0.cr0"; + sha256 = "1k7ghsaqb5d2xyx965prp39grpqajk7p4qpwzc3wvdxmgcxcb68s"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm_commons" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_commons"; + version = "version:2@7.0.cr0"; + sha256 = "1x0ck0bjcbirwkm8xh43w5y2ghwgrpvakzsszlwlnarawcadk0lz"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm_tree" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_tree"; + version = "version:2@7.0.cr0"; + sha256 = "18n8q2gxzw42icsa47nsp98ja0bgm63i91x1qgbn3pjm8fiax3q3"; + }; + "src/third_party/android_deps/libs/org_ow2_asm_asm_util" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_ow2_asm_asm_util"; + version = "version:2@7.0.cr0"; + sha256 = "171s0xhdjsxmvm8pxzjkabdzl0nm1a29bylwxhsmz8i986xy56xr"; + }; + "src/third_party/android_deps/libs/org_pcollections_pcollections" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_pcollections_pcollections"; + version = "version:2@2.1.2.cr0"; + sha256 = "1c8i3znyqjkhq4wi3qryvqramzjhkymczxxn0iiky4hij6gwajza"; + }; + "src/third_party/android_deps/libs/org_robolectric_annotations" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_annotations"; + version = "version:2@4.3.1.cr0"; + sha256 = "1mpbd90ynigkvm74n9wfvp8f3zv87nyw1g88nihj7dcna03l4y05"; + }; + "src/third_party/android_deps/libs/org_robolectric_junit" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_junit"; + version = "version:2@4.3.1.cr0"; + sha256 = "1cgpc8bx66x6i0kam05y4q17ikazzc19q2ykfdgpcwyj2kmca66g"; + }; + "src/third_party/android_deps/libs/org_robolectric_pluginapi" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_pluginapi"; + version = "version:2@4.3.1.cr0"; + sha256 = "0r7fdjj09jmxah0lm7lbiy3ihw1g2myx3rbf4wky8pyvqxx589vi"; + }; + "src/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver"; + version = "version:2@4.3.1.cr0"; + sha256 = "1nyrqpvvagvnvlb5k1yk89a8jndy510xd81j4gy8q2xxypdvwphq"; + }; + "src/third_party/android_deps/libs/org_robolectric_resources" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_resources"; + version = "version:2@4.3.1.cr0"; + sha256 = "0mqyk7r1943h7bhz7kf5yhcd6cbp65swlabkxv7alr9svslzs5a9"; + }; + "src/third_party/android_deps/libs/org_robolectric_robolectric" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_robolectric"; + version = "version:2@4.3.1.cr0"; + sha256 = "0k8qfnil5xl2pdf12qfcf49h9mzs1l612r7khdvnpa64l5npwa31"; + }; + "src/third_party/android_deps/libs/org_robolectric_sandbox" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_sandbox"; + version = "version:2@4.3.1.cr0"; + sha256 = "126aws364b1bxmwspbn2jk2nzw2w8rrcrp03rl3ggnq26al6gysp"; + }; + "src/third_party/android_deps/libs/org_robolectric_shadowapi" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_shadowapi"; + version = "version:2@4.3.1.cr0"; + sha256 = "0jnaxvm9hwz2fj8qgnpxdwbcnjph11qcrjp2nf5z0657gxbfwscj"; + }; + "src/third_party/android_deps/libs/org_robolectric_shadows_framework" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_framework"; + version = "version:2@4.3.1.cr0"; + sha256 = "1gvqzlxmvlhgyd1q3fgds8fw679hmjqxaas6irjy0xnkj8qpyw1y"; + }; + "src/third_party/android_deps/libs/org_robolectric_shadows_multidex" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_multidex"; + version = "version:4.3.1-cr1"; + sha256 = "1f4q4dspngfblqfdasydv64ik4bgw4jmrfb1686l5jv8dj27dn2k"; + }; + "src/third_party/android_deps/libs/org_robolectric_shadows_playservices" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_shadows_playservices"; + version = "version:2@4.3.1.cr0"; + sha256 = "0ms20s8ds7mkslayngv9ll957zpxqr535ch7ykdfsfqqj3cvaj20"; + }; + "src/third_party/android_deps/libs/org_robolectric_utils" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_utils"; + version = "version:2@4.3.1.cr0"; + sha256 = "022fpdpfhy63vcw7gvdp0knw5a3xf0ix9v4mf63bb8i2630zh53c"; + }; + "src/third_party/android_deps/libs/org_robolectric_utils_reflector" = fetchcipd { + package = "chromium/third_party/android_deps/libs/org_robolectric_utils_reflector"; + version = "version:2@4.3.1.cr0"; + sha256 = "1v5mz4rr6kqk2fg4kl26hsjhdwzaahdv6lkqkpiw6n908dcr4wdf"; + }; + "src/third_party/android_ndk" = fetchgit { + url = "https://chromium.googlesource.com/android_ndk.git"; + rev = "9644104c8cf85bf1bdce5b1c0691e9778572c3f8"; + sha256 = "0wjkpsk5kns5mq1mscy0sia4pqxlcf97cl2kzdnp33mxa9mjgw6b"; + fetchSubmodules = true; + }; + "src/third_party/android_protobuf/src" = fetchgit { + url = "https://android.googlesource.com/platform/external/protobuf.git"; + rev = "7fca48d8ce97f7ba3ab8eea5c472f1ad3711762f"; + sha256 = "1icb2s3lp1vsximymk3cm8adwj7xk3awb4a7plxj88zqphydkk0d"; + fetchSubmodules = true; + }; + "src/third_party/android_protoc" = fetchcipd { + package = "chromium/third_party/android_protoc"; + version = "sLsJWojddBL2u8NYwNh6pJsqp_bL1ttmYIlBnhiIQ1QC"; + sha256 = "00qag88lcvgz2f3krqlj8fgjy56ck3lkafk7dq8x6lxz1h1m5wim"; + }; + "src/third_party/android_rust_toolchain/toolchain" = fetchcipd { + package = "chromium/third_party/android_rust_toolchain/linux-amd64"; + version = "BKAbvHjGv4-os-v8MS3I54bPsY-397xgaJ3yBeIVS20C"; + sha256 = "11k51g71jm6qfxb0ncghdm5ccv0q63zpyc0qz5q76w65h3402l47"; + }; + "src/third_party/android_sdk/androidx_browser/src" = fetchgit { + url = "https://chromium.googlesource.com/external/gob/android/platform/frameworks/support/browser.git"; + rev = "65086eb5e52c16778fa7b4f157156d17b176fcb3"; + sha256 = "1ypad79hb6m88bhrzlklz4cbba6gmrzxcls91z923ip3wdsg90wl"; + fetchSubmodules = true; + }; + "src/third_party/android_sdk/public" = symlinkJoin { + name = "cipd-joined"; + paths = [ + (fetchcipd { + package = "chromium/third_party/android_sdk/public/build-tools/31.0.0"; + version = "tRoD45SCi7UleQqSV7MrMQO1_e5P8ysphkCcj6z_cCQC"; + sha256 = "0q81fbacrram3b8qzv1icwpa5wl16plv5giqyh2xy9gaz1xnh56h"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/cmdline-tools"; + version = "PGPmqJtSIQ84If155ba7iTU846h5WJ-bL5d_OoUWEWYC"; + sha256 = "1svag2krs4k2lq7cj2yhg2z7lmbyshpgppzsv6i451bdzaccbj2j"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/emulator"; + version = "gMHhUuoQRKfxr-MBn3fNNXZtkAVXtOwMwT7kfx8jkIgC"; + sha256 = "0a872r5yfpp1bk191951zf1akrcvxabdi2axiqxmmslzqqds6gi4"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/extras"; + version = "ppQ4TnqDvBHQ3lXx5KPq97egzF5X2FFyOrVHkGmiTMQC"; + sha256 = "0zxfabvlmnh6avqcfs8g8w83ci1nnm9n68jvprsx5baiisqzv0ss"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/patcher"; + version = "I6FNMhrXlpB-E1lOhMlvld7xt9lBVNOO83KIluXDyA0C"; + sha256 = "1q03jm591c7fn1jra007pl43bs6hxm46cynnv3xx8rwyiwpbdwy0"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/platform-tools"; + version = "g7n_-r6yJd_SGRklujGB1wEt8iyr77FZTUJVS9w6O34C"; + sha256 = "1mzk6j31wd0lsznwgydbcfiw1iqf22rr606nx8149ygkfybrwic1"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/platforms/android-31"; + version = "lL3IGexKjYlwjO_1Ga-xwxgwbE_w-lmi2Zi1uOlWUIAC"; + sha256 = "0i5zlry2zllmlmzymwv2b622rpmhp5qpxjp2vggffyaz627y4gn9"; + }) + (fetchcipd { + package = "chromium/third_party/android_sdk/public/sources/android-31"; + version = "_a_BcnANjPYw5mSKlNHa7GFY8yc1kdqj2rmQgac7yUcC"; + sha256 = "154bn5dkk67zm6ayivxl8s6nxhr8rz1zi13ms52gkbd08zshnqsq"; + }) + ]; + }; + "src/third_party/android_support_test_runner" = fetchcipd { + package = "chromium/third_party/android_support_test_runner"; + version = "96d4bf848cd210fdcbca6bcc8c1b4b39cbd93141"; + sha256 = "1xk3b48zwan3pyg94mjkmain8r2iyld7lvzy3zd8yaz5bairfhif"; + }; + "src/third_party/android_system_sdk" = fetchcipd { + package = "chromium/third_party/android_system_sdk/public"; + version = "oSfDIvHlCa6W0gS79Q5OOfB9E4eBg3uAvi3BEDN21U0C"; + sha256 = "06nl413nfdj51ahaxwh7n95lpjjvrincwjgnq9s1a1092zhig0zb"; + }; + "src/third_party/androidx" = fetchcipd { + package = "chromium/third_party/androidx"; + version = "nPCy7pWgirlw8qxgh7t5Rh6g8Dzl-p9fGdw86SNpKFUC"; + sha256 = "1ya92mq5wjscc5fvnsqg85fh494kzdkc4yjfhax8g900vinkys60"; + }; + "src/third_party/angle" = fetchgit { + url = "https://chromium.googlesource.com/angle/angle.git"; + rev = "cc8b741c6ba4cf3cd56d6bc1173b029c816f8ced"; + sha256 = "11s212x0l28dwzf9lmlgsgl329pyqf0gnvvlgnzbdbqqgkj1yy0b"; + fetchSubmodules = true; + }; + "src/third_party/angle/third_party/VK-GL-CTS/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS"; + rev = "834c2e16ae1c4977b705be66508a35a54fd3f4ad"; + sha256 = "0y3pm4h8wxg9jzcf3178vycjaz7jbdrv210gkshc87h189z078cx"; + fetchSubmodules = true; + }; + "src/third_party/angle/third_party/glmark2/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/glmark2/glmark2"; + rev = "ca8de51fedb70bace5351c6b002eb952c747e889"; + sha256 = "1fdfk4rwsnp8wwkmpdq7aqvyrd3amwqyr3b3hs2wb7rarmcb7grg"; + fetchSubmodules = true; + }; + "src/third_party/angle/third_party/rapidjson/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/Tencent/rapidjson"; + rev = "7484e06c589873e1ed80382d262087e4fa80fb63"; + sha256 = "1g7syqklm3bpsixa5gybvqhv3yi9bgf173k11as55wvlshmkmjgp"; + fetchSubmodules = true; + }; + "src/third_party/apache-linux" = fetchcipd { + package = "infra/3pp/tools/httpd-php/${platform}"; + version = "version:2@httpd2.4.38.php7.3.31.chromium.3"; + sha256 = "1p9srk6a014a1adl4bf1wgd9r5bis7860z940m9b6216jl734mhp"; + }; + "src/third_party/apache-portable-runtime/src" = fetchgit { + url = "https://chromium.googlesource.com/external/apache-portable-runtime.git"; + rev = "c3f11fcd86b42922834cae91103cf068246c6bb6"; + sha256 = "1qb3qgwhn94v56kfw4ciaxbzfad834d1dgdhckhj3vcr86bchj5j"; + fetchSubmodules = true; + }; + "src/third_party/arcore-android-sdk-client" = fetchcipd { + package = "chromium/third_party/arcore-android-sdk-client"; + version = "fUSZ4jxIhIx34TxRIcrmOu76-khcka_Gpn0_t9lKCWQC"; + sha256 = "0bm7wrp9nq76hnrwaq2j2qwkvywlmyvc04wlqvvw77vqgh0q0lid"; + }; + "src/third_party/arcore-android-sdk/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google-ar/arcore-android-sdk.git"; + rev = "eaa85941f2d724c60671bf94f46de7178baba7e6"; + sha256 = "12frfx2g3i8hynkb0shvp817qh9j5267j5ynq21kagab2c9ph14s"; + fetchSubmodules = true; + }; + "src/third_party/boringssl/src" = fetchgit { + url = "https://boringssl.googlesource.com/boringssl.git"; + rev = "68addd2f719422cd00f44f06c330457269d3facf"; + sha256 = "0fa9966n096269cjdqlqw073iij959c965djxfmnrirjpf868b99"; + fetchSubmodules = true; + }; + "src/third_party/bouncycastle" = fetchcipd { + package = "chromium/third_party/bouncycastle"; + version = "c078e87552ba26e776566fdaf0f22cd8712743d0"; + sha256 = "0r1a513bllx5pv9v2bp4rcy8ca79ahx38iy1zp7ac6xjz8527pwr"; + }; + "src/third_party/breakpad/breakpad" = fetchgit { + url = "https://chromium.googlesource.com/breakpad/breakpad.git"; + rev = "08bd844599bf04c71707e8f59a8013a941264695"; + sha256 = "0r8v1jzzrl0y0pibg8s7xzn1dyg4dq3nnh4a1shm69kq49wby6rx"; + fetchSubmodules = true; + }; + "src/third_party/byte_buddy" = fetchcipd { + package = "chromium/third_party/byte_buddy"; + version = "c9b53316603fc2d997c899c7ca1707f809b918cd"; + sha256 = "1dffk7k27ng3h5zkx7qgaynydpm9czk3zp8crkghjs6xzdkzfdry"; + }; + "src/third_party/byte_buddy/android_sdk_build_tools_25_0_2" = fetchcipd { + package = "chromium/third_party/android_sdk/public/build-tools"; + version = "kwIs2vdfTm93yEP8LG5aSnchN4BVEdVxbqQtF4XpPdkC"; + sha256 = "0bs6lp21wpbhg3cfna1s7ncjn0l6j7zdx83fk22xw3350mjlbnm7"; + }; + "src/third_party/cast_core/public/src" = fetchgit { + url = "https://chromium.googlesource.com/cast_core/public"; + rev = "e7dac9fd5f5bf0158015b33a2594e30c1e4ae610"; + sha256 = "1bxq0lzbr1xb2k56yq1p8ifwgdhknc6wllnp44vqv5cdqlsb9jyq"; + fetchSubmodules = true; + }; + "src/third_party/catapult" = fetchgit { + url = "https://chromium.googlesource.com/catapult.git"; + rev = "1fe05501cf4f6f9f95a85b12f04e59a4485e1ffe"; + sha256 = "1ssv8dc1pwi7sj2qf0hmffjmrhdgak6rl8ima0gc08mjvd6p50x6"; + fetchSubmodules = true; + }; + "src/third_party/ced/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git"; + rev = "ba412eaaacd3186085babcd901679a48863c7dd5"; + sha256 = "09jjr2nffp2b6sqrk0bx4zrqvbqf8isq0i2v7qzng2zn33hvn8f9"; + fetchSubmodules = true; + }; + "src/third_party/checkstyle" = fetchcipd { + package = "chromium/third_party/checkstyle"; + version = "UAf8iarsiPx9B6ClHuyeRNM6py76TUVdylyGLTmpb4IC"; + sha256 = "0m3n0zhjljnyankcli97p48kkji7c9nwrr32j29l806dmpysqzqa"; + }; + "src/third_party/cld_3/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/cld_3.git"; + rev = "576305689d23da93e2f5e04a3de5afbe60d339da"; + sha256 = "046kjrwy9k82wdss48y1bdzzry03il59lanfk28lzgsgsa5h7h06"; + fetchSubmodules = true; + }; + "src/third_party/colorama/src" = fetchgit { + url = "https://chromium.googlesource.com/external/colorama.git"; + rev = "799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8"; + sha256 = "0llfx0c2rs270431s8yi8ffmn45zxncwxmwby42q3adv45il87qq"; + fetchSubmodules = true; + }; + "src/third_party/crc32c/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/crc32c.git"; + rev = "fa5ade41ee480003d9c5af6f43567ba22e4e17e6"; + sha256 = "0vivyzhljrsz6yp5fyyq86bq3hih1zxv77jv41j82c251yym60kz"; + fetchSubmodules = true; + }; + "src/third_party/cros_system_api" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/platform2/system_api.git"; + rev = "8b6ea1312fc4959c28a16526ca20d5d703c51f83"; + sha256 = "0fl34yf4hy52bfz6czjimagjshbcfdkfaypphpq7vpgi44ygkc57"; + fetchSubmodules = true; + }; + "src/third_party/dav1d/libdav1d" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/videolan/dav1d.git"; + rev = "cce2b0564d3b0aa1a5e4ec0c561b6a1b8497cebb"; + sha256 = "0ndx24c9a5218xwa2siiys4d580mc1rrvpcmm54zn8hrvzj2jc42"; + fetchSubmodules = true; + }; + "src/third_party/dawn" = fetchgit { + url = "https://dawn.googlesource.com/dawn.git"; + rev = "e846fefc34da4ba904c681cd275ada191674cfb5"; + sha256 = "0xc36lg3qyp9j83ckhldb3dv7kjjiyzcscyrl6x7n19700sa25al"; + fetchSubmodules = true; + }; + "src/third_party/dawn/third_party/tint" = fetchgit { + url = "https://dawn.googlesource.com/tint"; + rev = "555e94e7e36551ec8ae577a2ea1e958c8052f3fd"; + sha256 = "1qb1hdvjk8hcj1s77m67waa71f5a57arffs7rfx1ilpq3rsjv6b8"; + fetchSubmodules = true; + }; + "src/third_party/depot_tools" = fetchgit { + url = "https://chromium.googlesource.com/chromium/tools/depot_tools.git"; + rev = "988c0af5bed05e97d351297ed9f3221bfe42a205"; + sha256 = "0jhxr2gp4nqsqplqsrrzxxw53m3rl9qdmbiq6sxm1icscpndr991"; + fetchSubmodules = true; + }; + "src/third_party/devtools-frontend/src" = fetchgit { + url = "https://chromium.googlesource.com/devtools/devtools-frontend"; + rev = "23dc975793cd9335a2e51b4440c76268a4d56159"; + sha256 = "1mgwsix918v6gnlhna2ahi2r34hvai9azcv7h8yrp9y8zawwvvmv"; + fetchSubmodules = true; + }; + "src/third_party/devtools-frontend/src/third_party/esbuild" = fetchcipd { + package = "infra/3pp/tools/esbuild/${platform}"; + version = "version:2@0.14.13.chromium.2"; + sha256 = "048cv3givcy0yssgg994z17qfsr8ixjjmz42apqmpwgz7bmysij1"; + }; + "src/third_party/dom_distiller_js/dist" = fetchgit { + url = "https://chromium.googlesource.com/chromium/dom-distiller/dist.git"; + rev = "199de96b345ada7c6e7e6ba3d2fa7a6911b8767d"; + sha256 = "170qd75bwc0gld86vf32w36smc15wrafxqlg332mv5fhcl7h3qfa"; + fetchSubmodules = true; + }; + "src/third_party/eigen3/src" = fetchgit { + url = "https://chromium.googlesource.com/external/gitlab.com/libeigen/eigen.git"; + rev = "7db0ac977acf276fb0817cfb89e490cdbae0ab56"; + sha256 = "0n1r7ry9n5ii74995issik7qh762yb91pmn6d89p3xrdpig3iyxf"; + fetchSubmodules = true; + }; + "src/third_party/emoji-segmenter/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/emoji-segmenter.git"; + rev = "9ba6d25d0d9313569665d4a9d2b34f0f39f9a50e"; + sha256 = "06qn0sjprsak0b2schahfkl3nwrrrwbls7hhn02vp7ham806cgx1"; + fetchSubmodules = true; + }; + "src/third_party/espresso" = fetchcipd { + package = "chromium/third_party/espresso"; + version = "y8fIfH8Leo2cPm7iGCYnBxZpwOlgLv8rm2mlcmJlvGsC"; + sha256 = "1kiahac6knkm2zfi6b2avfpank3m5v1439wjrw9r37vh6lvxab2y"; + }; + "src/third_party/expat/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git"; + rev = "65a21f2b2a306d29b44e70264aca948aa0454219"; + sha256 = "1v9h33xzj34qc4am5r8d1dggqyx9yhpj6f1lwdqmv7a63lnffsbs"; + fetchSubmodules = true; + }; + "src/third_party/farmhash/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/farmhash.git"; + rev = "816a4ae622e964763ca0862d9dbd19324a1eaf45"; + sha256 = "1mqxsljq476n1hb8ilkrpb39yz3ip2hnc7rhzszz4sri8ma7qzp6"; + fetchSubmodules = true; + }; + "src/third_party/ffmpeg" = fetchgit { + url = "https://chromium.googlesource.com/chromium/third_party/ffmpeg.git"; + rev = "574c39cce3231c69bc9a02ac475c27d944bdb113"; + sha256 = "1ir1m8f8h20s7rffqpv7kxflj0qlhrxcbkj6ihf05yinfp9grgc8"; + fetchSubmodules = true; + }; + "src/third_party/flac" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/flac.git"; + rev = "af862024c8c8fa0ae07ced05e89013d881b00596"; + sha256 = "1y1pcdkza3fqvqam1pw5qm38pwy848mmfykqx06ir187p107c9d4"; + fetchSubmodules = true; + }; + "src/third_party/flatbuffers/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/flatbuffers.git"; + rev = "b8aaccee8248059b2af032cca0eb1d2ddbdb6cdc"; + sha256 = "0p33547fi72z1qh19ydg8ni9qlx9wc5lzl837h67bgy7qfksjsch"; + fetchSubmodules = true; + }; + "src/third_party/fontconfig/src" = fetchgit { + url = "https://chromium.googlesource.com/external/fontconfig.git"; + rev = "452be8125f0e2a18a7dfef469e05d19374d36307"; + sha256 = "1gfdqi80qvq3h4xbsrsfh9bmdzaiczzaaq95m0mxpd6xdqi6pizq"; + fetchSubmodules = true; + }; + "src/third_party/fp16/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/Maratyszcza/FP16.git"; + rev = "4dfe081cf6bcd15db339cf2680b9281b8451eeb3"; + sha256 = "06a8dfl3a29r93nxpp6hpywsajz5d555n3sqd3i6krybb6swnvh7"; + fetchSubmodules = true; + }; + "src/third_party/freetype-testing/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/freetype/freetype2-testing.git"; + rev = "fe2eddae6176f75e2101289eeda22a5ff3d808ca"; + sha256 = "1v6fxas665r8hvasqp6rrryh2scyp9ypbrmjq14lama60p94bmgc"; + fetchSubmodules = true; + }; + "src/third_party/freetype/src" = fetchgit { + url = "https://chromium.googlesource.com/chromium/src/third_party/freetype2.git"; + rev = "034e5dbf92ea3a7ea7c9322e47a3a50ff23f7b55"; + sha256 = "04z0fh7whs2gzpdfh1hndjg3ipmz1k48jcys01k45f1qhya6r8qn"; + fetchSubmodules = true; + }; + "src/third_party/gemmlowp/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/gemmlowp.git"; + rev = "13d57703abca3005d97b19df1f2db731607a7dc2"; + sha256 = "0w4ap82b73kh49pw913905al6q6lfqbgp666c0mcv2k01krh771v"; + fetchSubmodules = true; + }; + "src/third_party/glfw/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/glfw/glfw.git"; + rev = "94773111300fee0453844a4c9407af7e880b4df8"; + sha256 = "0q60nx877lc7grv2rfhja55zqvpvc6qdpr28hvs71dwyqy2q6225"; + fetchSubmodules = true; + }; + "src/third_party/google-truth" = fetchcipd { + package = "chromium/third_party/google-truth"; + version = "u8oovXxp24lStqX4d54htRovta-75Sy2w7ijg1TL07gC"; + sha256 = "0h8jl92i2lx2mgr5swirkpyvrq6af5nk6hagd8sfl4scsx0wf78b"; + }; + "src/third_party/googletest/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/googletest.git"; + rev = "ea55f1f52c489535f0d3b583c81529762c9cb5ea"; + sha256 = "15v9qyga4l2l561ymip1qk4dn5qjxavvc0lx2x08ck2vwn010rjf"; + fetchSubmodules = true; + }; + "src/third_party/grpc/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/grpc/grpc.git"; + rev = "754913545189b819829284b79ac5a4d31fddbdcc"; + sha256 = "09khmi69ds1w8syd6z0r2wlscgfn002fqmg7g9zha87bk7hs14jx"; + fetchSubmodules = true; + }; + "src/third_party/gvr-android-sdk/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/googlevr/gvr-android-sdk.git"; + rev = "233e7fe922a543e0bc55382d64cacd047307d0e7"; + sha256 = "1f9aqraqdx58gsahy94hqfxq6nib0a5nq02rb5r6gzrz3pdfdlaz"; + fetchSubmodules = true; + }; + "src/third_party/hamcrest" = fetchcipd { + package = "chromium/third_party/hamcrest"; + version = "37eccfc658fe79695d6abb6dd497463c4372032f"; + sha256 = "1yil3234fpgm27hrmnnxxvlrq3jv70fqgi365gfhvgq2cwgbjci2"; + }; + "src/third_party/harfbuzz-ng/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git"; + rev = "0acf466c44143de2e9b9cc0375cb25ec67cb132f"; + sha256 = "0053gzc7xfg11b0jxsm4lbw2h3bhja4f843wsvws64kz1kvqpg2n"; + fetchSubmodules = true; + }; + "src/third_party/highway/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/highway.git"; + rev = "424360251cdcfc314cfc528f53c872ecd63af0f0"; + sha256 = "0w5y8qwnvqq78pgc11bg4a4ilraymv57b95pljf1cqxwd17wkp1y"; + fetchSubmodules = true; + }; + "src/third_party/hunspell_dictionaries" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries.git"; + rev = "18e09b9197a3b1d771c077c530d1a4ebad04c167"; + sha256 = "0b5n1gf7z52gbf0p5xd4m30kaflz0myd2964v0rziki1nbczzpzy"; + fetchSubmodules = true; + }; + "src/third_party/icu" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/icu.git"; + rev = "e94822cd43d01722869c19053303a18e893ecd00"; + sha256 = "1m8dwkb6g0hk9bm7xlqdnfjyly0gfn4q4p1isc8hh8adzarnkp90"; + fetchSubmodules = true; + }; + "src/third_party/icu4j" = fetchcipd { + package = "chromium/third_party/icu4j"; + version = "e87e5bed2b4935913ee26a3ebd0b723ee2344354"; + sha256 = "04af162d1clvy532dpd623mnfhz92jsc3wl0zval375dxdyqn86b"; + }; + "src/third_party/jacoco" = fetchcipd { + package = "chromium/third_party/jacoco"; + version = "O8mNUqIbFxvOcBsSNfbvpdUFvY4nfrPY0QA2kHoO2pQC"; + sha256 = "1ynphf6gihdisn20gvfs1agnarnd5n7717hgh5zkfif2k0v0yk0w"; + }; + "src/third_party/javalang/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/c2nes/javalang.git"; + rev = "0664afb7f4d40254312693f2e833c1ed4ac551c7"; + sha256 = "1j799654grk7klixiijhih9v67qcxhzh3hjzqhqhfpgfnd26q0l9"; + fetchSubmodules = true; + }; + "src/third_party/jdk" = fetchcipd { + package = "chromium/third_party/jdk"; + version = "JhpgSvTpgVUkoKe56yQmYaR1jXNcY8NqlltA0mKIO4EC"; + sha256 = "0ialfgppc1fyqar0i96fsjswp269lyvyvjnm9g97g3bl8q1i6w7c"; + }; + "src/third_party/jdk/extras" = fetchcipd { + package = "chromium/third_party/jdk/extras"; + version = "-7m_pvgICYN60yQI3qmTj_8iKjtnT4NXicT0G_jJPqsC"; + sha256 = "17ingjlj3f1kkhl9hglzi4qp4vfr2wxaa535yb7xdza2hsvw4l4y"; + }; + "src/third_party/jsoncpp/source" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git"; + rev = "9059f5cad030ba11d37818847443a53918c327b1"; + sha256 = "0qnx5y6c90fphl9mj9d20j2dfgy6s5yr5l0xnzid0vh71zrp6jwv"; + fetchSubmodules = true; + }; + "src/third_party/junit/src" = fetchgit { + url = "https://chromium.googlesource.com/external/junit.git"; + rev = "64155f8a9babcfcf4263cf4d08253a1556e75481"; + sha256 = "1j8avi91px1z8rjc89cfikwrvfifdmmsarwiyrcnr59ynvpz0v8h"; + fetchSubmodules = true; + }; + "src/third_party/leveldatabase/src" = fetchgit { + url = "https://chromium.googlesource.com/external/leveldb.git"; + rev = "1b51a3a96821e5fd5175288724c95c1bde57b2f0"; + sha256 = "0hwxsm29dn0nyz0x684c1hapz9mf5z3j2ha2420qmdqkr6nvyazy"; + fetchSubmodules = true; + }; + "src/third_party/libFuzzer/src" = fetchgit { + url = "https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git"; + rev = "debe7d2d1982e540fbd6bd78604bf001753f9e74"; + sha256 = "0akak4x2njl2wxagiwbp30vms53k45jgy2kmfqhvx7lh28gclv8w"; + fetchSubmodules = true; + }; + "src/third_party/libaddressinput/src" = fetchgit { + url = "https://chromium.googlesource.com/external/libaddressinput.git"; + rev = "3b8ee157a8f3536bbf5ad2448e9e3370463c1e40"; + sha256 = "05d2a78fm85wbgxl1vg9rzifsspm7l3ypqgzp3csr5kmas1k9w9w"; + fetchSubmodules = true; + }; + "src/third_party/libaom/source/libaom" = fetchgit { + url = "https://aomedia.googlesource.com/aom.git"; + rev = "a08d3f6c329a25744712578a70715e5cfd749759"; + sha256 = "1xhch215finbrvi55qazr0nm2vngsll4hpi9s245asq9zfrg9lnn"; + fetchSubmodules = true; + }; + "src/third_party/libavif/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/AOMediaCodec/libavif.git"; + rev = "7a6d13be831da40859c6b61fb513b7a7a654a58b"; + sha256 = "0g5zls6lp3p72d1c9xdrys0m454aisdnb7vcr500v3h5fqs6xj74"; + fetchSubmodules = true; + }; + "src/third_party/libdrm/src" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/third_party/libdrm.git"; + rev = "0190f49a139e7069d7cad6a6890832831da1aa8b"; + sha256 = "1xr641kl61y1b7p71wrrjd6wsv5vcn2ilir8vg6ixwyfg9v6caim"; + fetchSubmodules = true; + }; + "src/third_party/libgav1/src" = fetchgit { + url = "https://chromium.googlesource.com/codecs/libgav1.git"; + rev = "58d08dbd45a3ee707e76f32a9c04d770c3d22e38"; + sha256 = "1jm4mydfaqnsq9wwd309hkv8qml33fgj0x3073hl9rl9f2mq3rfv"; + fetchSubmodules = true; + }; + "src/third_party/libgifcodec" = fetchgit { + url = "https://skia.googlesource.com/libgifcodec"; + rev = "d06d2a6d42baf6c0c91cacc28df2542a911d05fe"; + sha256 = "08mw637m0w6n9nga1mg06l1i3shszidp95d16rvaind35kk5gvci"; + fetchSubmodules = true; + }; + "src/third_party/libipp/libipp" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/platform2/libipp.git"; + rev = "6c45a4f3a05cb5dd700414fe4d94cf685159d3ce"; + sha256 = "079yzvpjqmjkc135ywn4nmqiwvmw6i01cs6f46l2hbzrx65xfhhv"; + fetchSubmodules = true; + }; + "src/third_party/libjpeg_turbo" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git"; + rev = "02959c3ee17abacfd1339ec22ea93301292ffd56"; + sha256 = "02fbqbxmslirx8sc7icsrixn12wxwac4d9i9v5hn2py225b83r3j"; + fetchSubmodules = true; + }; + "src/third_party/libjxl/src" = fetchgit { + url = "https://chromium.googlesource.com/external/gitlab.com/wg1/jpeg-xl.git"; + rev = "a205468bc5d3a353fb15dae2398a101dff52f2d3"; + sha256 = "17pvc5zgm9az5hfg2p80325f42w3dqspyb03iakrwg9x4n3vjckx"; + fetchSubmodules = true; + }; + "src/third_party/liblouis/src" = fetchgit { + url = "https://chromium.googlesource.com/external/liblouis-github.git"; + rev = "10f66b2735b7d1e3e44d98f6dedbb859d197ea57"; + sha256 = "0p1hs8aqgkv7xk2a81bv5a34vsascw4fcii4gihmgknfyilzxq5y"; + fetchSubmodules = true; + }; + "src/third_party/libphonenumber/dist" = fetchgit { + url = "https://chromium.googlesource.com/external/libphonenumber.git"; + rev = "68eba9d6ee8b11fb58ece36b6c46d07965d7f7ff"; + sha256 = "0xzl2pjiykspr4y0xrk6vpq4vkazk46m9hpjv2qap4zp8j6lfs9y"; + fetchSubmodules = true; + }; + "src/third_party/libprotobuf-mutator/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/libprotobuf-mutator.git"; + rev = "8942a9ba43d8bb196230c321d46d6a137957a719"; + sha256 = "0wp2xj242vlj8w6vrvfn86l4jds5y4n9mpc8fjc1mzzgmpmjk1vw"; + fetchSubmodules = true; + }; + "src/third_party/libsrtp" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/libsrtp.git"; + rev = "5b7c744eb8310250ccc534f3f86a2015b3887a0a"; + sha256 = "0dsd1kspi3gc4pnlm6q2k43czpsvk0v2jhcwclsgi4s6ca3wbwm5"; + fetchSubmodules = true; + }; + "src/third_party/libsync/src" = fetchgit { + url = "https://chromium.googlesource.com/aosp/platform/system/core/libsync.git"; + rev = "f4f4387b6bf2387efbcfd1453af4892e8982faf6"; + sha256 = "0qfz971xlqhbzjihbhc50bqys0x1kwjcc6q65xc785zia85plj9j"; + fetchSubmodules = true; + }; + "src/third_party/libunwindstack" = fetchgit { + url = "https://chromium.googlesource.com/chromium/src/third_party/libunwindstack.git"; + rev = "6868358481bb1e5e20d155c1084dc436c88b5e6b"; + sha256 = "0v861x7hfllzrlgzvw2sd3l8na0y49jx9y0w5v8zcdig40bk55v0"; + fetchSubmodules = true; + }; + "src/third_party/libvpx/source/libvpx" = fetchgit { + url = "https://chromium.googlesource.com/webm/libvpx.git"; + rev = "df0d06de6d3b64e35b9e75ad72c571af061bc7b3"; + sha256 = "0sxz7azry3a6s3207vmpmp3fyfa5k6ppb5ps9980dwic88mxz7r9"; + fetchSubmodules = true; + }; + "src/third_party/libwebm/source" = fetchgit { + url = "https://chromium.googlesource.com/webm/libwebm.git"; + rev = "e4fbea0c9751ae8aa86629b197a28d8276a2b0da"; + sha256 = "0jkhwdgvvyqx5gsk5jyvg8x625i2ljyjqkhyhpfkrl4xjy86gzmv"; + fetchSubmodules = true; + }; + "src/third_party/libyuv" = fetchgit { + url = "https://chromium.googlesource.com/libyuv/libyuv.git"; + rev = "b4ddbaf549a1bf5572bf703fd2862d1eb7380c6a"; + sha256 = "010h371w1nvzsbz1anszf8q1mxjb2j8di5ak64mjiri5iz7s4ym3"; + fetchSubmodules = true; + }; + "src/third_party/lss" = fetchgit { + url = "https://chromium.googlesource.com/linux-syscall-support.git"; + rev = "92a65a8f5d705d1928874420c8d0d15bde8c89e5"; + sha256 = "0f8fwk5ggacdzb0qxnclj0vwd5xgi4bwlp8hwarfklfsmi19pvhc"; + fetchSubmodules = true; + }; + "src/third_party/minigbm/src" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/platform/minigbm.git"; + rev = "2e63aaf616cdda26019d265989bd0d96ee11aab9"; + sha256 = "0i6mirig0sjx5bwmazina8czfi8dxr02fj2palf13zpq1g50cbmp"; + fetchSubmodules = true; + }; + "src/third_party/minizip/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/nmoinvaz/minizip"; + rev = "1ff40343b55e738d941abb51c70eddb803db16e2"; + sha256 = "1z27h19qmslzvzn9d0cdb8p11yaqph6ryija1vd6drjnk6h4crvh"; + fetchSubmodules = true; + }; + "src/third_party/mockito/src" = fetchgit { + url = "https://chromium.googlesource.com/external/mockito/mockito.git"; + rev = "04a2a289a4222f80ad20717c25144981210d2eac"; + sha256 = "10g549zf4yygni0lkpqjzpwwb8z42h2dpfa4c2zagjk9bzi54gia"; + fetchSubmodules = true; + }; + "src/third_party/nasm" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/nasm.git"; + rev = "9215e8e1d0fe474ffd3e16c1a07a0f97089e6224"; + sha256 = "0132nfd3d4l3z8245iff8qnralhm2inbljrc605910jg5jvd9d6s"; + fetchSubmodules = true; + }; + "src/third_party/nearby/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/nearby-connections.git"; + rev = "ae0337db3bac9b104a2b585be7312615bcc66262"; + sha256 = "09kyrpwrpl90c88xyid7j7k1fgrdmiwka0wk541vr6d14rfb7afm"; + fetchSubmodules = true; + }; + "src/third_party/neon_2_sse/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/intel/ARM_NEON_2_x86_SSE.git"; + rev = "8dbe2461c89760ac4b204aa0eafb72413a97957d"; + sha256 = "09bfcbkjsgn3r9ann8ayf65xqgycy3g5mrj9fnn70sfj10cmahvm"; + fetchSubmodules = true; + }; + "src/third_party/netty-tcnative/src" = fetchgit { + url = "https://chromium.googlesource.com/external/netty-tcnative.git"; + rev = "7eeb50be90c9ba0f6afa3375132df63942a0f32d"; + sha256 = "19qh20pc61l379l25a768ym7r92s9qk52f2z77zf0j5bcharf6sq"; + fetchSubmodules = true; + }; + "src/third_party/netty4/src" = fetchgit { + url = "https://chromium.googlesource.com/external/netty4.git"; + rev = "cc4420b13bb4eeea5b1cf4f93b2755644cd3b120"; + sha256 = "167d3474ax7kzplnkkfl4pxsz90diw5fwg3ks5xwnqplvj6ipl6x"; + fetchSubmodules = true; + }; + "src/third_party/objenesis" = fetchcipd { + package = "chromium/third_party/objenesis"; + version = "tknDblENYi8IaJYyD6tUahUyHYZlzJ_Y74_QZSz4DpIC"; + sha256 = "0qrkagpvybz1zz9w7ik05y7p48kd822228w7fn1xvnxgl1d8fjy5"; + }; + "src/third_party/openh264/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/cisco/openh264"; + rev = "b52786888ddce9d6bc06b7825ba9bffc65924e0c"; + sha256 = "046b6fhsr65s3qnhmkik48cb56c6s1arwgp4980dlc280f529vv4"; + fetchSubmodules = true; + }; + "src/third_party/openscreen/src" = fetchgit { + url = "https://chromium.googlesource.com/openscreen"; + rev = "0f4d256a3e5588144a81a848cdd5cf314dc52868"; + sha256 = "19g977cfmjs457i9fpq69csxdqh0gxrd63y9ld7417b9zciwzqw7"; + fetchSubmodules = true; + }; + "src/third_party/openscreen/src/third_party/tinycbor/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/intel/tinycbor.git"; + rev = "fc42a049853b802e45f49588f8148fc29d7b4d9c"; + sha256 = "1iaq7l11bfs3qlwbf4l19lvpycf5zrrkbz3s1jlh10fs0v26wz1m"; + fetchSubmodules = true; + }; + "src/third_party/ots/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/khaledhosny/ots.git"; + rev = "ee537ac096667eed6559124164c3e8482646fd77"; + sha256 = "0yg7g2ial5yb1i6d7jj9v77z81383qiwsdy1dd0bzrfncbfyp65s"; + fetchSubmodules = true; + }; + "src/third_party/pdfium" = fetchgit { + url = "https://pdfium.googlesource.com/pdfium.git"; + rev = "2fcb5025f65abf3f9446b3935ac3186a59a7dc90"; + sha256 = "1bbwjnzajzynms7kxy37gn2qhkyyc6wf7s9f8qbkl0n2cz7miqx6"; + fetchSubmodules = true; + }; + "src/third_party/perfetto" = fetchgit { + url = "https://android.googlesource.com/platform/external/perfetto.git"; + rev = "dfc6cffca9b6a34068386915d50040c6bc142717"; + sha256 = "0cpmhvwx6wb9g36bs6yfryckin6khfs3s5hpkj82v3y2fpgh6shk"; + fetchSubmodules = true; + }; + "src/third_party/proguard" = fetchcipd { + package = "chromium/third_party/proguard"; + version = "Fd91BJFVlmiO6c46YMTsdy7n2f5Sk2hVVGlzPLvqZPsC"; + sha256 = "07swiphqrkaz4j0mfmfyzabfwwm1rny3fcc1hdrqyaz15ai84svl"; + }; + "src/third_party/pyelftools" = fetchgit { + url = "https://chromium.googlesource.com/chromiumos/third_party/pyelftools.git"; + rev = "19b3e610c86fcadb837d252c794cb5e8008826ae"; + sha256 = "07hl6dpa35xixfdh55d20a2b1x9yghfr6f7bj7hgyz1gh7ffkzi3"; + fetchSubmodules = true; + }; + "src/third_party/pywebsocket3/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/pywebsocket3.git"; + rev = "50602a14f1b6da17e0b619833a13addc6ea78bc2"; + sha256 = "1145dll9wvshjlaki3bs4r2v0mzwzg023gzxgyfblz7vdyxsljjq"; + fetchSubmodules = true; + }; + "src/third_party/quic_trace/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/quic-trace.git"; + rev = "413c3a4a641c014193eabb8d282c2348ccec3c5b"; + sha256 = "1sii5a599q22xqbqsb77rv2xyrfixz76p99xi7is7ysk4iid1r7x"; + fetchSubmodules = true; + }; + "src/third_party/r8" = fetchcipd { + package = "chromium/third_party/r8"; + version = "cEv1yyfxfmP_MaZrG22cR7YPc7hehgHAZd82lRx0DFAC"; + sha256 = "1a9jbc5nmq7db66f67zlvx5gd54fcjhfsm0yhysp3ll2cslfj64y"; + }; + "src/third_party/re2/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/re2.git"; + rev = "885eb38accf49e2ccdd2fa6786f3590cf40a3e23"; + sha256 = "1gzdqy5a0ln9rwd8kmwbgis6qin63hapicwb35xkbnj3y84jj6yx"; + fetchSubmodules = true; + }; + "src/third_party/requests/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/kennethreitz/requests.git"; + rev = "c7e0fc087ceeadb8b4c84a0953a422c474093d6d"; + sha256 = "18dds0ifjhjy5x8mra2fspvc1b7xvzr4dk798igbvkwg9vkdzn1i"; + fetchSubmodules = true; + }; + "src/third_party/robolectric" = fetchcipd { + package = "chromium/third_party/robolectric"; + version = "Kdd6dNFAKqj9g9Bsfo2z1zQr52Vk60EL_wb9Bf2c8rcC"; + sha256 = "0502qqysagn02ig0cajizhzklmvrx91bc8i22hmf6jfi28sxcl4z"; + }; + "src/third_party/rust/serde_jsonrc/v0_1/crate" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/serde-rs/json"; + rev = "ca5782632fc8dc3f9cf2f22055b87f910cad761f"; + sha256 = "115f7v26jn7njja5x80a801i75xpx1374zkrc8r84j65ig9yk4sb"; + fetchSubmodules = true; + }; + "src/third_party/ruy/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/ruy.git"; + rev = "7ef39c5745a61f43071e699c6a96da41701ae59f"; + sha256 = "1g7p1ykd6jbx5i25h1c0crgifcbr3azpm7c5l2fil38ba1ccd4sd"; + fetchSubmodules = true; + }; + "src/third_party/securemessage/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/securemessage.git"; + rev = "fa07beb12babc3b25e0c5b1f38c16aa8cb6b8f84"; + sha256 = "0d1rq8mg4bj5kh9jg7lgfv3kqpnn8kdvm5rckgd8jmqihl2hcs8c"; + fetchSubmodules = true; + }; + "src/third_party/shaderc/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/shaderc.git"; + rev = "96b1dd72a827304817470274a470c4d3b2293451"; + sha256 = "1ax5wy04g9ca8c4533zdvjd9zrp5mzx0471s0rx71ipkq02pxi4c"; + fetchSubmodules = true; + }; + "src/third_party/skia" = fetchgit { + url = "https://skia.googlesource.com/skia.git"; + rev = "b524f580859d367e51591d8b5c16485d022844cb"; + sha256 = "09j8jvl0j34iacb0p7a0z5frgn2zcfwk1fh26g79ll73d3h2dlbi"; + fetchSubmodules = true; + }; + "src/third_party/smhasher/src" = fetchgit { + url = "https://chromium.googlesource.com/external/smhasher.git"; + rev = "e87738e57558e0ec472b2fc3a643b838e5b6e88f"; + sha256 = "0b4yxi80kixp0dr51q3a80ia2nv70spp1mhsbl31rwmlczzby827"; + fetchSubmodules = true; + }; + "src/third_party/snappy/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/snappy.git"; + rev = "65dc7b383985eb4f63cd3e752136db8d9b4be8c0"; + sha256 = "0jvl9m9f7syl8jscf9mkfmj0d5zsq150mzrnscvw9q6685rfnhm1"; + fetchSubmodules = true; + }; + "src/third_party/sqlite/src" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/sqlite.git"; + rev = "9ccd3058ec6dcfa5b0ebd2edb3e88c9b97813025"; + sha256 = "12swdcjvacds81hfixpvkbg99lz2rvdyfw7v2gdcyfy1y2b3yna4"; + fetchSubmodules = true; + }; + "src/third_party/sqlite4java" = fetchcipd { + package = "chromium/third_party/sqlite4java"; + version = "LofjKH9dgXIAJhRYCPQlMFywSwxYimrfDeBmaHc-Z5EC"; + sha256 = "1bckirpb79bknwnksjsybwcm7dc3ngmb5xslfglndjxrjfsw96k1"; + }; + "src/third_party/swiftshader" = fetchgit { + url = "https://swiftshader.googlesource.com/SwiftShader.git"; + rev = "043a8084c1cb680b30a46e8a316042f6bb9028ec"; + sha256 = "1mg3qwvwlac6p5ja6435l92w61clrja8zghhc8snzlj577j5svly"; + fetchSubmodules = false; + }; + "src/third_party/tflite/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/tensorflow/tensorflow.git"; + rev = "767b2cf99f1ebe27f9e61b672a48ddbb2142bfed"; + sha256 = "1lk2fr1a4ld6bcnrx9j50b8aw7iazvcgmpahmw34v3nndap2c2v6"; + fetchSubmodules = true; + }; + "src/third_party/turbine" = fetchcipd { + package = "chromium/third_party/turbine"; + version = "VhmfIPuSDHHeilnA7WC0MhR9ShZNF25tA0Te4RYIZG8C"; + sha256 = "104jhsyjgkrx6z20wz3invdcpbryr9fqxigwi3dbqafxg9v51pg8"; + }; + "src/third_party/ub-uiautomator/lib" = fetchgit { + url = "https://chromium.googlesource.com/chromium/third_party/ub-uiautomator.git"; + rev = "00270549ce3161ae72ceb24712618ea28b4f9434"; + sha256 = "08axh1pbssh3l4hgw5sllp96jaxrx8hbv9n69q695irdbrpbnr6b"; + fetchSubmodules = true; + }; + "src/third_party/ukey2/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/google/ukey2.git"; + rev = "0275885d8e6038c39b8a8ca55e75d1d4d1727f47"; + sha256 = "01z3ab54khwmbg52pcfvqlclsdd00pzi8mcalq5px1lnhcz6vp4d"; + fetchSubmodules = true; + }; + "src/third_party/usrsctp/usrsctplib" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/sctplab/usrsctp"; + rev = "62d7d0c928c9a040dce96aa2f16c00e7e67d59cb"; + sha256 = "0sy1ifbm56s0c31pw30fpcfngkr4dv11yysmwhzwax914d9kh4yn"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps" = fetchgit { + url = "https://chromium.googlesource.com/vulkan-deps"; + rev = "5fe1b21d6ba47a8dee59068d6927a4c157ec13a3"; + sha256 = "07hsqz35jpd5wpjis5w6n51ahlnp5isj7lmbj566azxk8dm8rb6j"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/glslang/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang"; + rev = "90d4bd05cd77ef5782a6779a0fe3d084440dc80d"; + sha256 = "153msf42wmj9y4vmnh6wkgh0is227vscq0n8c0bbgq7zv8cggbkk"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/spirv-cross/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross"; + rev = "64e058aa9b0c7a0d1cbc645b4496ddf4cdbca00d"; + sha256 = "0xfw6icp9a505kswh2wqdlmjqp2jr3scjwkqnj1wmkbgxzfnc3ib"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/spirv-headers/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers"; + rev = "6a55fade62dec6a406a5a721148f88a2211cbefa"; + sha256 = "06jwrp8ncs7j0mqv95bm7gk5f674ycd0axx9632zciha592yq9m6"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/spirv-tools/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools"; + rev = "d18d0d92e55f44da6af0dc87fb0e3c8034e9a3ac"; + sha256 = "1f8vc53858fidd60ka9c3jqnkqn6zd1si6bdkx7gvp36d0p6sar4"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/vulkan-headers/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers"; + rev = "b32da5329b50e3cb96229aaecba9ded032fe29cc"; + sha256 = "0n7ffbwwdrpbzgijsmw56qz0jpl9ib8xib8bqmbkfqpn1zk5zsvs"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/vulkan-loader/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader"; + rev = "edb793cf31480ae71f7462e8ae2bf13188143682"; + sha256 = "14mghmqikbigjwd08myry8f8hxawiphq7010pp3dcbs1pi5pr1aj"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/vulkan-tools/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools"; + rev = "5f9e5f14e572a6c9f7ff4d54e2fd4d82632bc393"; + sha256 = "0b4i4amnbsfwz2ir8jsy89nhszcka4w9ycjnnlycwqdz9lqiihmw"; + fetchSubmodules = true; + }; + "src/third_party/vulkan-deps/vulkan-validation-layers/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers"; + rev = "0b8873487d46fbcc7cafa917824a867151160933"; + sha256 = "1b67xhd94wbfwsa9f4g8xxi2mkn3r0w1gjh66mzdb318vj7ai16c"; + fetchSubmodules = true; + }; + "src/third_party/vulkan_memory_allocator" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git"; + rev = "ebe84bec02c041d28f902da0214bf442743fc907"; + sha256 = "1hclk1jm0d3sgfqbha4lzwk39dfi3dx1cgyg9h74105zfqy6w15c"; + fetchSubmodules = true; + }; + "src/third_party/wayland-protocols/gtk" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/GNOME/gtk.git"; + rev = "40ebed3a03aef096addc0af09fec4ec529d882a0"; + sha256 = "091ffkv5m46zgjklr4mpnsc3ykfnzbj4yin45isvpr05p6fcv5gg"; + fetchSubmodules = true; + }; + "src/third_party/wayland-protocols/kde" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/KDE/plasma-wayland-protocols.git"; + rev = "0b07950714b3a36c9b9f71fc025fc7783e82926e"; + sha256 = "0rip7fvx3xg5s975dcw47pvwrmv0fi53xrpkqk6lxzmcd7zjjrqf"; + fetchSubmodules = true; + }; + "src/third_party/wayland-protocols/src" = fetchgit { + url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git"; + rev = "177ff9119da526462e5d35fbfde6c84794913787"; + sha256 = "1n3skg63lqpx35rarwdklcjyh5pd3fbjwk68lw30i9v554fk9xsn"; + fetchSubmodules = true; + }; + "src/third_party/wayland/src" = fetchgit { + url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland.git"; + rev = "e60398b1755bfcdf09f040d3769131fe0d9762fc"; + sha256 = "014zl3kp3gy2s8nmfp8vqy02fgpgqvajg8c9gxk6g4z460c8rbkj"; + fetchSubmodules = true; + }; + "src/third_party/webdriver/pylib" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/SeleniumHQ/selenium/py.git"; + rev = "d0045ec570c1a77612db35d1e92f05e1d27b4d53"; + sha256 = "0grjcv25ajbf8zbhp8s1qajba980aspz52pzicfnk4csmpamcwkw"; + fetchSubmodules = true; + }; + "src/third_party/webgl/src" = fetchgit { + url = "https://chromium.googlesource.com/external/khronosgroup/webgl.git"; + rev = "cf04aebdf9b53bb2853f22a81465688daf879ec6"; + sha256 = "043hy7sg6g0pdln83rr5phq7gqjb3586b3jcbqam2xpm5p102zmh"; + fetchSubmodules = true; + }; + "src/third_party/webgpu-cts/src" = fetchgit { + url = "https://chromium.googlesource.com/external/github.com/gpuweb/cts.git"; + rev = "bcac299eb80e8314ba22b8f012a31138b0686324"; + sha256 = "1q7jwg1n6iyk2n0ff9v93rgjm7rvr6hysw45lx9kjayr41s28c66"; + fetchSubmodules = true; + }; + "src/third_party/webpagereplay" = fetchcipd { + package = "infra/tools/wpr/linux_x86_64"; + version = "y28SfbEF6nHSkZ1eHysM1t711zpOCmtk7jUdxZB-QSMC"; + sha256 = "00i5c4wiwvap5faphfb672l86kdynn191qk1vhmv853rf0lka5c3"; + }; + "src/third_party/webrtc" = fetchgit { + url = "https://webrtc.googlesource.com/src.git"; + rev = "ffd9187dc0d9211ad52173bf0daa5001ca7d45ee"; + sha256 = "18naav5a294mb56dd8xzz1ms98jid0gqza6swbgbc56575a2cib5"; + fetchSubmodules = true; + }; + "src/third_party/weston/src" = fetchgit { + url = "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/weston.git"; + rev = "420cfd00f2de91de74bd9d4d8348e43c582d29f0"; + sha256 = "0ib9c6dlnmbj3gngllsvi0kax2ql678nz26lq9ynjmiwhfh7ma8h"; + fetchSubmodules = true; + }; + "src/third_party/wuffs/src" = fetchgit { + url = "https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git"; + rev = "ebbecaa2fb439eff0aeedafadb4c2a984446dee8"; + sha256 = "184878r794iz30cib90bg95b3pa31sm9mqnm3mpilkfhmync54mc"; + fetchSubmodules = true; + }; + "src/third_party/xdg-utils" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/xdg-utils.git"; + rev = "d80274d5869b17b8c9067a1022e4416ee7ed5e0d"; + sha256 = "0i72hw0lb4xjg1xh0bax6s5x5hjc3n0lmwzck4q04h94k7s9ayxp"; + fetchSubmodules = true; + }; + "src/tools/page_cycler/acid3" = fetchgit { + url = "https://chromium.googlesource.com/chromium/deps/acid3.git"; + rev = "6be0a66a1ebd7ebc5abc1b2f405a945f6d871521"; + sha256 = "0dmkrbhb4kb7vk33i3zc0kv9ihbkxwy4cfvaw5fnfx9zp77jgdpv"; + fetchSubmodules = true; + }; + "src/tools/resultdb" = fetchcipd { + package = "infra/tools/result_adapter/${platform}"; + version = "git_revision:735a8a662d3874d8b1d795a40e46ea0f57b52758"; + sha256 = "1vbdwhn2wq8did768g3nijvrry6i6y2y1r00ww94n4phbydyk055"; + }; + "src/tools/skia_goldctl/linux" = fetchcipd { + package = "skia/tools/goldctl/linux-amd64"; + version = "njGzzVyYPSA__3tShsGxsvh8k5kJfL9V0wvLthXSUV4C"; + sha256 = "00b32xyxlcqa8hpa66djjlsql4jc3npcirh10n4wbgzd0wm07wl8"; + }; + "src/v8" = fetchgit { + url = "https://chromium.googlesource.com/v8/v8.git"; + rev = "b2490f598d9debd563bc32191cb3f777a16cbbb0"; + sha256 = "0j7i9p4fijb6r5ma4g55hv7qa3wld3yxwaldpj284xvan7jdj3p0"; + fetchSubmodules = true; + }; -"src/third_party/node/node_modules" = runCommand "download_from_google_storage-chromium-nodejs" {} '' - mkdir $out - tar xf ${fetchurl { - url = "https://commondatastorage.googleapis.com/chromium-nodejs/aad6877c8cd3cff0ef1ba628d71acc981c520c29"; - sha1 = "aad6877c8cd3cff0ef1ba628d71acc981c520c29"; - }} --strip-components=1 -C $out -''; + "src/third_party/node/node_modules" = + runCommand "download_from_google_storage-chromium-nodejs" { } + '' + mkdir $out + tar xf ${ + fetchurl { + url = "https://commondatastorage.googleapis.com/chromium-nodejs/aad6877c8cd3cff0ef1ba628d71acc981c520c29"; + sha1 = "aad6877c8cd3cff0ef1ba628d71acc981c520c29"; + } + } --strip-components=1 -C $out + ''; -"src/third_party/test_fonts/test_fonts" = runCommand "download_from_google_storage-chromium-fonts" {} '' - mkdir $out - tar xf ${fetchurl { - url = "https://commondatastorage.googleapis.com/chromium-fonts/cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb"; - sha1 = "cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb"; - }} --strip-components=1 -C $out -''; + "src/third_party/test_fonts/test_fonts" = + runCommand "download_from_google_storage-chromium-fonts" { } + '' + mkdir $out + tar xf ${ + fetchurl { + url = "https://commondatastorage.googleapis.com/chromium-fonts/cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb"; + sha1 = "cd96fc55dc243f6c6f4cb63ad117cad6cd48dceb"; + } + } --strip-components=1 -C $out + ''; -"src/third_party/subresource-filter-ruleset/data/UnindexedRules" = fetchurl { - url = "https://commondatastorage.googleapis.com/chromium-ads-detection/a703507a694340bac1a78ce6e54dfbd641062da5"; - sha1 = "a703507a694340bac1a78ce6e54dfbd641062da5"; - }; + "src/third_party/subresource-filter-ruleset/data/UnindexedRules" = fetchurl { + url = "https://commondatastorage.googleapis.com/chromium-ads-detection/a703507a694340bac1a78ce6e54dfbd641062da5"; + sha1 = "a703507a694340bac1a78ce6e54dfbd641062da5"; + }; -"src/chrome/android/profiles/afdo.prof" = runCommand "download_afdo_profile" {} '' - bzip2 -d -c ${fetchurl { - url = "https://storage.googleapis.com/chromeos-prebuilt/afdo-job/llvm/chromeos-chrome-amd64-100.0.4896.62_rc-r1-merged.afdo.bz2"; - sha256 = "0i93na0w0p0ynnfg2ylq8ha4l3i2cfi0r57zzkj679hvszh4l70m"; - }} > $out -''; + "src/chrome/android/profiles/afdo.prof" = runCommand "download_afdo_profile" { } '' + bzip2 -d -c ${ + fetchurl { + url = "https://storage.googleapis.com/chromeos-prebuilt/afdo-job/llvm/chromeos-chrome-amd64-100.0.4896.62_rc-r1-merged.afdo.bz2"; + sha256 = "0i93na0w0p0ynnfg2ylq8ha4l3i2cfi0r57zzkj679hvszh4l70m"; + } + } > $out + ''; -"src/third_party/llvm-build/Release+Asserts" = runCommand "download_upstream_clang" {} '' + "src/third_party/llvm-build/Release+Asserts" = runCommand "download_upstream_clang" { } '' mkdir $out - tar xf ${fetchurl { - url = "https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-15-init-1995-g5bec1ea7-1.tgz"; - sha256 = "0pxx8jr958xi5szxl5hc7yq6gmppg1paw25v4myfnqb62gjzik62"; - }} -C $out -''; + tar xf ${ + fetchurl { + url = "https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-15-init-1995-g5bec1ea7-1.tgz"; + sha256 = "0pxx8jr958xi5szxl5hc7yq6gmppg1paw25v4myfnqb62gjzik62"; + } + } -C $out + ''; } diff --git a/apks/default.nix b/apks/default.nix index b933fa1d..1e8bb903 100644 --- a/apks/default.nix +++ b/apks/default.nix @@ -1,47 +1,64 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ pkgs ? (import ../pkgs {})}: +{ + pkgs ? (import ../pkgs { }), +}: let inherit (pkgs) callPackage lib stdenv; - gradleToNixPatchedFetchers = let - patchJar = jar: stdenv.mkDerivation { - name = "patched.jar"; - src = jar; + gradleToNixPatchedFetchers = + let + patchJar = + jar: + stdenv.mkDerivation { + name = "patched.jar"; + src = jar; - phases = "unpackPhase buildPhase installPhase"; + phases = "unpackPhase buildPhase installPhase"; - nativeBuildInputs = with pkgs; [ unzip zip autoPatchelfHook ]; + nativeBuildInputs = with pkgs; [ + unzip + zip + autoPatchelfHook + ]; - unpackPhase = "unzip $src"; - buildPhase = "autoPatchelf ."; - installPhase = "zip -r $out *"; - }; + unpackPhase = "unzip $src"; + buildPhase = "autoPatchelf ."; + installPhase = "zip -r $out *"; + }; - fetchurl' = args: - if (lib.hasSuffix "-linux.jar" (lib.head args.urls)) - then patchJar (pkgs.fetchurl args) - else pkgs.fetchurl args; - in - { - http = fetchurl'; - https = fetchurl'; - }; + fetchurl' = + args: + if (lib.hasSuffix "-linux.jar" (lib.head args.urls)) then + patchJar (pkgs.fetchurl args) + else + pkgs.fetchurl args; + in + { + http = fetchurl'; + https = fetchurl'; + }; in rec { auditor = callPackage ./auditor { inherit gradleToNixPatchedFetchers; }; fdroid = callPackage ./fdroid { inherit gradleToNixPatchedFetchers; }; - seedvault_10 = callPackage ./seedvault_10 {}; # Old version that works with Android 10 + seedvault_10 = callPackage ./seedvault_10 { }; # Old version that works with Android 10 # Chromium-based browsers - chromium = callPackage ./chromium/default.nix {}; + chromium = callPackage ./chromium/default.nix { }; vanadium = import ./chromium/vanadium.nix { inherit chromium; - inherit (pkgs) fetchFromGitHub git fetchcipd linkFarmFromDrvs fetchurl; + inherit (pkgs) + fetchFromGitHub + git + fetchcipd + linkFarmFromDrvs + fetchurl + ; }; bromite = import ./chromium/bromite.nix { inherit chromium; diff --git a/apks/seedvault_10/default.nix b/apks/seedvault_10/default.nix index 69362601..a8f0fd35 100644 --- a/apks/seedvault_10/default.nix +++ b/apks/seedvault_10/default.nix @@ -1,10 +1,24 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ callPackage, lib, substituteAll, fetchFromGitHub, androidPkgs, jdk, gradle }: +{ + callPackage, + lib, + substituteAll, + fetchFromGitHub, + androidPkgs, + jdk, + gradle, +}: let - androidsdk = androidPkgs.sdk (p: with p; [ cmdline-tools-latest platforms-android-29 build-tools-29-0-2 ]); - buildGradle = callPackage ./gradle-env.nix {}; + androidsdk = androidPkgs.sdk ( + p: with p; [ + cmdline-tools-latest + platforms-android-29 + build-tools-29-0-2 + ] + ); + buildGradle = callPackage ./gradle-env.nix { }; in buildGradle rec { name = "Seedvault-${version}.apk"; @@ -12,12 +26,14 @@ buildGradle rec { envSpec = ./gradle-env.json; - src = (fetchFromGitHub { - owner = "stevesoltys"; - repo = "seedvault"; - rev = "98e34a1eb3c85ad890d49c1199fee6d56269ba7e"; # From android10 branch - sha256 = "059674xv1fmnsnxd5qay28pb1n6jzl6g17ykhcw7b93rpydq3r4g"; - }); + src = ( + fetchFromGitHub { + owner = "stevesoltys"; + repo = "seedvault"; + rev = "98e34a1eb3c85ad890d49c1199fee6d56269ba7e"; # From android10 branch + sha256 = "059674xv1fmnsnxd5qay28pb1n6jzl6g17ykhcw7b93rpydq3r4g"; + } + ); gradleFlags = [ "assembleRelease" ]; diff --git a/apks/seedvault_10/gradle-env.nix b/apks/seedvault_10/gradle-env.nix index 8c07a55d..0342c689 100644 --- a/apks/seedvault_10/gradle-env.nix +++ b/apks/seedvault_10/gradle-env.nix @@ -19,142 +19,194 @@ # ''; # } -{ stdenv, lib, buildEnv, fetchurl, gradleGen, writeText, writeTextDir, runCommandCC, unzip, zip, autoPatchelfHook }: - -{ envSpec -, pname ? null -, version ? null -, enableParallelBuilding ? true -, gradleFlags ? [ "build" ] -, gradlePackage ? null -, enableDebug ? false -, ... } @ args: +{ + stdenv, + lib, + buildEnv, + fetchurl, + gradleGen, + writeText, + writeTextDir, + runCommandCC, + unzip, + zip, + autoPatchelfHook, +}: + +{ + envSpec, + pname ? null, + version ? null, + enableParallelBuilding ? true, + gradleFlags ? [ "build" ], + gradlePackage ? null, + enableDebug ? false, + ... +}@args: let - patchJar = jar: stdenv.mkDerivation { - name = "patched.jar"; - src = jar; - - phases = "unpackPhase buildPhase installPhase"; - - nativeBuildInputs = [ unzip zip autoPatchelfHook ]; - - unpackPhase = "unzip $src"; - buildPhase = "autoPatchelf ."; - installPhase = "zip -r $out *"; - }; + patchJar = + jar: + stdenv.mkDerivation { + name = "patched.jar"; + src = jar; + + phases = "unpackPhase buildPhase installPhase"; + + nativeBuildInputs = [ + unzip + zip + autoPatchelfHook + ]; + + unpackPhase = "unzip $src"; + buildPhase = "autoPatchelf ."; + installPhase = "zip -r $out *"; + }; inherit (builtins) - filter sort replaceStrings attrValues match fromJSON - concatStringsSep; + filter + sort + replaceStrings + attrValues + match + fromJSON + concatStringsSep + ; inherit (lib) - versionOlder unique mapAttrs last concatMapStringsSep removeSuffix - optionalString groupBy' readFile hasSuffix; - - mkDep = depSpec: stdenv.mkDerivation { - inherit (depSpec) name; - - src = let - file = fetchurl { - inherit (depSpec) urls sha256; - }; - # Special case for aapt2-...-linux.jar, which contains a jar with an executable that will need to be patched - in if (lib.hasSuffix "-linux.jar" depSpec.name) then patchJar file else file; + versionOlder + unique + mapAttrs + last + concatMapStringsSep + removeSuffix + optionalString + groupBy' + readFile + hasSuffix + ; + + mkDep = + depSpec: + stdenv.mkDerivation { + inherit (depSpec) name; + + src = + let + file = fetchurl { inherit (depSpec) urls sha256; }; + in + # Special case for aapt2-...-linux.jar, which contains a jar with an executable that will need to be patched + if (lib.hasSuffix "-linux.jar" depSpec.name) then patchJar file else file; - phases = "installPhase"; + phases = "installPhase"; - installPhase = '' - mkdir -p $out/${depSpec.path} - ln -s $src $out/${depSpec.path}/${depSpec.name} - ''; - }; + installPhase = '' + mkdir -p $out/${depSpec.path} + ln -s $src $out/${depSpec.path}/${depSpec.name} + ''; + }; - mkModuleMetadata = deps: + mkModuleMetadata = + deps: let - ids = filter - (id: id.type == "pom") - (map (dep: dep.id) deps); - - modules = groupBy' - (meta: id: - let - isNewer = versionOlder meta.latest id.version; - isNewerRelease = - !(hasSuffix "-SNAPSHOT" id.version) && - versionOlder meta.release id.version; - in { - groupId = id.group; - artifactId = id.name; - latest = if isNewer then id.version else meta.latest; - release = if isNewerRelease then id.version else meta.release; - versions = meta.versions ++ [id.version]; + ids = filter (id: id.type == "pom") (map (dep: dep.id) deps); + + modules = + groupBy' + ( + meta: id: + let + isNewer = versionOlder meta.latest id.version; + isNewerRelease = !(hasSuffix "-SNAPSHOT" id.version) && versionOlder meta.release id.version; + in + { + groupId = id.group; + artifactId = id.name; + latest = if isNewer then id.version else meta.latest; + release = if isNewerRelease then id.version else meta.release; + versions = meta.versions ++ [ id.version ]; + } + ) + { + latest = ""; + release = ""; + versions = [ ]; } - ) - { - latest = ""; - release = ""; - versions = []; - } - (id: "${replaceStrings ["."] ["/"] id.group}/${id.name}/maven-metadata.xml") - ids; + (id: "${replaceStrings [ "." ] [ "/" ] id.group}/${id.name}/maven-metadata.xml") + ids; in - attrValues (mapAttrs (path: meta: + attrValues ( + mapAttrs ( + path: meta: let versions' = sort versionOlder (unique meta.versions); in - with meta; writeTextDir path '' - - - ${groupId} - ${artifactId} - - ${optionalString (latest != "") "${latest}"} - ${optionalString (release != "") "${release}"} - - ${concatMapStringsSep "\n " (v: "${v}") versions'} - - - - '' - ) modules); - - mkSnapshotMetadata = deps: + with meta; + writeTextDir path '' + + + ${groupId} + ${artifactId} + + ${optionalString (latest != "") "${latest}"} + ${optionalString (release != "") "${release}"} + + ${concatMapStringsSep "\n " (v: "${v}") versions'} + + + + '' + ) modules + ); + + mkSnapshotMetadata = + deps: let snapshotDeps = filter (dep: dep ? build && dep ? timestamp) deps; - modules = groupBy' - (meta: dep: - let - id = dep.id; - isNewer = dep.build > meta.buildNumber; - # Timestamp values can be bogus, e.g. jitpack.io - updated = if (match "[0-9]{8}\.[0-9]{6}" dep.timestamp) != null - then replaceStrings ["."] [""] dep.timestamp - else ""; - in { - groupId = id.group; - artifactId = id.name; - version = id.version; - timestamp = if isNewer then dep.timestamp else meta.timestamp; - buildNumber = if isNewer then dep.build else meta.buildNumber; - lastUpdated = if isNewer then updated else meta.lastUpdated; - versions = meta.versions or [] ++ [{ - classifier = id.classifier or ""; - extension = id.extension; - value = "${removeSuffix "-SNAPSHOT" id.version}-${dep.timestamp}-${toString dep.build}"; - updated = updated; - }]; + modules = + groupBy' + ( + meta: dep: + let + id = dep.id; + isNewer = dep.build > meta.buildNumber; + # Timestamp values can be bogus, e.g. jitpack.io + updated = + if (match "[0-9]{8}\.[0-9]{6}" dep.timestamp) != null then + replaceStrings [ "." ] [ "" ] dep.timestamp + else + ""; + in + { + groupId = id.group; + artifactId = id.name; + version = id.version; + timestamp = if isNewer then dep.timestamp else meta.timestamp; + buildNumber = if isNewer then dep.build else meta.buildNumber; + lastUpdated = if isNewer then updated else meta.lastUpdated; + versions = meta.versions or [ ] ++ [ + { + classifier = id.classifier or ""; + extension = id.extension; + value = "${removeSuffix "-SNAPSHOT" id.version}-${dep.timestamp}-${toString dep.build}"; + updated = updated; + } + ]; + } + ) + { + timestamp = ""; + buildNumber = -1; + lastUpdated = ""; } - ) - { - timestamp = ""; - buildNumber = -1; - lastUpdated = ""; - } - (dep: "${replaceStrings ["."] ["/"] dep.id.group}/${dep.id.name}/${dep.id.version}/maven-metadata.xml") - snapshotDeps; + ( + dep: + "${replaceStrings [ "." ] [ "/" ] dep.id.group}/${dep.id.name}/${dep.id.version}/maven-metadata.xml" + ) + snapshotDeps; mkSnapshotVersion = version: '' @@ -166,8 +218,11 @@ let ''; in - attrValues (mapAttrs (path: meta: - with meta; writeTextDir path '' + attrValues ( + mapAttrs ( + path: meta: + with meta; + writeTextDir path '' ${groupId} @@ -185,59 +240,60 @@ let '' - ) modules); - - mkRepo = project: type: deps: buildEnv { - name = "${project}-gradle-${type}-env"; - paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps; - }; + ) modules + ); + + mkRepo = + project: type: deps: + buildEnv { + name = "${project}-gradle-${type}-env"; + paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps; + }; - mkInitScript = projectSpec: + mkInitScript = + projectSpec: let repos = mapAttrs (mkRepo projectSpec.name) projectSpec.dependencies; in - writeText "init.gradle" '' - static def offlineRepo(RepositoryHandler repositories, String env, String path) { - repositories.clear() - repositories.maven { - name "Nix''${env.capitalize()}MavenOffline" - url path - metadataSources { - it.gradleMetadata() - it.mavenPom() - it.artifact() - } - } - repositories.ivy { - name "Nix''${env.capitalize()}IvyOffline" - url path - layout "maven" - metadataSources { - it.gradleMetadata() - it.ivyDescriptor() - it.artifact() - } - } - } - - gradle.settingsEvaluated { - offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}") - } - - gradle.projectsLoaded { - allprojects { - buildscript { - offlineRepo(repositories, "buildscript", "${repos.buildscript}") - } - offlineRepo(repositories, "project", "${repos.project}") - } - } - ''; + writeText "init.gradle" '' + static def offlineRepo(RepositoryHandler repositories, String env, String path) { + repositories.clear() + repositories.maven { + name "Nix''${env.capitalize()}MavenOffline" + url path + metadataSources { + it.gradleMetadata() + it.mavenPom() + it.artifact() + } + } + repositories.ivy { + name "Nix''${env.capitalize()}IvyOffline" + url path + layout "maven" + metadataSources { + it.gradleMetadata() + it.ivyDescriptor() + it.artifact() + } + } + } + + gradle.settingsEvaluated { + offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}") + } + + gradle.projectsLoaded { + allprojects { + buildscript { + offlineRepo(repositories, "buildscript", "${repos.buildscript}") + } + offlineRepo(repositories, "project", "${repos.project}") + } + } + ''; - mkGradle = gradleSpec: - gradleGen.gradleGen { - inherit (gradleSpec) nativeVersion version sha256; - }; + mkGradle = gradleSpec: gradleGen.gradleGen { inherit (gradleSpec) nativeVersion version sha256; }; mkProjectEnv = projectSpec: { inherit (projectSpec) name version; @@ -245,37 +301,40 @@ let gradle = args.gradlePackage or mkGradle projectSpec.gradle; }; - gradleEnv = mapAttrs - (_: p: mkProjectEnv p) - (fromJSON (readFile envSpec)); + gradleEnv = mapAttrs (_: p: mkProjectEnv p) (fromJSON (readFile envSpec)); projectEnv = gradleEnv.""; pname = args.pname or projectEnv.name; version = args.version or projectEnv.version; -in stdenv.mkDerivation (args // { - - inherit pname version; - - nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ projectEnv.gradle ]; - - buildPhase = args.buildPhase or '' - runHook preBuild - - ( - set -x - env \ - "GRADLE_USER_HOME=$(mktemp -d)" \ - gradle --offline --no-daemon --no-build-cache \ - --info --full-stacktrace --warning-mode=all \ - ${optionalString enableParallelBuilding "--parallel"} \ - ${optionalString enableDebug "-Dorg.gradle.debug=true"} \ - --init-script ${projectEnv.initScript} \ - ${concatStringsSep " " gradleFlags} - ) +in +stdenv.mkDerivation ( + args + // { + + inherit pname version; + + nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ projectEnv.gradle ]; + + buildPhase = + args.buildPhase or '' + runHook preBuild + + ( + set -x + env \ + "GRADLE_USER_HOME=$(mktemp -d)" \ + gradle --offline --no-daemon --no-build-cache \ + --info --full-stacktrace --warning-mode=all \ + ${optionalString enableParallelBuilding "--parallel"} \ + ${optionalString enableDebug "-Dorg.gradle.debug=true"} \ + --init-script ${projectEnv.initScript} \ + ${concatStringsSep " " gradleFlags} + ) - runHook postBuild - ''; + runHook postBuild + ''; - dontStrip = true; -}) + dontStrip = true; + } +) diff --git a/check.nix b/check.nix index e38faeea..e7cfe9d3 100644 --- a/check.nix +++ b/check.nix @@ -1,7 +1,9 @@ # SPDX-FileCopyrightText: 2021 Daniel Fullmer # SPDX-License-Identifier: MIT -{ pkgs ? (import ./pkgs {}) }: +{ + pkgs ? (import ./pkgs { }), +}: let lib = pkgs.lib; @@ -9,29 +11,75 @@ let configs = import ./configs.nix { inherit lib; }; # TODO: Reunify with module in reproducibility reports - snakeoilSignedModule = { config, ... }: let - snakeoilKeys = pkgs.runCommand "snakeoil-keys" {} '' - mkdir -p $out - ${config.build.generateKeysScript} $out - ''; - in { - signing.enable = true; - signing.keyStorePath = builtins.toString snakeoilKeys; - signing.buildTimeKeyStorePath = "${snakeoilKeys}"; - }; -in { - check = lib.recurseIntoAttrs (lib.mapAttrs (name: c: (robotnix c).config.build.checkAndroid) configs); + snakeoilSignedModule = + { config, ... }: + let + snakeoilKeys = pkgs.runCommand "snakeoil-keys" { } '' + mkdir -p $out + ${config.build.generateKeysScript} $out + ''; + in + { + signing.enable = true; + signing.keyStorePath = builtins.toString snakeoilKeys; + signing.buildTimeKeyStorePath = "${snakeoilKeys}"; + }; +in +{ + check = lib.recurseIntoAttrs ( + lib.mapAttrs (name: c: (robotnix c).config.build.checkAndroid) configs + ); - lineageosCheck = let - deviceMetadata = lib.importJSON ./flavors/lineageos/device-metadata.json; - in lib.mapAttrs (name: x: (robotnix { device=name; flavor="lineageos"; }).config.build.checkAndroid) deviceMetadata; + lineageosCheck = + let + deviceMetadata = lib.importJSON ./flavors/lineageos/device-metadata.json; + in + lib.mapAttrs ( + name: x: + (robotnix { + device = name; + flavor = "lineageos"; + }).config.build.checkAndroid + ) deviceMetadata; # Generates img and ota files for each configuration using snakeoil keys # Uses IFD - signingCheck = lib.mapAttrs (name: c: { inherit (robotnix { imports = [ snakeoilSignedModule c ]; }) img ota; }) { - "lineageos-10" = { device="marlin"; flavor="lineageos"; androidVersion=10; }; - "vanilla-10" = { device="sunfish"; flavor="vanilla"; androidVersion=10; apv.enable=false; pixel.useUpstreamDriverBinaries=true; }; # APV not working on Android 10... - "vanilla-11" = { device="sunfish"; flavor="vanilla"; androidVersion=11; }; - "vanilla-12" = { device="sunfish"; flavor="vanilla"; androidVersion=12; }; - }; + signingCheck = + lib.mapAttrs + (name: c: { + inherit + (robotnix { + imports = [ + snakeoilSignedModule + c + ]; + }) + img + ota + ; + }) + { + "lineageos-10" = { + device = "marlin"; + flavor = "lineageos"; + androidVersion = 10; + }; + "vanilla-10" = { + device = "sunfish"; + flavor = "vanilla"; + androidVersion = 10; + apv.enable = false; + pixel.useUpstreamDriverBinaries = true; + }; # APV not working on Android 10... + "vanilla-11" = { + device = "sunfish"; + flavor = "vanilla"; + androidVersion = 11; + }; + "vanilla-12" = { + device = "sunfish"; + flavor = "vanilla"; + androidVersion = 12; + }; + }; } diff --git a/components.nix b/components.nix index ba7317ba..2bdfdb2e 100644 --- a/components.nix +++ b/components.nix @@ -1,7 +1,9 @@ # SPDX-FileCopyrightText: 2021 Daniel Fullmer # SPDX-License-Identifier: MIT -{ pkgs ? import ./pkgs {} }: +{ + pkgs ? import ./pkgs { }, +}: # Easier entrypoint to build android components individually # The components.json list is just used as a convenient list of components. @@ -9,9 +11,14 @@ let lib = pkgs.lib; - robotnixBuild = import ./default.nix { configuration={ device="arm64"; flavor="vanilla"; }; }; + robotnixBuild = import ./default.nix { + configuration = { + device = "arm64"; + flavor = "vanilla"; + }; + }; # Created using jq 'with_entries(select(.value.installed | length > 0)) | keys' module-info.json componentNames = lib.importJSON ./components.json; in - lib.genAttrs componentNames (name: robotnixBuild.config.build.mkAndroidComponent name) +lib.genAttrs componentNames (name: robotnixBuild.config.build.mkAndroidComponent name) diff --git a/configs.nix b/configs.nix index 0b6108cf..1d47ebff 100644 --- a/configs.nix +++ b/configs.nix @@ -1,41 +1,149 @@ { lib }: -lib.listToAttrs (builtins.map (c: lib.nameValuePair "${c.flavor}-${c.device}" c) [ - { device="x86_64"; flavor="vanilla"; } - { device="arm64"; flavor="vanilla"; } - { device="marlin"; flavor="vanilla"; androidVersion=10; } # Out-of-date - { device="sailfish"; flavor="vanilla"; androidVersion=10; } # Out-of-date - { device="taimen"; flavor="vanilla"; androidVersion=11; } # Out-of-date - { device="walleye"; flavor="vanilla"; androidVersion=11; } # Out-of-date - { device="crosshatch"; flavor="vanilla"; } - { device="blueline"; flavor="vanilla"; } - { device="bonito"; flavor="vanilla"; } - { device="sargo"; flavor="vanilla"; } - { device="coral"; flavor="vanilla"; } - { device="flame"; flavor="vanilla"; } - { device="sunfish"; flavor="vanilla"; } - { device="bramble"; flavor="vanilla"; } - { device="redfin"; flavor="vanilla"; } - { device="barbet"; flavor="vanilla"; } - { device="raven"; flavor="vanilla"; } - { device="oriole"; flavor="vanilla"; } +lib.listToAttrs ( + builtins.map (c: lib.nameValuePair "${c.flavor}-${c.device}" c) [ + { + device = "x86_64"; + flavor = "vanilla"; + } + { + device = "arm64"; + flavor = "vanilla"; + } + { + device = "marlin"; + flavor = "vanilla"; + androidVersion = 10; + } # Out-of-date + { + device = "sailfish"; + flavor = "vanilla"; + androidVersion = 10; + } # Out-of-date + { + device = "taimen"; + flavor = "vanilla"; + androidVersion = 11; + } # Out-of-date + { + device = "walleye"; + flavor = "vanilla"; + androidVersion = 11; + } # Out-of-date + { + device = "crosshatch"; + flavor = "vanilla"; + } + { + device = "blueline"; + flavor = "vanilla"; + } + { + device = "bonito"; + flavor = "vanilla"; + } + { + device = "sargo"; + flavor = "vanilla"; + } + { + device = "coral"; + flavor = "vanilla"; + } + { + device = "flame"; + flavor = "vanilla"; + } + { + device = "sunfish"; + flavor = "vanilla"; + } + { + device = "bramble"; + flavor = "vanilla"; + } + { + device = "redfin"; + flavor = "vanilla"; + } + { + device = "barbet"; + flavor = "vanilla"; + } + { + device = "raven"; + flavor = "vanilla"; + } + { + device = "oriole"; + flavor = "vanilla"; + } - { device="x86_64"; flavor="grapheneos"; } - { device="arm64"; flavor="grapheneos"; } - { device="crosshatch"; flavor="grapheneos"; } - { device="blueline"; flavor="grapheneos"; } - { device="bonito"; flavor="grapheneos"; } - { device="sargo"; flavor="grapheneos"; } - { device="coral"; flavor="grapheneos"; } - { device="flame"; flavor="grapheneos"; } - { device="sunfish"; flavor="grapheneos"; } - { device="bramble"; flavor="grapheneos"; } - { device="redfin"; flavor="grapheneos"; } - { device="barbet"; flavor="grapheneos"; } + { + device = "x86_64"; + flavor = "grapheneos"; + } + { + device = "arm64"; + flavor = "grapheneos"; + } + { + device = "crosshatch"; + flavor = "grapheneos"; + } + { + device = "blueline"; + flavor = "grapheneos"; + } + { + device = "bonito"; + flavor = "grapheneos"; + } + { + device = "sargo"; + flavor = "grapheneos"; + } + { + device = "coral"; + flavor = "grapheneos"; + } + { + device = "flame"; + flavor = "grapheneos"; + } + { + device = "sunfish"; + flavor = "grapheneos"; + } + { + device = "bramble"; + flavor = "grapheneos"; + } + { + device = "redfin"; + flavor = "grapheneos"; + } + { + device = "barbet"; + flavor = "grapheneos"; + } - { device="marlin"; flavor="lineageos"; } - { device="pioneer"; flavor="lineageos"; } + { + device = "marlin"; + flavor = "lineageos"; + } + { + device = "pioneer"; + flavor = "lineageos"; + } - { device="x86_64"; flavor="anbox"; } - { device="arm64"; flavor="anbox"; } -]) + { + device = "x86_64"; + flavor = "anbox"; + } + { + device = "arm64"; + flavor = "anbox"; + } + ] +) diff --git a/default.nix b/default.nix index 57be17ea..b98c0d79 100644 --- a/default.nix +++ b/default.nix @@ -1,94 +1,116 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ configuration, - pkgs ? (import ./pkgs {}), - lib ? pkgs.lib +{ + configuration, + pkgs ? (import ./pkgs { }), + lib ? pkgs.lib, }: let inherit (lib) mkOption types; - eval = (lib.evalModules { - modules = [ - ({ config, ... }: { - options.nixpkgs.overlays = mkOption { - default = []; - type = types.listOf types.unspecified; - description = "Nixpkgs overlays to override the default packages used while building robotnix."; - }; + eval = ( + lib.evalModules { + modules = [ + ( + { config, ... }: + { + options.nixpkgs.overlays = mkOption { + default = [ ]; + type = types.listOf types.unspecified; + description = "Nixpkgs overlays to override the default packages used while building robotnix."; + }; - config = { - _module.args = let - finalPkgs = pkgs.appendOverlays config.nixpkgs.overlays; - apks = import ./apks { pkgs = finalPkgs; }; - robotnixlib = import ./lib lib; - in { - inherit apks lib robotnixlib; - pkgs = finalPkgs; - }; - }; - }) - configuration - ./flavors/anbox - ./flavors/grapheneos - ./flavors/grapheneos/kernel.nix - ./flavors/lineageos - ./flavors/vanilla - ./flavors/vanilla/10 - ./flavors/vanilla/11 - ./flavors/vanilla/11/kernel - ./flavors/vanilla/12 - ./flavors/waydroid - ./modules/10 - ./modules/11 - ./modules/12 - ./modules/13 - ./modules/9 - ./modules/apps/auditor.nix - ./modules/apps/chromium.nix - ./modules/apps/fdroid.nix - ./modules/apps/prebuilt.nix - ./modules/apps/seedvault.nix - ./modules/apps/updater.nix - ./modules/apv - ./modules/assertions.nix - ./modules/base.nix - ./modules/emulator.nix - ./modules/envpackages.nix - ./modules/etc.nix - ./modules/framework.nix - ./modules/hosts.nix - ./modules/security-pki.nix - ./modules/kernel.nix - ./modules/microg.nix - ./modules/pixel - ./modules/pixel/active-edge.nix - ./modules/pixel/driver-binaries.nix - ./modules/release.nix - ./modules/resources.nix - ./modules/signing.nix - ./modules/source.nix - ./modules/webview.nix - ]; - }); + config = { + _module.args = + let + finalPkgs = pkgs.appendOverlays config.nixpkgs.overlays; + apks = import ./apks { pkgs = finalPkgs; }; + robotnixlib = import ./lib lib; + in + { + inherit apks lib robotnixlib; + pkgs = finalPkgs; + }; + }; + } + ) + configuration + ./flavors/anbox + ./flavors/grapheneos + ./flavors/grapheneos/kernel.nix + ./flavors/lineageos + ./flavors/vanilla + ./flavors/vanilla/10 + ./flavors/vanilla/11 + ./flavors/vanilla/11/kernel + ./flavors/vanilla/12 + ./flavors/waydroid + ./modules/10 + ./modules/11 + ./modules/12 + ./modules/13 + ./modules/9 + ./modules/apps/auditor.nix + ./modules/apps/chromium.nix + ./modules/apps/fdroid.nix + ./modules/apps/prebuilt.nix + ./modules/apps/seedvault.nix + ./modules/apps/updater.nix + ./modules/apv + ./modules/assertions.nix + ./modules/base.nix + ./modules/emulator.nix + ./modules/envpackages.nix + ./modules/etc.nix + ./modules/framework.nix + ./modules/hosts.nix + ./modules/security-pki.nix + ./modules/kernel.nix + ./modules/microg.nix + ./modules/pixel + ./modules/pixel/active-edge.nix + ./modules/pixel/driver-binaries.nix + ./modules/release.nix + ./modules/resources.nix + ./modules/signing.nix + ./modules/source.nix + ./modules/webview.nix + ]; + } + ); # From nixpkgs/nixos/modules/system/activation/top-level.nix failedAssertions = map (x: x.message) (lib.filter (x: !x.assertion) eval.config.assertions); - config = if failedAssertions != [] - then throw "\nFailed assertions:\n${lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}" - else lib.showWarnings eval.config.warnings eval.config; + config = + if failedAssertions != [ ] then + throw "\nFailed assertions:\n${lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}" + else + lib.showWarnings eval.config.warnings eval.config; -in { +in +{ inherit (eval) pkgs options; inherit config; # Things that are nice to have at the top-level, since they might get moved # in the future: inherit (config.build) - targetFiles unsignedTargetFiles signedTargetFiles - ota incrementalOta img factoryImg bootImg recoveryImg otaDir - releaseScript generateKeysScript verifyKeysScript - emulator; + targetFiles + unsignedTargetFiles + signedTargetFiles + ota + incrementalOta + img + factoryImg + bootImg + recoveryImg + otaDir + releaseScript + generateKeysScript + verifyKeysScript + emulator + ; } diff --git a/example.nix b/example.nix index 27f291f9..26a4990d 100644 --- a/example.nix +++ b/example.nix @@ -4,7 +4,12 @@ # This is an example configuration that I personally use for my device. # Please read the manual instead of simply copying this file for your own use. -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let myDomain = "daniel.fullmer.me"; @@ -37,7 +42,8 @@ in }; # Custom hosts file - hosts = pkgs.fetchurl { # 2019-08-14 + hosts = pkgs.fetchurl { + # 2019-08-14 url = "https://raw.githubusercontent.com/StevenBlack/hosts/449a0d7f613e6518ede4f3333e94f8071d3f1cd3/hosts"; sha256 = "1mcn77l2m45qms7ynww2hzx0d6mja03bzj4di0s9j7spycp4540i"; }; diff --git a/flake.lock b/flake.lock index a60fc2f3..7823ac4c 100644 --- a/flake.lock +++ b/flake.lock @@ -43,6 +43,28 @@ "type": "github" } }, + "devshell_2": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": [ + "treefmt", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1713532798, + "narHash": "sha256-wtBhsdMJA3Wa32Wtm1eeo84GejtI43pMrFrmwLXrsEc=", + "owner": "numtide", + "repo": "devshell", + "rev": "12e914740a25ea1891ec619bb53cf5e6ca922e40", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, "flake-compat": { "locked": { "lastModified": 1688025799, @@ -58,6 +80,42 @@ "type": "github" } }, + "flake-compat_2": { + "locked": { + "lastModified": 1688025799, + "narHash": "sha256-ktpB4dRtnksm9F5WawoIkEneh1nrEvuxb5lJFt1iOyw=", + "owner": "nix-community", + "repo": "flake-compat", + "rev": "8bf105319d44f6b9f0d764efa4fdef9f1cc9ba1c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "treefmt", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1712014858, + "narHash": "sha256-sB4SWl2lX95bExY2gMFG5HIzvva5AVMJd4Igm+GpZNw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9126214d0a59633752a136528f5f3b9aa8565b7d", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -94,6 +152,86 @@ "type": "github" } }, + "flake-utils_3": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gomod2nix": { + "inputs": { + "flake-utils": [ + "treefmt", + "devshell", + "flake-utils" + ], + "nixpkgs": [ + "treefmt", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1710154385, + "narHash": "sha256-4c3zQ2YY4BZOufaBJB4v9VBBeN2dH7iVdoJw8SDNCfI=", + "owner": "nix-community", + "repo": "gomod2nix", + "rev": "872b63ddd28f318489c929d25f1f0a3c6039c971", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "gomod2nix", + "type": "github" + } + }, + "nix-filter": { + "locked": { + "lastModified": 1710156097, + "narHash": "sha256-1Wvk8UP7PXdf8bCCaEoMnOT1qe5/Duqgj+rL8sRQsSM=", + "owner": "numtide", + "repo": "nix-filter", + "rev": "3342559a24e85fc164b295c3444e8a139924675b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nix-filter", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "treefmt", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1703863825, + "narHash": "sha256-rXwqjtwiGKJheXB43ybM8NwWB8rO2dSRrEqes0S7F5Y=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "5163432afc817cf8bd1f031418d1869e4c9d5547", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1711703276, @@ -112,11 +250,11 @@ }, "nixpkgs-unstable": { "locked": { - "lastModified": 1716330097, - "narHash": "sha256-8BO3B7e3BiyIDsaKA0tY8O88rClYRTjvAp66y+VBUeU=", + "lastModified": 1717974879, + "narHash": "sha256-GTO3C88+5DX171F/gVS3Qga/hOs/eRMxPFpiHq2t+D8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5710852ba686cc1fd0d3b8e22b3117d43ba374c2", + "rev": "c7b821ba2e1e635ba5a76d299af62821cbcb09f3", "type": "github" }, "original": { @@ -142,12 +280,30 @@ "type": "github" } }, + "nixpkgs_3": { + "locked": { + "lastModified": 1714253743, + "narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "androidPkgs": "androidPkgs", "flake-compat": "flake-compat", "nixpkgs": "nixpkgs_2", - "nixpkgs-unstable": "nixpkgs-unstable" + "nixpkgs-unstable": "nixpkgs-unstable", + "treefmt": "treefmt", + "treefmt-nix": "treefmt-nix_2" } }, "systems": { @@ -179,6 +335,87 @@ "repo": "default", "type": "github" } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt": { + "inputs": { + "devshell": "devshell_2", + "flake-compat": "flake-compat_2", + "flake-parts": "flake-parts", + "gomod2nix": "gomod2nix", + "nix-filter": "nix-filter", + "nix-github-actions": "nix-github-actions", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1718447328, + "narHash": "sha256-Ckvpb2at7lg7AB0XNtIxeo8lWXX+04MVHHKoUs876dg=", + "owner": "numtide", + "repo": "treefmt", + "rev": "30d30b54f0e60a905e9b76321e583a2502205765", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "treefmt", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1715940852, + "narHash": "sha256-wJqHMg/K6X3JGAE9YLM0LsuKrKb4XiBeVaoeMNlReZg=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "2fba33a182602b9d49f0b2440513e5ee091d838b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": [ + "nixpkgs-unstable" + ] + }, + "locked": { + "lastModified": 1715940852, + "narHash": "sha256-wJqHMg/K6X3JGAE9YLM0LsuKrKb4XiBeVaoeMNlReZg=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "2fba33a182602b9d49f0b2440513e5ee091d838b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 84b2676e..ccf25764 100644 --- a/flake.nix +++ b/flake.nix @@ -8,46 +8,80 @@ androidPkgs.url = "github:tadfisher/android-nixpkgs/stable"; flake-compat.url = "github:nix-community/flake-compat"; + + treefmt.url = "github:numtide/treefmt"; + + treefmt-nix.url = "github:numtide/treefmt-nix"; + treefmt-nix.inputs.nixpkgs.follows = "nixpkgs-unstable"; }; - outputs = { self, nixpkgs, nixpkgs-unstable, androidPkgs, flake-compat, ... }@inputs: let - pkgs = import ./pkgs/default.nix { inherit inputs; }; - in { - # robotnixSystem evaluates a robotnix configuration - lib.robotnixSystem = configuration: import ./default.nix { - inherit configuration pkgs; - }; + outputs = + { + self, + nixpkgs, + nixpkgs-unstable, + androidPkgs, + flake-compat, + treefmt, + treefmt-nix, + ... + }@inputs: + let + pkgs = import ./pkgs/default.nix { inherit inputs; }; - defaultTemplate = { - path = ./template; - description = "A basic robotnix configuration"; - }; + treeFmt = treefmt-nix.lib.evalModule pkgs ./treefmt.nix; + pythonForUpdaterScripts = pkgs.python3.withPackages ( + p: with p; [ + mypy + flake8 + pytest + ] + ); + in + { + # robotnixSystem evaluates a robotnix configuration + lib.robotnixSystem = configuration: import ./default.nix { inherit configuration pkgs; }; - nixosModule = import ./nixos; # Contains all robotnix nixos modules - nixosModules.attestation-server = import ./nixos/attestation-server/module.nix; + defaultTemplate = { + path = ./template; + description = "A basic robotnix configuration"; + }; - packages.x86_64-linux = { - manual = (import ./docs { inherit pkgs; }).manual; - gitRepo = pkgs.gitRepo; - }; + nixosModule = import ./nixos; # Contains all robotnix nixos modules + nixosModules.attestation-server = import ./nixos/attestation-server/module.nix; + + packages.x86_64-linux = { + manual = (import ./docs { inherit pkgs; }).manual; + gitRepo = pkgs.gitRepo; + }; - devShell.x86_64-linux = pkgs.mkShell { - name = "robotnix-scripts"; - nativeBuildInputs = with pkgs; [ - # For android updater scripts - (python3.withPackages (p: with p; [ mypy flake8 pytest ])) - gitRepo nix-prefetch-git - curl pup jq - shellcheck - wget - - # For chromium updater script - # python2 - cipd git - - cachix - ]; - PYTHONPATH=./scripts; + devShell.x86_64-linux = pkgs.mkShell { + name = "robotnix-scripts"; + inputsFrom = [ treeFmt.config.build.devShell ]; + nativeBuildInputs = with pkgs; [ + pythonForUpdaterScripts + gitRepo + nix-prefetch-git + curl + pup + jq + shellcheck + wget + + # For chromium updater script + # python2 + cipd + git + + cachix + ]; + PYTHONPATH = ./scripts; + }; + + formatter.x86_64-linux = treeFmt.config.build.wrapper; + + checks.x86_64-linux = { + formatting = treeFmt.config.build.check self; + }; }; - }; } diff --git a/flake/compat.nix b/flake/compat.nix index c6fec7b2..f696bad2 100644 --- a/flake/compat.nix +++ b/flake/compat.nix @@ -1,17 +1,19 @@ -{ system ? builtins.currentSystem }: - let - lock = builtins.fromJSON (builtins.readFile ./../flake.lock); - flake-compat-entry = lock.nodes.root.inputs.flake-compat; +{ + system ? builtins.currentSystem, +}: +let + lock = builtins.fromJSON (builtins.readFile ./../flake.lock); + flake-compat-entry = lock.nodes.root.inputs.flake-compat; - inherit (lock.nodes."${ flake-compat-entry }".locked) owner repo narHash; + inherit (lock.nodes."${flake-compat-entry}".locked) owner repo narHash; - flake-compat = builtins.fetchTarball { - url = "https://github.com/${ owner }/${ repo }/archive/${ lock.nodes.flake-compat.locked.rev }.tar.gz"; - sha256 = narHash; - }; - in - import flake-compat { - inherit system; + flake-compat = builtins.fetchTarball { + url = "https://github.com/${owner}/${repo}/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; + sha256 = narHash; + }; +in +import flake-compat { + inherit system; - src = ./..; - } + src = ./..; +} diff --git a/flavors/anbox/default.nix b/flavors/anbox/default.nix index e823acc4..fdd9e1db 100644 --- a/flavors/anbox/default.nix +++ b/flavors/anbox/default.nix @@ -2,17 +2,18 @@ # SPDX-FileCopyrightText: 2021 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) - mkDefault - mkIf - mkMerge - ; + inherit (lib) mkDefault mkIf mkMerge; anboxBranch = "pmanbox"; repoDirs = lib.importJSON (./. + "/repo-${anboxBranch}.json"); -in mkIf (config.flavor == "anbox") -{ +in +mkIf (config.flavor == "anbox") { androidVersion = mkDefault 7; # product names start with "anbox_" @@ -25,19 +26,19 @@ in mkIf (config.flavor == "anbox") source.dirs = mkMerge ([ repoDirs - { - "build".patches = [ ./webview-hack.patch ]; - } + { "build".patches = [ ./webview-hack.patch ]; } ]); source.manifest.url = mkDefault "https://github.com/pmanbox/platform_manifests.git"; source.manifest.rev = mkDefault "refs/heads/${anboxBranch}"; - envVars.RELEASE_TYPE = mkDefault "EXPERIMENTAL"; # Other options are RELEASE NIGHTLY SNAPSHOT EXPERIMENTAL + envVars.RELEASE_TYPE = mkDefault "EXPERIMENTAL"; # Other options are RELEASE NIGHTLY SNAPSHOT EXPERIMENTAL build = { anbox = config.build.mkAndroid { name = "robotnix-${config.productName}-${config.buildNumber}"; - makeTargets = [ /* default */ ]; + makeTargets = [ + # default + ]; # How postmarketOS packages theirs: # https://gitlab.com/postmarketOS/anbox-image-make/ # Which in turn calls `create-package.sh` diff --git a/flavors/anbox/update.sh b/flavors/anbox/update.sh index 4b5ddfc1..7c53e906 100755 --- a/flavors/anbox/update.sh +++ b/flavors/anbox/update.sh @@ -8,10 +8,10 @@ set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")" args=( - --cache-search-path ../../ - --ref-type branch - "https://github.com/pmanbox/platform_manifests" - "pmanbox" # static branch name + --cache-search-path ../../ + --ref-type branch + "https://github.com/pmanbox/platform_manifests" + "pmanbox" # static branch name ) export TMPDIR=/tmp diff --git a/flavors/grapheneos/default.nix b/flavors/grapheneos/default.nix index 119affc5..88cf059d 100644 --- a/flavors/grapheneos/default.nix +++ b/flavors/grapheneos/default.nix @@ -1,114 +1,163 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) - optional optionalString optionalAttrs elem - mkIf mkMerge mkDefault mkForce; + optional + optionalString + optionalAttrs + elem + mkIf + mkMerge + mkDefault + mkForce + ; upstreamParams = import ./upstream-params.nix; grapheneOSRelease = "${config.apv.buildID}.${upstreamParams.buildNumber}"; - phoneDeviceFamilies = [ "crosshatch" "bonito" "coral" "sunfish" "redfin" "barbet" ]; - supportedDeviceFamilies = phoneDeviceFamilies ++ [ "generic" ]; - -in mkIf (config.flavor == "grapheneos") (mkMerge [ -{ - buildNumber = mkDefault upstreamParams.buildNumber; - buildDateTime = mkDefault upstreamParams.buildDateTime; - - productNamePrefix = mkDefault ""; - - # Match upstream user/hostname - envVars = { - BUILD_USERNAME = "grapheneos"; - BUILD_HOSTNAME = "grapheneos"; - }; - - source.dirs = lib.importJSON (./. + "/repo-${grapheneOSRelease}.json"); - - apv.enable = mkIf (elem config.deviceFamily phoneDeviceFamilies) (mkDefault true); - apv.buildID = mkDefault ( - if (elem config.device [ "crosshatch" "blueline" ]) then "SP1A.210812.016.C1" - else "SP2A.220405.003" - ); - - # Not strictly necessary for me to set these, since I override the source.dirs above - source.manifest.url = mkDefault "https://github.com/GrapheneOS/platform_manifest.git"; - source.manifest.rev = mkDefault "refs/tags/${grapheneOSRelease}"; - - warnings = (optional ((config.device != null) && !(elem config.deviceFamily supportedDeviceFamilies)) - "${config.device} is not a supported device for GrapheneOS") - ++ (optional (!(elem config.androidVersion [ 12 ])) "Unsupported androidVersion (!= 12) for GrapheneOS") - ++ (optional (config.deviceFamily == "crosshatch") "crosshatch/blueline are considered legacy devices and receive only extended support updates from GrapheneOS and no longer receive vendor updates from Google"); -} -{ - # Upstream tag doesn't always set the BUILD_ID and platform security patch correctly for legacy crosshatch/blueline - source.dirs."build/make".postPatch = mkIf (elem config.device [ "crosshatch" "blueline" ]) '' - echo BUILD_ID=SP1A.210812.016.C1 > core/build_id.mk - sed -i 's/PLATFORM_SECURITY_PATCH := 2021-11-05/PLATFORM_SECURITY_PATCH := 2021-11-01/g' core/version_defaults.mk - ''; - - # Disable setting SCHED_BATCH in soong. Brings in a new dependency and the nix-daemon could do that anyway. - source.dirs."build/soong".patches = [ - (pkgs.fetchpatch { - url = "https://github.com/GrapheneOS/platform_build_soong/commit/76723b5745f08e88efa99295fbb53ed60e80af92.patch"; - sha256 = "0vvairss3h3f9ybfgxihp5i8yk0rsnyhpvkm473g6dc49lv90ggq"; - revert = true; - }) + phoneDeviceFamilies = [ + "crosshatch" + "bonito" + "coral" + "sunfish" + "redfin" + "barbet" ]; + supportedDeviceFamilies = phoneDeviceFamilies ++ [ "generic" ]; - # No need to include kernel sources in Android source trees since we build separately - source.dirs."kernel/google/marlin".enable = false; - source.dirs."kernel/google/wahoo".enable = false; - source.dirs."kernel/google/crosshatch".enable = false; - source.dirs."kernel/google/bonito".enable = false; - source.dirs."kernel/google/coral".enable = false; - source.dirs."kernel/google/sunfish".enable = false; - source.dirs."kernel/google/redbull".enable = false; - source.dirs."kernel/google/barbet".enable = false; - - kernel.enable = mkDefault (elem config.deviceFamily phoneDeviceFamilies); - - # Enable Vanadium (GraphaneOS's chromium fork). - apps.vanadium.enable = mkDefault true; - webview.vanadium.enable = mkDefault true; - webview.vanadium.availableByDefault = mkDefault true; - - apps.seedvault.includedInFlavor = mkDefault true; - apps.updater.includedInFlavor = mkDefault true; - - # Remove upstream prebuilt versions from build. We build from source ourselves. - removedProductPackages = [ "TrichromeWebView" "TrichromeChrome" "webview" ]; - source.dirs."external/vanadium".enable = false; - - # Override included android-prepare-vendor, with the exact version from - # GrapheneOS. Unfortunately, Doing it this way means we don't cache apv - # output across vanilla/grapheneos, even if they are otherwise identical. - source.dirs."vendor/android-prepare-vendor".enable = false; - nixpkgs.overlays = [ (self: super: { - android-prepare-vendor = super.android-prepare-vendor.overrideAttrs (_: { - src = config.source.dirs."vendor/android-prepare-vendor".src; - patches = [ - ./apv/0001-Just-write-proprietary-blobs.txt-to-current-dir.patch - ./apv/0002-Allow-for-externally-set-config-file.patch - ./apv/0003-Add-option-to-use-externally-provided-carrier_list.p.patch - ]; - passthru.evalTimeSrc = builtins.fetchTarball { - url = "https://github.com/GrapheneOS/android-prepare-vendor/archive/${config.source.dirs."vendor/android-prepare-vendor".rev}.tar.gz"; - inherit (config.source.dirs."vendor/android-prepare-vendor") sha256; - }; - }); - }) ]; - - # GrapheneOS just disables apex updating wholesale - signing.apex.enable = false; - - # Extra packages that should use releasekey - signing.signTargetFilesArgs = [ "--extra_apks OsuLogin.apk,ServiceWifiResources.apk=$KEYSDIR/${config.device}/releasekey" ]; - - # Leave the existing auditor in the build--just in case the user wants to - # audit devices running the official upstream build -} +in +mkIf (config.flavor == "grapheneos") (mkMerge [ + { + buildNumber = mkDefault upstreamParams.buildNumber; + buildDateTime = mkDefault upstreamParams.buildDateTime; + + productNamePrefix = mkDefault ""; + + # Match upstream user/hostname + envVars = { + BUILD_USERNAME = "grapheneos"; + BUILD_HOSTNAME = "grapheneos"; + }; + + source.dirs = lib.importJSON (./. + "/repo-${grapheneOSRelease}.json"); + + apv.enable = mkIf (elem config.deviceFamily phoneDeviceFamilies) (mkDefault true); + apv.buildID = mkDefault ( + if + (elem config.device [ + "crosshatch" + "blueline" + ]) + then + "SP1A.210812.016.C1" + else + "SP2A.220405.003" + ); + + # Not strictly necessary for me to set these, since I override the source.dirs above + source.manifest.url = mkDefault "https://github.com/GrapheneOS/platform_manifest.git"; + source.manifest.rev = mkDefault "refs/tags/${grapheneOSRelease}"; + + warnings = + (optional ( + (config.device != null) && !(elem config.deviceFamily supportedDeviceFamilies) + ) "${config.device} is not a supported device for GrapheneOS") + ++ (optional ( + !(elem config.androidVersion [ 12 ]) + ) "Unsupported androidVersion (!= 12) for GrapheneOS") + ++ (optional (config.deviceFamily == "crosshatch") + "crosshatch/blueline are considered legacy devices and receive only extended support updates from GrapheneOS and no longer receive vendor updates from Google" + ); + } + { + # Upstream tag doesn't always set the BUILD_ID and platform security patch correctly for legacy crosshatch/blueline + source.dirs."build/make".postPatch = + mkIf + (elem config.device [ + "crosshatch" + "blueline" + ]) + '' + echo BUILD_ID=SP1A.210812.016.C1 > core/build_id.mk + sed -i 's/PLATFORM_SECURITY_PATCH := 2021-11-05/PLATFORM_SECURITY_PATCH := 2021-11-01/g' core/version_defaults.mk + ''; + + # Disable setting SCHED_BATCH in soong. Brings in a new dependency and the nix-daemon could do that anyway. + source.dirs."build/soong".patches = [ + (pkgs.fetchpatch { + url = "https://github.com/GrapheneOS/platform_build_soong/commit/76723b5745f08e88efa99295fbb53ed60e80af92.patch"; + sha256 = "0vvairss3h3f9ybfgxihp5i8yk0rsnyhpvkm473g6dc49lv90ggq"; + revert = true; + }) + ]; + + # No need to include kernel sources in Android source trees since we build separately + source.dirs."kernel/google/marlin".enable = false; + source.dirs."kernel/google/wahoo".enable = false; + source.dirs."kernel/google/crosshatch".enable = false; + source.dirs."kernel/google/bonito".enable = false; + source.dirs."kernel/google/coral".enable = false; + source.dirs."kernel/google/sunfish".enable = false; + source.dirs."kernel/google/redbull".enable = false; + source.dirs."kernel/google/barbet".enable = false; + + kernel.enable = mkDefault (elem config.deviceFamily phoneDeviceFamilies); + + # Enable Vanadium (GraphaneOS's chromium fork). + apps.vanadium.enable = mkDefault true; + webview.vanadium.enable = mkDefault true; + webview.vanadium.availableByDefault = mkDefault true; + + apps.seedvault.includedInFlavor = mkDefault true; + apps.updater.includedInFlavor = mkDefault true; + + # Remove upstream prebuilt versions from build. We build from source ourselves. + removedProductPackages = [ + "TrichromeWebView" + "TrichromeChrome" + "webview" + ]; + source.dirs."external/vanadium".enable = false; + + # Override included android-prepare-vendor, with the exact version from + # GrapheneOS. Unfortunately, Doing it this way means we don't cache apv + # output across vanilla/grapheneos, even if they are otherwise identical. + source.dirs."vendor/android-prepare-vendor".enable = false; + nixpkgs.overlays = [ + (self: super: { + android-prepare-vendor = super.android-prepare-vendor.overrideAttrs (_: { + src = config.source.dirs."vendor/android-prepare-vendor".src; + patches = [ + ./apv/0001-Just-write-proprietary-blobs.txt-to-current-dir.patch + ./apv/0002-Allow-for-externally-set-config-file.patch + ./apv/0003-Add-option-to-use-externally-provided-carrier_list.p.patch + ]; + passthru.evalTimeSrc = builtins.fetchTarball { + url = "https://github.com/GrapheneOS/android-prepare-vendor/archive/${ + config.source.dirs."vendor/android-prepare-vendor".rev + }.tar.gz"; + inherit (config.source.dirs."vendor/android-prepare-vendor") sha256; + }; + }); + }) + ]; + + # GrapheneOS just disables apex updating wholesale + signing.apex.enable = false; + + # Extra packages that should use releasekey + signing.signTargetFilesArgs = [ + "--extra_apks OsuLogin.apk,ServiceWifiResources.apk=$KEYSDIR/${config.device}/releasekey" + ]; + + # Leave the existing auditor in the build--just in case the user wants to + # audit devices running the official upstream build + } ]) diff --git a/flavors/grapheneos/extract-upstream-params.sh b/flavors/grapheneos/extract-upstream-params.sh index a42baaaf..90521e1c 100755 --- a/flavors/grapheneos/extract-upstream-params.sh +++ b/flavors/grapheneos/extract-upstream-params.sh @@ -17,7 +17,7 @@ METADATA=$(curl -sSfL https://releases.grapheneos.org/${DEVICE}-${CHANNEL}) BUILD_NUMBER=$(echo "$METADATA" | cut -d" " -f1) BUILD_DATETIME=$(echo "$METADATA" | cut -d" " -f2) -cat < upstream-params.nix +cat <upstream-params.nix { buildNumber = "${BUILD_NUMBER}"; buildDateTime = ${BUILD_DATETIME}; diff --git a/flavors/grapheneos/kernel.nix b/flavors/grapheneos/kernel.nix index 4eac31d9..d2dc7b79 100644 --- a/flavors/grapheneos/kernel.nix +++ b/flavors/grapheneos/kernel.nix @@ -1,129 +1,179 @@ -{ config, lib, pkgs, ... }: +{ + config, + lib, + pkgs, + ... +}: let - inherit (lib) - mkIf mkMerge mkDefault; + inherit (lib) mkIf mkMerge mkDefault; clangVersion = "r416183b"; - postRedfin = lib.elem config.deviceFamily [ "redfin" "barbet" ]; - - dependencies = let - fixupRepo = repoName: { buildInputs ? [], ... }@args: pkgs.stdenv.mkDerivation ({ - name = lib.strings.sanitizeDerivationName repoName; - src = config.source.dirs.${repoName}.src; - buildInputs = with pkgs; buildInputs ++ [ autoPatchelfHook ]; - installPhase = '' - runHook preInstall - rm -f env-vars - cp -r . $out - runHook postInstall - ''; - } // (lib.filterAttrs (n: v: n != "buildInputs") args)); - in lib.mapAttrs (n: v: fixupRepo n v) ({ - "prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9" = { buildInputs = with pkgs; [ python ]; }; - "prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" = { buildInputs = with pkgs; [ python ]; }; - "prebuilts/clang/host/linux-x86/clang-${clangVersion}"= { - src = config.source.dirs."prebuilts/clang/host/linux-x86".src + "/clang-${clangVersion}"; - buildInputs = with pkgs; [ - zlib ncurses5 libedit - stdenv.cc.cc.lib # For libstdc++.so.6 - python39 # LLDB links against this particular version of python - ]; - postPatch = '' - rm -r python3 - ''; - autoPatchelfIgnoreMissingDeps=true; # Ignore missing liblog.so - }; - "prebuilts/gas/linux-x86" = {}; - "prebuilts/misc/linux-x86" = { - src = config.source.dirs."prebuilts/misc".src + "/linux-x86"; - buildInputs = with pkgs; [ python ]; - }; - "kernel/prebuilts/build-tools" = { - src = config.source.dirs."kernel/prebuilts/build-tools".src; - buildInputs = with pkgs; [ python ]; - postInstall = '' - # Workaround for patchelf not working with embedded python interpreter - cp ${config.source.dirs."system/libufdt".src}/utils/src/mkdtboimg.py $out/linux-x86/bin - ''; - }; - }); - - repoName = { - "sargo" = "crosshatch"; - "bonito" = "crosshatch"; - "sunfish" = "coral"; - "bramble" = "redbull"; - "redfin" = "redbull"; - }.${config.device} or config.deviceFamily; + postRedfin = lib.elem config.deviceFamily [ + "redfin" + "barbet" + ]; + + dependencies = + let + fixupRepo = + repoName: + { + buildInputs ? [ ], + ... + }@args: + pkgs.stdenv.mkDerivation ( + { + name = lib.strings.sanitizeDerivationName repoName; + src = config.source.dirs.${repoName}.src; + buildInputs = with pkgs; buildInputs ++ [ autoPatchelfHook ]; + installPhase = '' + runHook preInstall + rm -f env-vars + cp -r . $out + runHook postInstall + ''; + } + // (lib.filterAttrs (n: v: n != "buildInputs") args) + ); + in + lib.mapAttrs (n: v: fixupRepo n v) ({ + "prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9" = { + buildInputs = with pkgs; [ python ]; + }; + "prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" = { + buildInputs = with pkgs; [ python ]; + }; + "prebuilts/clang/host/linux-x86/clang-${clangVersion}" = { + src = config.source.dirs."prebuilts/clang/host/linux-x86".src + "/clang-${clangVersion}"; + buildInputs = with pkgs; [ + zlib + ncurses5 + libedit + stdenv.cc.cc.lib # For libstdc++.so.6 + python39 # LLDB links against this particular version of python + ]; + postPatch = '' + rm -r python3 + ''; + autoPatchelfIgnoreMissingDeps = true; # Ignore missing liblog.so + }; + "prebuilts/gas/linux-x86" = { }; + "prebuilts/misc/linux-x86" = { + src = config.source.dirs."prebuilts/misc".src + "/linux-x86"; + buildInputs = with pkgs; [ python ]; + }; + "kernel/prebuilts/build-tools" = { + src = config.source.dirs."kernel/prebuilts/build-tools".src; + buildInputs = with pkgs; [ python ]; + postInstall = '' + # Workaround for patchelf not working with embedded python interpreter + cp ${config.source.dirs."system/libufdt".src}/utils/src/mkdtboimg.py $out/linux-x86/bin + ''; + }; + }); + + repoName = + { + "sargo" = "crosshatch"; + "bonito" = "crosshatch"; + "sunfish" = "coral"; + "bramble" = "redbull"; + "redfin" = "redbull"; + } + .${config.device} or config.deviceFamily; sourceRelpath = "kernel/google/${repoName}"; - builtKernelName = { - "sargo" = "bonito"; - "flame" = "coral"; - "sunfish" = "coral"; - }.${config.device} or config.device; + builtKernelName = + { + "sargo" = "bonito"; + "flame" = "coral"; + "sunfish" = "coral"; + } + .${config.device} or config.device; builtRelpath = "device/google/${builtKernelName}-kernel"; kernel = pkgs.stdenv.mkDerivation { name = "grapheneos-${builtKernelName}-kernel"; inherit (config.kernel) src patches postPatch; - nativeBuildInputs = with pkgs; [ - perl bc nettools openssl rsync gmp libmpc mpfr lz4 which - nukeReferences - ] ++ lib.optionals postRedfin [ - python bison flex cpio - ]; + nativeBuildInputs = + with pkgs; + [ + perl + bc + nettools + openssl + rsync + gmp + libmpc + mpfr + lz4 + which + nukeReferences + ] + ++ lib.optionals postRedfin [ + python + bison + flex + cpio + ]; preUnpack = '' - ${lib.concatStringsSep "\n" (lib.mapAttrsToList (n: v: "mkdir -p $(dirname ${n}); ln -s ${v} ${n}") dependencies)} + ${lib.concatStringsSep "\n" ( + lib.mapAttrsToList (n: v: "mkdir -p $(dirname ${n}); ln -s ${v} ${n}") dependencies + )} mkdir -p $(dirname ${sourceRelpath}) cd $(dirname ${sourceRelpath}) ''; - prePatch = '' - # From os-specific/linux/kernel/manual-config.nix in nixpkgs - for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do - echo "stripping FHS paths in \`$mf'..." - sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g' - done - sed -i scripts/ld-version.sh -e "s|/usr/bin/awk|${pkgs.gawk}/bin/awk|" + prePatch = + '' + # From os-specific/linux/kernel/manual-config.nix in nixpkgs + for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do + echo "stripping FHS paths in \`$mf'..." + sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g' + done + sed -i scripts/ld-version.sh -e "s|/usr/bin/awk|${pkgs.gawk}/bin/awk|" - if [[ -f scripts/generate_initcall_order.pl ]]; then - patchShebangs scripts/generate_initcall_order.pl - fi + if [[ -f scripts/generate_initcall_order.pl ]]; then + patchShebangs scripts/generate_initcall_order.pl + fi - # Set kernel timestamp - substituteInPlace build.sh \ - --replace "\$(git show -s --format=%ct)" "${builtins.toString config.kernel.buildDateTime}" + # Set kernel timestamp + substituteInPlace build.sh \ + --replace "\$(git show -s --format=%ct)" "${builtins.toString config.kernel.buildDateTime}" - sed -i '/^chrt/d' build.sh + sed -i '/^chrt/d' build.sh - # TODO: Not using prebuilt clang for HOSTCC/HOSTCXX/HOSTLD, since it refers to FHS sysroot and not the sysroot from nixpkgs. - sed -i '/HOST.*=/d' build.sh + # TODO: Not using prebuilt clang for HOSTCC/HOSTCXX/HOSTLD, since it refers to FHS sysroot and not the sysroot from nixpkgs. + sed -i '/HOST.*=/d' build.sh - '' + lib.optionalString postRedfin '' - # TODO: Remove HOSTCC / HOSTCXX. Currently, removing it makes it fail: - # ../scripts/basic/fixdep.c:97:10: fatal error: 'sys/types.h' file not found - sed -i '/make.*\\/a HOSTCC=gcc \\\n HOSTCXX=g++ \\' build.sh + '' + + lib.optionalString postRedfin '' + # TODO: Remove HOSTCC / HOSTCXX. Currently, removing it makes it fail: + # ../scripts/basic/fixdep.c:97:10: fatal error: 'sys/types.h' file not found + sed -i '/make.*\\/a HOSTCC=gcc \\\n HOSTCXX=g++ \\' build.sh - ''; + ''; # Useful to use upstream's build.sh to catch regressions if any dependencies change - buildPhase = let - useCodenameArg = true; - in '' - mkdir -p ../../../${builtRelpath} - bash ./build.sh ${lib.optionalString useCodenameArg builtKernelName} - ''; + buildPhase = + let + useCodenameArg = true; + in + '' + mkdir -p ../../../${builtRelpath} + bash ./build.sh ${lib.optionalString useCodenameArg builtKernelName} + ''; installPhase = '' cp -r ../../../${builtRelpath} $out ''; }; -in mkIf (config.flavor == "grapheneos" && config.kernel.enable) { +in +mkIf (config.flavor == "grapheneos" && config.kernel.enable) { kernel.src = mkDefault config.source.dirs.${sourceRelpath}.src; kernel.buildDateTime = mkDefault config.source.dirs.${sourceRelpath}.dateTime; kernel.relpath = mkDefault builtRelpath; diff --git a/flavors/grapheneos/update.sh b/flavors/grapheneos/update.sh index d2b8446f..e0da16af 100755 --- a/flavors/grapheneos/update.sh +++ b/flavors/grapheneos/update.sh @@ -9,15 +9,15 @@ cd "$(dirname "${BASH_SOURCE[0]}")" ../../modules/apv/update-carrierlist.sh args=( - --cache-search-path ../../ - --ref-type tag - "https://github.com/GrapheneOS/platform_manifest" - --project-fetch-submodules "kernel/google/crosshatch" - --project-fetch-submodules "kernel/google/coral" - --project-fetch-submodules "kernel/google/sunfish" - --project-fetch-submodules "kernel/google/redbull" - --project-fetch-submodules "kernel/google/barbet" - "$@" + --cache-search-path ../../ + --ref-type tag + "https://github.com/GrapheneOS/platform_manifest" + --project-fetch-submodules "kernel/google/crosshatch" + --project-fetch-submodules "kernel/google/coral" + --project-fetch-submodules "kernel/google/sunfish" + --project-fetch-submodules "kernel/google/redbull" + --project-fetch-submodules "kernel/google/barbet" + "$@" ) export TMPDIR=/tmp diff --git a/flavors/lineageos/default.nix b/flavors/lineageos/default.nix index a0461706..c6039b29 100644 --- a/flavors/lineageos/default.nix +++ b/flavors/lineageos/default.nix @@ -1,15 +1,39 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) - optional optionals optionalString optionalAttrs - elem filter - mapAttrs mapAttrs' nameValuePair filterAttrs - attrNames getAttrs flatten remove - mkIf mkMerge mkDefault mkForce - importJSON toLower hasPrefix removePrefix hasSuffix replaceStrings; + optional + optionals + optionalString + optionalAttrs + elem + filter + mapAttrs + mapAttrs' + nameValuePair + filterAttrs + attrNames + getAttrs + flatten + remove + mkIf + mkMerge + mkDefault + mkForce + importJSON + toLower + hasPrefix + removePrefix + hasSuffix + replaceStrings + ; androidVersionToLineageBranch = { "10" = "lineage-17.1"; @@ -17,7 +41,9 @@ let "12" = "lineage-19.1"; "13" = "lineage-20.0"; }; - lineageBranchToAndroidVersion = mapAttrs' (name: value: nameValuePair value name) androidVersionToLineageBranch; + lineageBranchToAndroidVersion = mapAttrs' ( + name: value: nameValuePair value name + ) androidVersionToLineageBranch; deviceMetadata = lib.importJSON ./device-metadata.json; LineageOSRelease = androidVersionToLineageBranch.${builtins.toString config.androidVersion}; @@ -31,7 +57,8 @@ let 's/^DTB_OBJS := $(shell find \(.*\))$/DTB_OBJS := $(sort $(shell find \1))/' \ arch/arm64/boot/Makefile ''; - kernelsNeedFix = [ # Only verified marlin reproducibility is fixed by this, however these other repos have the same issue + kernelsNeedFix = [ + # Only verified marlin reproducibility is fixed by this, however these other repos have the same issue "kernel/asus/sm8150" "kernel/bq/msm8953" "kernel/essential/msm8998" @@ -56,24 +83,47 @@ let "kernel/zuk/msm8996" ]; # Patch kernels - patchKernelDir = n: v: v // (optionalAttrs (hasPrefix "kernel/" n) { - patches = config.kernel.patches; - postPatch = config.kernel.postPatch - + optionalString (config.useReproducibilityFixes && (elem n kernelsNeedFix)) ("\n" + dtbReproducibilityFix); - }); + patchKernelDir = + n: v: + v + // (optionalAttrs (hasPrefix "kernel/" n) { + patches = config.kernel.patches; + postPatch = + config.kernel.postPatch + + optionalString (config.useReproducibilityFixes && (elem n kernelsNeedFix)) ( + "\n" + dtbReproducibilityFix + ); + }); deviceDirs = mapAttrs patchKernelDir _deviceDirs; supportedDevices = attrNames deviceMetadata; # TODO: Move this filtering into vanilla/graphene - filterDirAttrs = dir: filterAttrs (n: v: elem n ["rev" "sha256" "url" "patches" "postPatch"]) dir; + filterDirAttrs = + dir: + filterAttrs ( + n: v: + elem n [ + "rev" + "sha256" + "url" + "patches" + "postPatch" + ] + ) dir; filterDirsAttrs = dirs: mapAttrs (n: v: filterDirAttrs v) dirs; -in mkIf (config.flavor == "lineageos") -{ - androidVersion = let +in +mkIf (config.flavor == "lineageos") { + androidVersion = + let defaultBranch = deviceMetadata.${config.device}.branch; - in mkIf (deviceMetadata ? ${config.device}) (mkDefault (lib.toInt lineageBranchToAndroidVersion.${defaultBranch})); - flavorVersion = removePrefix "lineage-" androidVersionToLineageBranch.${toString config.androidVersion}; + in + mkIf (deviceMetadata ? ${config.device}) ( + mkDefault (lib.toInt lineageBranchToAndroidVersion.${defaultBranch}) + ); + flavorVersion = + removePrefix "lineage-" + androidVersionToLineageBranch.${toString config.androidVersion}; productNamePrefix = "lineage_"; # product names start with "lineage_" @@ -82,76 +132,96 @@ in mkIf (config.flavor == "lineageos") # LineageOS uses this by default. If your device supports it, I recommend using variant = "user" variant = mkDefault "userdebug"; - warnings = let - isUnsupportedDevice = config.device != null && !(elem config.device supportedDevices) && config.deviceFamily != "generic"; - isUnmaintained = lib.versionOlder (toString config.androidVersion) "13"; - in optional isUnsupportedDevice "${config.device} is not an officially-supported device for LineageOS" - ++ optional isUnmaintained "${LineageOSRelease} is unmaintained in robotnix and may break at any time"; - - source.dirs = mkMerge ([ - repoDirs - - { - "vendor/lineage".patches = [ - (if lib.versionAtLeast (toString config.androidVersion) "13" - then ./0001-Remove-LineageOS-keys-20.patch - else ./0001-Remove-LineageOS-keys-19.patch) - - (pkgs.substituteAll { - src = ./0002-bootanimation-Reproducibility-fix.patch; - inherit (pkgs) imagemagick; - }) - - (if lib.versionAtLeast (toString config.androidVersion) "13" - then ./0003-kernel-Set-constant-kernel-timestamp-20.patch - else ./0003-kernel-Set-constant-kernel-timestamp-19.patch) - - ] ++ lib.optionals (lib.versionAtLeast (toString config.androidVersion) "13") [ - ./dont-run-repo-during-build.patch - ]; - "system/extras".patches = [ - # pkgutil.get_data() not working, probably because we don't use their compiled python - (pkgs.fetchpatch { - url = "https://github.com/LineageOS/android_system_extras/commit/7da4b29321eb7ebce9eb9a43d0fbd85d0aa1e870.patch"; - sha256 = "0pv56lypdpsn66s7ffcps5ykyfx0hjkazml89flj7p1px12zjhy1"; - revert = true; - }) - ]; - - # LineageOS will sometimes force-push to this repo, and the older revisions are garbage collected. - # So we'll just build chromium webview ourselves. - "external/chromium-webview".enable = false; - } - ] ++ optionals (deviceMetadata ? "${config.device}") (let - # Device-specific source dirs - vendor = toLower deviceMetadata.${config.device}.vendor; - deviceRelpath = "device/${vendor}/${config.device}"; - - # Retuns a list of all relpaths for the device (including deps) recursively - relpathWithDeps = relpath: [ relpath ] ++ ( - flatten (map (p: relpathWithDeps p) deviceDirs.${relpath}.deps) - ); - # All relpaths required by the device - relpaths = relpathWithDeps deviceRelpath; - filteredRelpaths = remove (attrNames repoDirs) relpaths; # Remove any repos that we're already including from repo json - - # In LOS20, each device/ relpath has an associated vendor/ relpath. - # Well, usually... - deviceRelpaths = filter (path: hasPrefix "device/" path) relpaths; - vendorifiedRelpaths = map (replaceStrings [ "device/" ] [ "vendor/" ]) deviceRelpaths; - - vendorRelpaths = if config.androidVersion >= 13 then ( - # LOS20 needs vendor/$vendor/$device and all the common dirs but with - # vendor/ prefix - vendorifiedRelpaths - ) else [ - # Older LOS need this - "vendor/${vendor}" - ]; - in [ - (filterDirsAttrs (getAttrs (filteredRelpaths) deviceDirs)) - (filterDirsAttrs (getAttrs (vendorRelpaths) vendorDirs)) - ])); + warnings = + let + isUnsupportedDevice = + config.device != null && !(elem config.device supportedDevices) && config.deviceFamily != "generic"; + isUnmaintained = lib.versionOlder (toString config.androidVersion) "13"; + in + optional isUnsupportedDevice "${config.device} is not an officially-supported device for LineageOS" + ++ optional isUnmaintained "${LineageOSRelease} is unmaintained in robotnix and may break at any time"; + + source.dirs = mkMerge ( + [ + repoDirs + + { + "vendor/lineage".patches = + [ + ( + if lib.versionAtLeast (toString config.androidVersion) "13" then + ./0001-Remove-LineageOS-keys-20.patch + else + ./0001-Remove-LineageOS-keys-19.patch + ) + + (pkgs.substituteAll { + src = ./0002-bootanimation-Reproducibility-fix.patch; + inherit (pkgs) imagemagick; + }) + + ( + if lib.versionAtLeast (toString config.androidVersion) "13" then + ./0003-kernel-Set-constant-kernel-timestamp-20.patch + else + ./0003-kernel-Set-constant-kernel-timestamp-19.patch + ) + + ] + ++ lib.optionals (lib.versionAtLeast (toString config.androidVersion) "13") [ + ./dont-run-repo-during-build.patch + ]; + "system/extras".patches = [ + # pkgutil.get_data() not working, probably because we don't use their compiled python + (pkgs.fetchpatch { + url = "https://github.com/LineageOS/android_system_extras/commit/7da4b29321eb7ebce9eb9a43d0fbd85d0aa1e870.patch"; + sha256 = "0pv56lypdpsn66s7ffcps5ykyfx0hjkazml89flj7p1px12zjhy1"; + revert = true; + }) + ]; + + # LineageOS will sometimes force-push to this repo, and the older revisions are garbage collected. + # So we'll just build chromium webview ourselves. + "external/chromium-webview".enable = false; + } + ] + ++ optionals (deviceMetadata ? "${config.device}") ( + let + # Device-specific source dirs + vendor = toLower deviceMetadata.${config.device}.vendor; + deviceRelpath = "device/${vendor}/${config.device}"; + + # Retuns a list of all relpaths for the device (including deps) recursively + relpathWithDeps = + relpath: [ relpath ] ++ (flatten (map (p: relpathWithDeps p) deviceDirs.${relpath}.deps)); + # All relpaths required by the device + relpaths = relpathWithDeps deviceRelpath; + filteredRelpaths = remove (attrNames repoDirs) relpaths; # Remove any repos that we're already including from repo json + + # In LOS20, each device/ relpath has an associated vendor/ relpath. + # Well, usually... + deviceRelpaths = filter (path: hasPrefix "device/" path) relpaths; + vendorifiedRelpaths = map (replaceStrings [ "device/" ] [ "vendor/" ]) deviceRelpaths; + + vendorRelpaths = + if config.androidVersion >= 13 then + ( + # LOS20 needs vendor/$vendor/$device and all the common dirs but with + # vendor/ prefix + vendorifiedRelpaths + ) + else + [ + # Older LOS need this + "vendor/${vendor}" + ]; + in + [ + (filterDirsAttrs (getAttrs (filteredRelpaths) deviceDirs)) + (filterDirsAttrs (getAttrs (vendorRelpaths) vendorDirs)) + ] + ) + ); source.manifest.url = mkDefault "https://github.com/LineageOS/android.git"; source.manifest.rev = mkDefault "refs/heads/${LineageOSRelease}"; @@ -163,7 +233,8 @@ in mkIf (config.flavor == "lineageos") # This is the prebuilt webview apk from LineageOS. Adding this here is only # for convenience if the end-user wants to set `webview.prebuilt.enable = true;`. - webview.prebuilt.apk = config.source.dirs."external/chromium-webview".src + "/prebuilt/${config.arch}/webview.apk"; + webview.prebuilt.apk = + config.source.dirs."external/chromium-webview".src + "/prebuilt/${config.arch}/webview.apk"; webview.prebuilt.availableByDefault = mkDefault true; removedProductPackages = [ "webview" ]; @@ -173,9 +244,14 @@ in mkIf (config.flavor == "lineageos") pixel.activeEdge.includedInFlavor = mkDefault true; # Needed by included kernel build for some devices (pioneer at least) - envPackages = [ pkgs.openssl.dev ] ++ optionals (config.androidVersion >= 11) [ pkgs.gcc.cc pkgs.glibc.dev ]; + envPackages = + [ pkgs.openssl.dev ] + ++ optionals (config.androidVersion >= 11) [ + pkgs.gcc.cc + pkgs.glibc.dev + ]; - envVars.RELEASE_TYPE = mkDefault "EXPERIMENTAL"; # Other options are RELEASE NIGHTLY SNAPSHOT EXPERIMENTAL + envVars.RELEASE_TYPE = mkDefault "EXPERIMENTAL"; # Other options are RELEASE NIGHTLY SNAPSHOT EXPERIMENTAL # LineageOS flattens all APEX packages: https://review.lineageos.org/c/LineageOS/android_vendor_lineage/+/270212 signing.apex.enable = false; diff --git a/flavors/lineageos/update.sh b/flavors/lineageos/update.sh index 600d3759..d12b91cd 100755 --- a/flavors/lineageos/update.sh +++ b/flavors/lineageos/update.sh @@ -9,10 +9,10 @@ cd "$(dirname "${BASH_SOURCE[0]}")" branch=$1 args=( - --cache-search-path ../../ - --ref-type branch - "https://github.com/LineageOS/android" - "$branch" + --cache-search-path ../../ + --ref-type branch + "https://github.com/LineageOS/android" + "$branch" ) export TMPDIR=/var/tmp @@ -22,5 +22,5 @@ export TMPDIR=/var/tmp ./update_device_dirs.py --branch "$branch" endEpoch="$(date +%s)" -echo "$endEpoch" > lastUpdated.epoch +echo "$endEpoch" >lastUpdated.epoch echo Updated branch "$branch". End epoch: "$endEpoch" diff --git a/flavors/lineageos/update_device_dirs.py b/flavors/lineageos/update_device_dirs.py index ba4ca51c..e1593af9 100755 --- a/flavors/lineageos/update_device_dirs.py +++ b/flavors/lineageos/update_device_dirs.py @@ -10,7 +10,15 @@ from typing import Any, Callable, Dict, List, Optional, cast -from robotnix_common import save, get_store_path, checkout_git, ls_remote, get_mirrored_url, check_free_space, GitCheckoutInfoDict +from robotnix_common import ( + save, + get_store_path, + checkout_git, + ls_remote, + get_mirrored_url, + check_free_space, + GitCheckoutInfoDict, +) # A full run took approximately 12 minutes total. Needed to set TMPDIR=/tmp # @@ -19,40 +27,45 @@ debug = False + # Project info is just GitCheckoutInfoDict plus deps class ProjectInfoDict(GitCheckoutInfoDict, total=False): deps: List[str] -def fetch_relpath(dirs: Dict[str, Any], relpath: str, url: str, branch: str) -> ProjectInfoDict: + +def fetch_relpath( + dirs: Dict[str, Any], relpath: str, url: str, branch: str +) -> ProjectInfoDict: if debug: - print(f'Trying to fetch {relpath}') + print(f"Trying to fetch {relpath}") orig_url = url url = get_mirrored_url(url) - current_rev = dirs.get(relpath, {}).get('rev', None) + current_rev = dirs.get(relpath, {}).get("rev", None) refs = ls_remote(url) - ref = f'refs/heads/{branch}' + ref = f"refs/heads/{branch}" if ref not in refs: - raise ValueError(f'{url} is missing {ref}') + raise ValueError(f"{url} is missing {ref}") newest_rev = refs[ref] if current_rev != newest_rev: if debug: - print(f'Previous data did not contain up-to-date {relpath}, fetching') + print(f"Previous data did not contain up-to-date {relpath}, fetching") dirs[relpath] = checkout_git(url, ref) - dirs[relpath]['url'] = orig_url + dirs[relpath]["url"] = orig_url else: - print(relpath + ' is up to date.') + print(relpath + " is up to date.") return cast(ProjectInfoDict, dirs[relpath]) # Fetch device source trees for devices in metadata -def fetch_device_dirs(metadata: Any, - url_base: str, - branch: str, - prev_data: Optional[Any] = None, - callback: Optional[Callable[[Any], Any]] = None - ) -> Dict[str, ProjectInfoDict]: +def fetch_device_dirs( + metadata: Any, + url_base: str, + branch: str, + prev_data: Optional[Any] = None, + callback: Optional[Callable[[Any], Any]] = None, +) -> Dict[str, ProjectInfoDict]: dirs: Dict[str, ProjectInfoDict] if prev_data is not None: @@ -67,23 +80,23 @@ def fetch_device_dirs(metadata: Any, print(data) # They're google devices but their vendor is askey for some reason - if device in [ 'deadpool', 'wade' ]: - vendor = 'askey' - elif device == 'debx': - vendor = 'asus' + if device in ["deadpool", "wade"]: + vendor = "askey" + elif device == "debx": + vendor = "asus" else: - vendor = data['vendor'] + vendor = data["vendor"] - url = f'{url_base}/android_device_{vendor}_{device}' + url = f"{url_base}/android_device_{vendor}_{device}" if debug: print(url) refs = ls_remote(url) - if f'refs/heads/{branch}' in refs: - dirs_to_fetch.add((f'device/{vendor}/{device}', url)) + if f"refs/heads/{branch}" in refs: + dirs_to_fetch.add((f"device/{vendor}/{device}", url)) else: - print(f'SKIP: {branch} branch does not exist for {device}') + print(f"SKIP: {branch} branch does not exist for {device}") while len(dirs_to_fetch) > 0: relpath, url = dirs_to_fetch.pop() @@ -93,24 +106,28 @@ def fetch_device_dirs(metadata: Any, continue # Also grab any dirs that this one depends on - lineage_dependencies_filename = get_store_path(os.path.join(dir_info['path'], 'lineage.dependencies')) + lineage_dependencies_filename = get_store_path( + os.path.join(dir_info["path"], "lineage.dependencies") + ) if os.path.exists(lineage_dependencies_filename): if debug: - print(f'found deps {lineage_dependencies_filename}') + print(f"found deps {lineage_dependencies_filename}") lineage_dependencies = json.load(open(lineage_dependencies_filename)) for dep in lineage_dependencies: - if dep['target_path'] not in dirs_fetched: - dirs_to_fetch.add((dep['target_path'], f"{url_base}/{dep['repository']}")) + if dep["target_path"] not in dirs_fetched: + dirs_to_fetch.add( + (dep["target_path"], f"{url_base}/{dep['repository']}") + ) - dir_info['deps'] = [dep['target_path'] for dep in lineage_dependencies] + dir_info["deps"] = [dep["target_path"] for dep in lineage_dependencies] # If the path doesn't exist, there are two cases: # 1. We just fetched the dir and lineage.dependencies does not exist # 2. We didn't fetch the dir because it was up-to-date already but didn't have it in the store either # In 1. we want deps to be an empty list. # In 2. the dict would already contain 'deps' and those should remain as they were. - elif 'deps' not in dir_info: - dir_info['deps'] = [] + elif "deps" not in dir_info: + dir_info["deps"] = [] if callback is not None: callback(dirs) @@ -119,61 +136,66 @@ def fetch_device_dirs(metadata: Any, return dirs -def fetch_vendor_dirs(metadata: Any, - url_base: str, - branch: str, - true_branch: str, - device_dirs: Any, - prev_data: Optional[Any] = None, - callback: Optional[Callable[[Any], Any]] = None, - ) -> Any: +def fetch_vendor_dirs( + metadata: Any, + url_base: str, + branch: str, + true_branch: str, + device_dirs: Any, + prev_data: Optional[Any] = None, + callback: Optional[Callable[[Any], Any]] = None, +) -> Any: required_vendor = set() for device, data in metadata.items(): if debug: print(device, data) - if 'vendor' in data: - vendor = data['vendor'] + if "vendor" in data: + vendor = data["vendor"] # For the some devices, the vendor name used in device and vendor dir differs of course... - if vendor in [ 'radxa', 'bananapi', 'hardkernel']: - vendor = 'amlogic' + if vendor in ["radxa", "bananapi", "hardkernel"]: + vendor = "amlogic" if debug: print(branch) - if branch == 'lineage-20.0': - if 'branch' in data and data['branch'] == branch: + if branch == "lineage-20.0": + if "branch" in data and data["branch"] == branch: required_vendor.add(os.path.join(vendor, device)) else: - print(f'SKIP: {device} is not available for {branch}') + print(f"SKIP: {device} is not available for {branch}") else: required_vendor.add(vendor) - if 'vendor' in data: + if "vendor" in data: # Some devices need an additional vendor dir for their SoC. # This seems to be the case when it depends on 'device//-common'. # The accompanying vendor dir is: 'vendor//-common'. - vendor = data['vendor'] - device_dir_name = f'device/{vendor}/{device}' - if device_dir_name in device_dirs and 'deps' in device_dirs[device_dir_name]: - deps = device_dirs[device_dir_name]['deps'] + vendor = data["vendor"] + device_dir_name = f"device/{vendor}/{device}" + if ( + device_dir_name in device_dirs + and "deps" in device_dirs[device_dir_name] + ): + deps = device_dirs[device_dir_name]["deps"] if debug: - print(f'{device_dir_name} has deps: {deps}') + print(f"{device_dir_name} has deps: {deps}") for dep in deps: if debug: print(dep) - excluded = vendor in [ 'nvidia', 'zuk' ] or any(dep.endswith(path) for path in [ - 'motorola/sm6150-common', - 'xiaomi/sm8350-common', - 'msm8953-common' - ]) + excluded = vendor in ["nvidia", "zuk"] or any( + dep.endswith(path) + for path in [ + "motorola/sm6150-common", + "xiaomi/sm8350-common", + "msm8953-common", + ] + ) # Nvidia and zuk don't follow this pattern (obviously...) - if dep.endswith('-common') and not excluded: - relpath = dep.replace('device/', '') + if dep.endswith("-common") and not excluded: + relpath = dep.replace("device/", "") required_vendor.add(relpath) - - if prev_data is not None: dirs = copy.deepcopy(prev_data) else: @@ -183,26 +205,43 @@ def fetch_vendor_dirs(metadata: Any, print(prev_data) print(required_vendor) for vendor in required_vendor: - relpath = f'vendor/{vendor}' + relpath = f"vendor/{vendor}" # Only some of google's devices are on gitlab... - gitlab_vendors = [ 'google/bluejay', 'google/cheetah', 'google/oriole', 'google/panther', 'google/raven', 'google/lynx', 'google/tangorpro' ] + gitlab_vendors = [ + "google/bluejay", + "google/cheetah", + "google/oriole", + "google/panther", + "google/raven", + "google/lynx", + "google/tangorpro", + ] # Two motorola devices are /not/ on gitlab! TODO perhaps invert this list, new devices seem to be added to github now - motorola_gitlab = vendor.startswith('motorola/') and vendor not in [ 'motorola/nio', 'motorola/pstar', 'motorola/devon', 'motorola/rhode', 'motorola/hawao', 'motorola/sm8250-common', 'motorola/sm6225-common' ] + motorola_gitlab = vendor.startswith("motorola/") and vendor not in [ + "motorola/nio", + "motorola/pstar", + "motorola/devon", + "motorola/rhode", + "motorola/hawao", + "motorola/sm8250-common", + "motorola/sm6225-common", + ] real_url_base = url_base - if vendor == 'xiaomi' or (branch == 'lineage-20.0' and (motorola_gitlab or vendor in gitlab_vendors)): + if vendor == "xiaomi" or ( + branch == "lineage-20.0" and (motorola_gitlab or vendor in gitlab_vendors) + ): real_url_base = "https://gitlab.com/the-muppets" - to_fetch = [ f"{real_url_base}/proprietary_{relpath.replace('/', '_')}" ]; - + to_fetch = [f"{real_url_base}/proprietary_{relpath.replace('/', '_')}"] for url in to_fetch: refs = ls_remote(url) - if f'refs/heads/{true_branch}' in refs: + if f"refs/heads/{true_branch}" in refs: fetch_relpath(dirs, relpath, url, true_branch) if callback is not None: callback(dirs) else: - print(f'SKIP: {branch} branch does not exist for {url}') + print(f"SKIP: {branch} branch does not exist for {url}") return dirs @@ -211,45 +250,62 @@ def main() -> None: check_free_space() parser = argparse.ArgumentParser() - parser.add_argument('--branch', help="lineageos version") - parser.add_argument('product', nargs='*', - help='product to fetch directory metadata for, specified by _ ' - '(example: google_crosshatch) ' - 'If no products are specified, all products in device-metadata.json will be updated') - parser.add_argument('--debug', action='store_true', help="print debug info", default=False) + parser.add_argument("--branch", help="lineageos version") + parser.add_argument( + "product", + nargs="*", + help="product to fetch directory metadata for, specified by _ " + "(example: google_crosshatch) " + "If no products are specified, all products in device-metadata.json will be updated", + ) + parser.add_argument( + "--debug", action="store_true", help="print debug info", default=False + ) args = parser.parse_args() global debug debug = args.debug if len(args.product) == 0: - metadata = json.load(open('device-metadata.json')) + metadata = json.load(open("device-metadata.json")) else: metadata = {} for product in args.product: - vendor, device = product.split('_', 1) - metadata[device] = {'vendor': vendor} + vendor, device = product.split("_", 1) + metadata[device] = {"vendor": vendor} # Really? - true_branch = 'lineage-20' if args.branch == 'lineage-20.0' else args.branch + true_branch = "lineage-20" if args.branch == "lineage-20.0" else args.branch - device_dirs_fn = os.path.join(args.branch, 'device-dirs.json') + device_dirs_fn = os.path.join(args.branch, "device-dirs.json") if os.path.exists(device_dirs_fn): device_dirs = json.load(open(device_dirs_fn)) else: device_dirs = {} - device_dirs_result = fetch_device_dirs(metadata, "https://github.com/LineageOS", true_branch, - device_dirs, lambda dirs: save(device_dirs_fn, dirs)) - - vendor_dirs_fn = os.path.join(args.branch, 'vendor-dirs.json') + device_dirs_result = fetch_device_dirs( + metadata, + "https://github.com/LineageOS", + true_branch, + device_dirs, + lambda dirs: save(device_dirs_fn, dirs), + ) + + vendor_dirs_fn = os.path.join(args.branch, "vendor-dirs.json") if os.path.exists(vendor_dirs_fn): vendor_dirs = json.load(open(vendor_dirs_fn)) else: vendor_dirs = {} - fetch_vendor_dirs(metadata, "https://github.com/TheMuppets", args.branch, true_branch, - device_dirs_result, vendor_dirs, lambda dirs: save(vendor_dirs_fn, dirs)) - - -if __name__ == '__main__': + fetch_vendor_dirs( + metadata, + "https://github.com/TheMuppets", + args.branch, + true_branch, + device_dirs_result, + vendor_dirs, + lambda dirs: save(vendor_dirs_fn, dirs), + ) + + +if __name__ == "__main__": os.chdir(pathlib.Path(__file__).parent.resolve()) main() diff --git a/flavors/lineageos/update_device_metadata.py b/flavors/lineageos/update_device_metadata.py index 8295e23e..79f710b2 100755 --- a/flavors/lineageos/update_device_metadata.py +++ b/flavors/lineageos/update_device_metadata.py @@ -4,7 +4,6 @@ from typing import Any import json -import urllib.request import os import pathlib @@ -12,21 +11,22 @@ def fetch_metadata( - hudson_url: str = 'https://github.com/LineageOS/hudson', - lineage_build_targets_path: str = 'lineage-build-targets', - devices_json_path: str = 'updater/devices.json' - ) -> Any: + hudson_url: str = "https://github.com/LineageOS/hudson", + lineage_build_targets_path: str = "lineage-build-targets", + devices_json_path: str = "updater/devices.json", +) -> Any: metadata = {} - hudson_path = get_store_path(checkout_git(hudson_url, 'refs/heads/main')['path']) + hudson_path = get_store_path(checkout_git(hudson_url, "refs/heads/main")["path"]) # Devices we can't support due to repo naming inconsistencies. If you care # about a certain device in this list, you can add a workaround and remove # the device from the list. - ignore = [ 'nx651j', 'm5_tab', 'odroidc4_tab', 'radxa0_tab' ] + ignore = ["nx651j", "m5_tab", "odroidc4_tab", "radxa0_tab"] - - lineage_build_targets = open(f'{hudson_path}/{lineage_build_targets_path}').readlines() + lineage_build_targets = open( + f"{hudson_path}/{lineage_build_targets_path}" + ).readlines() for line in lineage_build_targets: line = line.strip() if line == "": @@ -38,55 +38,59 @@ def fetch_metadata( if device not in ignore: metadata[device] = { - 'variant': variant, - 'branch': branch, + "variant": variant, + "branch": branch, } ### - devices = json.load(open(f'{hudson_path}/{devices_json_path}')) + devices = json.load(open(f"{hudson_path}/{devices_json_path}")) for data in devices: - if data['model'] not in metadata: + if data["model"] not in metadata: continue workaround_map = { # shamu needs a workaround as well - 'shamu' : 'moto', + "shamu": "moto", # Workaround google device names source tree inconsistency - 'flox' : 'asus', + "flox": "asus", # wade is Google but uses askey vendor dirs? Dynalink is definitely wrong though. - 'wade' : 'askey', - 'deadpool' : 'askey', + "wade": "askey", + "deadpool": "askey", # 10.or is apparently a vendor name. Why TF do you have to put dots in your name. # TODO check whether we can exclude this case by always fetching from vendor_device for LOS-20 devices - 'G' : '10or' + "G": "10or", } - device = data['model'] - vendor = workaround_map[device] if device in workaround_map else data['oem'].lower() + device = data["model"] + vendor = ( + workaround_map[device] if device in workaround_map else data["oem"].lower() + ) # Workaround name inconsistency with LG - if vendor == 'lg': - vendor = 'lge' + if vendor == "lg": + vendor = "lge" # Look how cool my name is mom, parenthesis! - if vendor == 'f(x)tec': - vendor = 'fxtec' + if vendor == "f(x)tec": + vendor = "fxtec" # Urgh - if vendor == '10.or': - vendor = '10or' + if vendor == "10.or": + vendor = "10or" # Really? - if vendor == 'banana pi': - vendor = 'bananapi' - - metadata[data['model']].update({ - 'vendor': vendor, - 'name': data['name'], - 'lineage_recovery': data.get('lineage_recovery', False) - }) + if vendor == "banana pi": + vendor = "bananapi" + + metadata[data["model"]].update( + { + "vendor": vendor, + "name": data["name"], + "lineage_recovery": data.get("lineage_recovery", False), + } + ) return metadata -if __name__ == '__main__': +if __name__ == "__main__": metadata = fetch_metadata() os.chdir(pathlib.Path(__file__).parent.resolve()) - save('device-metadata.json', metadata) + save("device-metadata.json", metadata) diff --git a/flavors/vanilla/10/default.nix b/flavors/vanilla/10/default.nix index 5d8dc33c..74baae1b 100644 --- a/flavors/vanilla/10/default.nix +++ b/flavors/vanilla/10/default.nix @@ -1,59 +1,72 @@ -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) - elem mkIf mkMerge mkDefault; + elem + mkIf + mkMerge + mkDefault + ; inherit (import ../supported-devices.nix { inherit lib config; }) - supportedDeviceFamilies phoneDeviceFamilies; + supportedDeviceFamilies + phoneDeviceFamilies + ; in (mkIf (config.flavor == "vanilla" && config.androidVersion == 10) (mkMerge [ -(mkIf ((elem config.deviceFamily supportedDeviceFamilies) && (config.device != "sunfish")) { - buildDateTime = mkDefault 1596503967; - apv.buildID = mkDefault "QQ3A.200805.001"; - source.manifest.rev = mkDefault "android-10.0.0_r41"; -}) -(mkIf (config.device == "sunfish") { - buildDateTime = mkDefault 1598591122; - apv.buildID = mkDefault "QD4A.200805.003"; - source.manifest.rev = mkDefault "android-10.0.0_r45"; -}) -{ - source.dirs."packages/apps/DeskClock".patches = [ - (pkgs.fetchpatch { - url = "https://github.com/GrapheneOS/platform_packages_apps_DeskClock/commit/f31333513b1bf27ae23c61e4ba938568cc9e7b76.patch"; - sha256 = "1as8vyhfyi9cj61fc80ajskyz4lwwdc85fgxhj0b69z0dbxm77pj"; - }) - ]; -} -(mkIf (config.deviceFamily == "marlin") { - warnings = [ "marlin and sailfish are no longer receiving monthly security updates from Google. Support is left just for testing" ]; - - apv.buildID = "QP1A.191005.007.A3"; - source.manifest.rev = "android-10.0.0_r41"; - - # HACK to use recent android source, but with old vendor files... - source.dirs."vendor/google_devices".postPatch = '' - echo QQ3A.200805.001 > ${config.device}/build_id.txt - ''; - - kernel.src = pkgs.fetchgit { - url = "https://android.googlesource.com/kernel/msm"; - rev = "android-10.0.0_r0.23"; - sha256 = "0wy6h97g9j5sma67brn9vxq7jzf169j2gzq4ai96v4h68lz39lq9"; - }; - - # Fix reproducibility issue with DTBs not being sorted - kernel.postPatch = '' - sed -i \ - 's/^DTB_OBJS := $(shell find \(.*\))$/DTB_OBJS := $(sort $(shell find \1))/' \ - arch/arm64/boot/Makefile - ''; - - # TODO: Currently, only build kernel for marlin since it needs verity key in build. - # Could also build for other devices, like is done for Android 11 - kernel.enable = mkDefault config.signing.enable; -}) + (mkIf ((elem config.deviceFamily supportedDeviceFamilies) && (config.device != "sunfish")) { + buildDateTime = mkDefault 1596503967; + apv.buildID = mkDefault "QQ3A.200805.001"; + source.manifest.rev = mkDefault "android-10.0.0_r41"; + }) + (mkIf (config.device == "sunfish") { + buildDateTime = mkDefault 1598591122; + apv.buildID = mkDefault "QD4A.200805.003"; + source.manifest.rev = mkDefault "android-10.0.0_r45"; + }) + { + source.dirs."packages/apps/DeskClock".patches = [ + (pkgs.fetchpatch { + url = "https://github.com/GrapheneOS/platform_packages_apps_DeskClock/commit/f31333513b1bf27ae23c61e4ba938568cc9e7b76.patch"; + sha256 = "1as8vyhfyi9cj61fc80ajskyz4lwwdc85fgxhj0b69z0dbxm77pj"; + }) + ]; + } + (mkIf (config.deviceFamily == "marlin") { + warnings = [ + "marlin and sailfish are no longer receiving monthly security updates from Google. Support is left just for testing" + ]; + + apv.buildID = "QP1A.191005.007.A3"; + source.manifest.rev = "android-10.0.0_r41"; + + # HACK to use recent android source, but with old vendor files... + source.dirs."vendor/google_devices".postPatch = '' + echo QQ3A.200805.001 > ${config.device}/build_id.txt + ''; + + kernel.src = pkgs.fetchgit { + url = "https://android.googlesource.com/kernel/msm"; + rev = "android-10.0.0_r0.23"; + sha256 = "0wy6h97g9j5sma67brn9vxq7jzf169j2gzq4ai96v4h68lz39lq9"; + }; + + # Fix reproducibility issue with DTBs not being sorted + kernel.postPatch = '' + sed -i \ + 's/^DTB_OBJS := $(shell find \(.*\))$/DTB_OBJS := $(sort $(shell find \1))/' \ + arch/arm64/boot/Makefile + ''; + + # TODO: Currently, only build kernel for marlin since it needs verity key in build. + # Could also build for other devices, like is done for Android 11 + kernel.enable = mkDefault config.signing.enable; + }) ])) diff --git a/flavors/vanilla/11/default.nix b/flavors/vanilla/11/default.nix index 012ef525..8a4324c2 100644 --- a/flavors/vanilla/11/default.nix +++ b/flavors/vanilla/11/default.nix @@ -1,58 +1,83 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) - optional optionalString optionalAttrs elem - mkIf mkMerge mkDefault; + optional + optionalString + optionalAttrs + elem + mkIf + mkMerge + mkDefault + ; inherit (import ../supported-devices.nix { inherit lib config; }) - supportedDeviceFamilies phoneDeviceFamilies; + supportedDeviceFamilies + phoneDeviceFamilies + ; in (mkIf (config.flavor == "vanilla" && config.androidVersion == 11) (mkMerge [ -{ - buildDateTime = mkDefault 1633456788; + { + buildDateTime = mkDefault 1633456788; - source.manifest.rev = mkMerge [ - (mkIf (config.device != "barbet") (mkDefault "android-11.0.0_r46")) - (mkIf (config.device == "barbet") (mkDefault "android-11.0.0_r48")) - ]; - apv.buildID = mkMerge [ - (mkIf (config.device != "barbet") (mkDefault "RQ3A.211001.001")) - (mkIf (config.device == "barbet") (mkDefault "RD2A.211001.002")) - ]; + source.manifest.rev = mkMerge [ + (mkIf (config.device != "barbet") (mkDefault "android-11.0.0_r46")) + (mkIf (config.device == "barbet") (mkDefault "android-11.0.0_r48")) + ]; + apv.buildID = mkMerge [ + (mkIf (config.device != "barbet") (mkDefault "RQ3A.211001.001")) + (mkIf (config.device == "barbet") (mkDefault "RD2A.211001.002")) + ]; - # Disable for now until we have it tested working - kernel.enable = mkIf (elem config.deviceFamily phoneDeviceFamilies && - !(elem config.deviceFamily [ "redfin" "barbet"])) - (mkDefault true); + # Disable for now until we have it tested working + kernel.enable = mkIf ( + elem config.deviceFamily phoneDeviceFamilies + && !(elem config.deviceFamily [ + "redfin" + "barbet" + ]) + ) (mkDefault true); - # See also: https://github.com/GrapheneOS/os_issue_tracker/issues/325 - # List of biometric sensors on the device, in decreasing strength. Consumed by AuthService - # when registering authenticators with BiometricService. Format must be ID:Modality:Strength, - # where: IDs are unique per device, Modality as defined in BiometricAuthenticator.java, - # and Strength as defined in Authenticators.java - # TODO: This ought to show up in the vendor (not system or product) resource overlay - resources."frameworks/base/core/res".config_biometric_sensors = { - value = optional (elem config.deviceFamily phoneDeviceFamilies) ( - if (config.deviceFamily == "coral") then "0:8:15" - else "0:2:15"); - type = "string-array"; - }; + # See also: https://github.com/GrapheneOS/os_issue_tracker/issues/325 + # List of biometric sensors on the device, in decreasing strength. Consumed by AuthService + # when registering authenticators with BiometricService. Format must be ID:Modality:Strength, + # where: IDs are unique per device, Modality as defined in BiometricAuthenticator.java, + # and Strength as defined in Authenticators.java + # TODO: This ought to show up in the vendor (not system or product) resource overlay + resources."frameworks/base/core/res".config_biometric_sensors = { + value = optional (elem config.deviceFamily phoneDeviceFamilies) ( + if (config.deviceFamily == "coral") then "0:8:15" else "0:2:15" + ); + type = "string-array"; + }; - # Clock app needs battery optimization exemption. Currently not in AOSP - source.dirs."packages/apps/DeskClock".patches = [ - (pkgs.fetchpatch { - url = "https://github.com/GrapheneOS/platform_packages_apps_DeskClock/commit/0b21e707d7dca4c9c3e4ff030bef8fae3abed088.patch"; - sha256 = "0mzjzxyl8g2i520902bhc3ww3vbcwcx06m3zg033z0w6pw87apqc"; - }) - ]; -} -(mkIf (elem config.device [ "taimen" "walleye" ]) { - warnings = [ "taimen and walleye are no longer receiving monthly vendor security updates from Google" ]; - source.manifest.rev = "android-11.0.0_r25"; # More recent sources don't even include device/google/muskie - apv.buildID = "RP1A.201005.004.A1"; -}) + # Clock app needs battery optimization exemption. Currently not in AOSP + source.dirs."packages/apps/DeskClock".patches = [ + (pkgs.fetchpatch { + url = "https://github.com/GrapheneOS/platform_packages_apps_DeskClock/commit/0b21e707d7dca4c9c3e4ff030bef8fae3abed088.patch"; + sha256 = "0mzjzxyl8g2i520902bhc3ww3vbcwcx06m3zg033z0w6pw87apqc"; + }) + ]; + } + (mkIf + (elem config.device [ + "taimen" + "walleye" + ]) + { + warnings = [ + "taimen and walleye are no longer receiving monthly vendor security updates from Google" + ]; + source.manifest.rev = "android-11.0.0_r25"; # More recent sources don't even include device/google/muskie + apv.buildID = "RP1A.201005.004.A1"; + } + ) ])) diff --git a/flavors/vanilla/11/kernel/default.nix b/flavors/vanilla/11/kernel/default.nix index adf70120..4d8dea69 100644 --- a/flavors/vanilla/11/kernel/default.nix +++ b/flavors/vanilla/11/kernel/default.nix @@ -4,18 +4,36 @@ # TODO: remove all the redfin exceptions # TODO: Replace with a solution for https://github.com/danielfullmer/robotnix/issues/116 -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) - elem optional optionals optionalAttrs - mkIf mkOption mkOptionDefault mkDefault mkMerge mkEnableOption types; + elem + optional + optionals + optionalAttrs + mkIf + mkOption + mkOptionDefault + mkDefault + mkMerge + mkEnableOption + types + ; cfg = config.kernel; prebuiltGCC = pkgs.stdenv.mkDerivation { name = "prebuilt-gcc"; src = config.source.dirs."prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9".src; - buildInputs = with pkgs; [ python autoPatchelfHook ]; + buildInputs = with pkgs; [ + python + autoPatchelfHook + ]; installPhase = '' cp -r . $out ''; @@ -23,7 +41,10 @@ let prebuiltGCCarm32 = pkgs.stdenv.mkDerivation { name = "prebuilt-gcc-arm32"; src = config.source.dirs."prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9".src; - buildInputs = with pkgs; [ python autoPatchelfHook ]; + buildInputs = with pkgs; [ + python + autoPatchelfHook + ]; installPhase = '' cp -r . $out ''; @@ -31,33 +52,45 @@ let prebuiltClang = pkgs.stdenv.mkDerivation { name = "prebuilt-clang"; src = config.source.dirs."prebuilts/clang/host/linux-x86".src + "/clang-${cfg.clangVersion}"; - buildInputs = with pkgs; [ python autoPatchelfHook zlib ncurses5 libedit stdenv.cc.cc.lib ]; # Include cc.lib for libstdc++.so.6 + buildInputs = with pkgs; [ + python + autoPatchelfHook + zlib + ncurses5 + libedit + stdenv.cc.cc.lib + ]; # Include cc.lib for libstdc++.so.6 installPhase = '' cp -r . $out cp ${pkgs.libedit}/lib/libedit.so.0 $out/lib64/libedit.so.2 # ABI is the same--but distros have inconsistent numbering ''; - autoPatchelfIgnoreMissingDeps=true; # Ignore missing liblog.so + autoPatchelfIgnoreMissingDeps = true; # Ignore missing liblog.so }; - prebuiltGas = let - # Not always included in the platform repo manifest - backupSrc = pkgs.fetchgit { - url = "https://android.googlesource.com/platform/prebuilts/gas/linux-x86"; - rev = "592150fc8ae9f48f2e73f390961f32ca6f5f6a9f"; - sha256 = "1js9z9h89dbbzwv1pflm0026wrf5lsh3p95g86lwvagjis5xzii5"; + prebuiltGas = + let + # Not always included in the platform repo manifest + backupSrc = pkgs.fetchgit { + url = "https://android.googlesource.com/platform/prebuilts/gas/linux-x86"; + rev = "592150fc8ae9f48f2e73f390961f32ca6f5f6a9f"; + sha256 = "1js9z9h89dbbzwv1pflm0026wrf5lsh3p95g86lwvagjis5xzii5"; + }; + in + pkgs.stdenv.mkDerivation { + name = "prebuilt-gas"; + src = config.source.dirs."prebuilts/gas/linux-x86".src or backupSrc; + buildInputs = with pkgs; [ autoPatchelfHook ]; # Include cc.lib for libstdc++.so.6 + installPhase = '' + mkdir -p $out + cp -r . $out/bin + ''; }; - in pkgs.stdenv.mkDerivation { - name = "prebuilt-gas"; - src = config.source.dirs."prebuilts/gas/linux-x86".src or backupSrc; - buildInputs = with pkgs; [ autoPatchelfHook ]; # Include cc.lib for libstdc++.so.6 - installPhase = '' - mkdir -p $out - cp -r . $out/bin - ''; - }; prebuiltMisc = pkgs.stdenv.mkDerivation { name = "prebuilt-misc"; src = config.source.dirs."prebuilts/misc".src; - buildInputs = with pkgs; [ python autoPatchelfHook ]; + buildInputs = with pkgs; [ + python + autoPatchelfHook + ]; installPhase = '' mkdir -p $out/bin cp linux-x86/dtc/* $out/bin @@ -68,200 +101,312 @@ let ''; }; - configName = { - "taimen" = "wahoo"; - "muskie" = "wahoo"; - "crosshatch" = "b1c1"; - "coral" = "floral"; - "redfin" = "redbull"; - "bramble" = "redbull"; - }.${config.deviceFamily} or config.deviceFamily; + configName = + { + "taimen" = "wahoo"; + "muskie" = "wahoo"; + "crosshatch" = "b1c1"; + "coral" = "floral"; + "redfin" = "redbull"; + "bramble" = "redbull"; + } + .${config.deviceFamily} or config.deviceFamily; compiler = if (elem config.deviceFamily == "marlin") then "gcc" else "clang"; - linker = if (elem config.deviceFamily [ "coral" "sunfish" ]) then "lld" else "gold"; + linker = + if + (elem config.deviceFamily [ + "coral" + "sunfish" + ]) + then + "lld" + else + "gold"; - installModules = !(elem config.deviceFamily [ "marlin" "taimen" "muskie" ]); + installModules = + !(elem config.deviceFamily [ + "marlin" + "taimen" + "muskie" + ]); buildProductFilenames = optional installModules "moduleout/**/*.ko" - ++ optionals (config.deviceFamily == "marlin") [ - "arch/arm64/boot/Image.lz4-dtb" - ] ++ optionals (elem config.deviceFamily [ "taimen" "muskie" ]) [ - "arch/arm64/boot/Image.lz4-dtb" - "arch/arm64/boot/dtbo.img" - ] ++ optionals (config.deviceFamily == "crosshatch") [ + ++ optionals (config.deviceFamily == "marlin") [ "arch/arm64/boot/Image.lz4-dtb" ] + ++ + optionals + (elem config.deviceFamily [ + "taimen" + "muskie" + ]) + [ + "arch/arm64/boot/Image.lz4-dtb" + "arch/arm64/boot/dtbo.img" + ] + ++ optionals (config.deviceFamily == "crosshatch") [ "arch/arm64/boot/Image.lz4" "arch/arm64/boot/dtbo.img" "arch/arm64/boot/dts/qcom/sdm845-v2.dtb" "arch/arm64/boot/dts/qcom/sdm845-v2.1.dtb" - ] ++ optionals (config.deviceFamily == "bonito") [ + ] + ++ optionals (config.deviceFamily == "bonito") [ "arch/arm64/boot/Image.lz4" "arch/arm64/boot/dtbo.img" "arch/arm64/boot/dts/qcom/sdm670.dtb" - ] ++ optionals (config.deviceFamily == "coral") [ + ] + ++ optionals (config.deviceFamily == "coral") [ "arch/arm64/boot/Image.lz4" "arch/arm64/boot/dtbo.img" "arch/arm64/boot/dts/google/qcom-base/sm8150.dtb" "arch/arm64/boot/dts/google/qcom-base/sm8150-v2.dtb" - ] ++ optionals (config.deviceFamily == "sunfish") [ + ] + ++ optionals (config.deviceFamily == "sunfish") [ "arch/arm64/boot/Image.lz4" "arch/arm64/boot/dtbo.img" "arch/arm64/boot/dts/google/qcom-base/sdmmagpie.dtb" - ] ++ optionals (config.deviceFamily == "redfin") [ + ] + ++ optionals (config.deviceFamily == "redfin") [ "arch/arm64/boot/Image.lz4" "arch/arm64/boot/Image.lz4-dtb" "arch/arm64/boot/dtbo.img" "arch/arm64/boot/dts/google/qcom-base/lito.dtb" - ] ++ optionals (config.deviceFamily == "barbet") [ + ] + ++ optionals (config.deviceFamily == "barbet") [ "arch/arm64/boot/Image.lz4" "arch/arm64/boot/Image.lz4-dtb" "arch/arm64/boot/dtbo.img" "arch/arm64/boot/dts/google/qcom-base/lito.dtb" ]; - postRedfin = lib.elem config.deviceFamily [ "redfin" "barbet" ]; + postRedfin = lib.elem config.deviceFamily [ + "redfin" + "barbet" + ]; - kernel = pkgs.stdenv.mkDerivation ({ - name = "vanilla-${configName}-kernel"; - inherit (cfg) src patches postPatch; + kernel = pkgs.stdenv.mkDerivation ( + { + name = "vanilla-${configName}-kernel"; + inherit (cfg) src patches postPatch; - # From os-specific/linux/kernel/manual-config.nix in nixpkgs - prePatch = '' - for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do - echo "stripping FHS paths in \`$mf'..." - sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g' - done - sed -i scripts/ld-version.sh -e "s|/usr/bin/awk|${pkgs.gawk}/bin/awk|" + # From os-specific/linux/kernel/manual-config.nix in nixpkgs + prePatch = '' + for mf in $(find -name Makefile -o -name Makefile.include -o -name install.sh); do + echo "stripping FHS paths in \`$mf'..." + sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g' + done + sed -i scripts/ld-version.sh -e "s|/usr/bin/awk|${pkgs.gawk}/bin/awk|" - if [[ -f scripts/generate_initcall_order.pl ]]; then - patchShebangs scripts/generate_initcall_order.pl - fi - ''; + if [[ -f scripts/generate_initcall_order.pl ]]; then + patchShebangs scripts/generate_initcall_order.pl + fi + ''; - nativeBuildInputs = with pkgs; [ - perl bc nettools openssl rsync gmp libmpc mpfr lz4 which - prebuiltMisc - nukeReferences - ] - ++ lib.optionals (compiler == "clang") [ prebuiltClang ] # TODO: Generalize to other arches - ++ lib.optionals (!postRedfin) [ prebuiltGCC prebuiltGCCarm32 ] - ++ lib.optionals postRedfin [ - # HACK: Additional dependencies needed by redfin. - python bison flex cpio - prebuiltGas - ] - # needed for `depmod`, used in modules_install - ++ lib.optional installModules kmod; + nativeBuildInputs = + with pkgs; + [ + perl + bc + nettools + openssl + rsync + gmp + libmpc + mpfr + lz4 + which + prebuiltMisc + nukeReferences + ] + ++ lib.optionals (compiler == "clang") [ prebuiltClang ] # TODO: Generalize to other arches + ++ lib.optionals (!postRedfin) [ + prebuiltGCC + prebuiltGCCarm32 + ] + ++ lib.optionals postRedfin [ + # HACK: Additional dependencies needed by redfin. + python + bison + flex + cpio + prebuiltGas + ] + # needed for `depmod`, used in modules_install + ++ lib.optional installModules kmod; - enableParallelBuilding = true; - makeFlags = [ - "O=out" - "ARCH=arm64" - #"CONFIG_COMPAT_VDSO=n" - ] ++ ( - if postRedfin - then [ - "LLVM=1" - # Redfin kernel builds still need "gas" (GNU assembler), everything else is LLVM - "CROSS_COMPILE=aarch64-linux-gnu-" - "CROSS_COMPILE_ARM32=arm-linux-gnueabi-" - # TODO: Remove HOSTCC / HOSTCXX. Currently, removing it makes it fail: - # ../scripts/basic/fixdep.c:97:10: fatal error: 'sys/types.h' file not found - "HOSTCC=gcc" - "HOSTCXX=g++" - ] - else ([ - "CROSS_COMPILE=aarch64-linux-android-" - "CROSS_COMPILE_ARM32=arm-linux-androideabi-" - ] ++ lib.optionals (compiler == "clang") [ - "CC=clang" - "CLANG_TRIPLE=aarch64-unknown-linux-gnu-" # This should match the prefix being produced by pkgsCross.aarch64-multiplatform.buildPackages.binutils. TODO: Generalize to other arches - ] ++ lib.optional (linker == "lld") [ - # Otherwise fails with aarch64-linux-android-ld.gold: error: arch/arm64/lib/lib.a: member at 4210 is not an ELF object - "LD=ld.lld" - ]) - ); + enableParallelBuilding = true; + makeFlags = + [ + "O=out" + "ARCH=arm64" + #"CONFIG_COMPAT_VDSO=n" + ] + ++ ( + if postRedfin then + [ + "LLVM=1" + # Redfin kernel builds still need "gas" (GNU assembler), everything else is LLVM + "CROSS_COMPILE=aarch64-linux-gnu-" + "CROSS_COMPILE_ARM32=arm-linux-gnueabi-" + # TODO: Remove HOSTCC / HOSTCXX. Currently, removing it makes it fail: + # ../scripts/basic/fixdep.c:97:10: fatal error: 'sys/types.h' file not found + "HOSTCC=gcc" + "HOSTCXX=g++" + ] + else + ( + [ + "CROSS_COMPILE=aarch64-linux-android-" + "CROSS_COMPILE_ARM32=arm-linux-androideabi-" + ] + ++ lib.optionals (compiler == "clang") [ + "CC=clang" + "CLANG_TRIPLE=aarch64-unknown-linux-gnu-" # This should match the prefix being produced by pkgsCross.aarch64-multiplatform.buildPackages.binutils. TODO: Generalize to other arches + ] + ++ lib.optional (linker == "lld") [ + # Otherwise fails with aarch64-linux-android-ld.gold: error: arch/arm64/lib/lib.a: member at 4210 is not an ELF object + "LD=ld.lld" + ] + ) + ); - preBuild = '' - buildFlagsArray+=("KBUILD_BUILD_TIMESTAMP=$(date -u -d @${builtins.toString cfg.buildDateTime})") + preBuild = + '' + buildFlagsArray+=("KBUILD_BUILD_TIMESTAMP=$(date -u -d @${builtins.toString cfg.buildDateTime})") - buildFlagsArray+=("KBUILD_BUILD_VERSION=1") + buildFlagsArray+=("KBUILD_BUILD_VERSION=1") - make O=out ARCH=arm64 ${configName}_defconfig - '' + lib.optionalString (compiler == "clang") '' - export LD_LIBRARY_PATH="${prebuiltClang}/lib:$LD_LIBRARY_PATH" - ''; # So it can load LLVMgold.so + make O=out ARCH=arm64 ${configName}_defconfig + '' + + lib.optionalString (compiler == "clang") '' + export LD_LIBRARY_PATH="${prebuiltClang}/lib:$LD_LIBRARY_PATH" + ''; # So it can load LLVMgold.so - # Strip modules - postBuild = lib.optionalString installModules '' - make $makeFlags "''${makeFlagsArray[@]}" INSTALL_MOD_PATH=moduleout INSTALL_MOD_STRIP=1 modules_install - ''; + # Strip modules + postBuild = lib.optionalString installModules '' + make $makeFlags "''${makeFlagsArray[@]}" INSTALL_MOD_PATH=moduleout INSTALL_MOD_STRIP=1 modules_install + ''; - installPhase = '' - mkdir -p $out - shopt -s globstar nullglob - ${lib.optionalString postRedfin "cp out/arch/arm64/boot/dtbo_${config.device}.img out/arch/arm64/boot/dtbo.img"} - '' + (lib.concatMapStringsSep "\n" (filename: "cp out/${filename} $out/") buildProductFilenames) - + '' + installPhase = + '' + mkdir -p $out + shopt -s globstar nullglob + ${lib.optionalString postRedfin "cp out/arch/arm64/boot/dtbo_${config.device}.img out/arch/arm64/boot/dtbo.img"} + '' + + (lib.concatMapStringsSep "\n" (filename: "cp out/${filename} $out/") buildProductFilenames) + + '' - # This is also done in nixpkgs for wireless modules - nuke-refs $(find $out -name "*.ko") - ''; + # This is also done in nixpkgs for wireless modules + nuke-refs $(find $out -name "*.ko") + ''; - dontFixup = true; - dontStrip = true; - } // lib.optionalAttrs (lib.elem config.deviceFamily [ "coral" "sunfish" "redfin" "barbet" ]) { - # HACK: Needed for coral (pixel 4) (Don't turn this on for other devices) - DTC_EXT = "${prebuiltMisc}/bin/dtc"; - DTC_OVERLAY_TEST_EXT = "${prebuiltMisc}/bin/ufdt_apply_overlay"; - }); + dontFixup = true; + dontStrip = true; + } + // + lib.optionalAttrs + (lib.elem config.deviceFamily [ + "coral" + "sunfish" + "redfin" + "barbet" + ]) + { + # HACK: Needed for coral (pixel 4) (Don't turn this on for other devices) + DTC_EXT = "${prebuiltMisc}/bin/dtc"; + DTC_OVERLAY_TEST_EXT = "${prebuiltMisc}/bin/ufdt_apply_overlay"; + } + ); -in mkIf (config.flavor == "vanilla" && config.kernel.enable) { +in +mkIf (config.flavor == "vanilla" && config.kernel.enable) { # TODO: Could extract the bind-mounting thing in source.nix into something # that works for kernels too. Probably not worth the effort for the payoff # though. - kernel.src = let - kernelName = if elem config.deviceFamily [ "taimen" "muskie"] then "wahoo" else config.deviceFamily; - kernelMetadata = (lib.importJSON ./kernel-metadata.json).${kernelName}; - kernelRepos = lib.importJSON (./. + "/repo-${kernelMetadata.branch}.json"); - fetchRepo = repo: pkgs.fetchgit { - inherit (kernelRepos.${repo}) url rev sha256; - }; - kernelDirs = { - "" = fetchRepo "private/msm-google"; - } // optionalAttrs (elem kernelName [ "crosshatch" "bonito" "coral" "sunfish" "redfin" ]) { - "techpack/audio" = fetchRepo "private/msm-google/techpack/audio"; - "drivers/staging/qca-wifi-host-cmn" = fetchRepo "private/msm-google-modules/wlan/qca-wifi-host-cmn"; - "drivers/staging/qcacld-3.0" = fetchRepo "private/msm-google-modules/wlan/qcacld-3.0"; - "drivers/staging/fw-api" = fetchRepo "private/msm-google-modules/wlan/fw-api"; - } // optionalAttrs (elem kernelName [ "coral" "sunfish" ]) { - # Sunfish previously used a fts_touch_s5 repo, but it's tag moved back to - # to regular fts_touch repo, however, the kernel manifest was not updated. - "drivers/input/touchscreen/fts_touch" = fetchRepo "private/msm-google-modules/touch/fts/floral"; - } // optionalAttrs (elem kernelName [ "redfin" ]) { # TODO: barbet? it's currently set to kernel.enable=false; - "drivers/input/touchscreen/fts_touch" = fetchRepo "private/msm-google-modules/touch/fts"; + kernel.src = + let + kernelName = + if + elem config.deviceFamily [ + "taimen" + "muskie" + ] + then + "wahoo" + else + config.deviceFamily; + kernelMetadata = (lib.importJSON ./kernel-metadata.json).${kernelName}; + kernelRepos = lib.importJSON (./. + "/repo-${kernelMetadata.branch}.json"); + fetchRepo = repo: pkgs.fetchgit { inherit (kernelRepos.${repo}) url rev sha256; }; + kernelDirs = + { + "" = fetchRepo "private/msm-google"; + } + // optionalAttrs + (elem kernelName [ + "crosshatch" + "bonito" + "coral" + "sunfish" + "redfin" + ]) + { + "techpack/audio" = fetchRepo "private/msm-google/techpack/audio"; + "drivers/staging/qca-wifi-host-cmn" = fetchRepo "private/msm-google-modules/wlan/qca-wifi-host-cmn"; + "drivers/staging/qcacld-3.0" = fetchRepo "private/msm-google-modules/wlan/qcacld-3.0"; + "drivers/staging/fw-api" = fetchRepo "private/msm-google-modules/wlan/fw-api"; + } + // + optionalAttrs + (elem kernelName [ + "coral" + "sunfish" + ]) + { + # Sunfish previously used a fts_touch_s5 repo, but it's tag moved back to + # to regular fts_touch repo, however, the kernel manifest was not updated. + "drivers/input/touchscreen/fts_touch" = fetchRepo "private/msm-google-modules/touch/fts/floral"; + } + // optionalAttrs (elem kernelName [ "redfin" ]) { + # TODO: barbet? it's currently set to kernel.enable=false; + "drivers/input/touchscreen/fts_touch" = fetchRepo "private/msm-google-modules/touch/fts"; - "techpack/audio" = fetchRepo "private/msm-google/techpack/audio"; - "techpack/camera" = fetchRepo "private/msm-google/techpack/camera"; - "techpack/dataipa" = fetchRepo "private/msm-google/techpack/dataipa"; - "techpack/display" = fetchRepo "private/msm-google/techpack/display"; - "techpack/video" = fetchRepo "private/msm-google/techpack/video"; - "drivers/input/touchscreen/sec_touch" = fetchRepo "private/msm-google-modules/touch/sec"; - "arch/arm64/boot/dts/vendor" = fetchRepo "private/msm-google/arch/arm64/boot/dts/vendor"; - "arch/arm64/boot/dts/vendor/qcom/camera" = fetchRepo "private/msm-google/arch/arm64/boot/dts/vendor/qcom/camera"; - "arch/arm64/boot/dts/vendor/qcom/display" = fetchRepo "private/msm-google/arch/arm64/boot/dts/vendor/qcom/display"; - }; - in pkgs.runCommand "kernel-src" {} - (lib.concatStringsSep "\n" (lib.mapAttrsToList (relpath: repo: '' - ${lib.optionalString (relpath != "") "mkdir -p $out/$(dirname ${relpath})"} - cp -r ${repo} $out/${relpath} - chmod u+w -R $out/${relpath} - '') kernelDirs)); + "techpack/audio" = fetchRepo "private/msm-google/techpack/audio"; + "techpack/camera" = fetchRepo "private/msm-google/techpack/camera"; + "techpack/dataipa" = fetchRepo "private/msm-google/techpack/dataipa"; + "techpack/display" = fetchRepo "private/msm-google/techpack/display"; + "techpack/video" = fetchRepo "private/msm-google/techpack/video"; + "drivers/input/touchscreen/sec_touch" = fetchRepo "private/msm-google-modules/touch/sec"; + "arch/arm64/boot/dts/vendor" = fetchRepo "private/msm-google/arch/arm64/boot/dts/vendor"; + "arch/arm64/boot/dts/vendor/qcom/camera" = fetchRepo "private/msm-google/arch/arm64/boot/dts/vendor/qcom/camera"; + "arch/arm64/boot/dts/vendor/qcom/display" = fetchRepo "private/msm-google/arch/arm64/boot/dts/vendor/qcom/display"; + }; + in + pkgs.runCommand "kernel-src" { } ( + lib.concatStringsSep "\n" ( + lib.mapAttrsToList (relpath: repo: '' + ${lib.optionalString (relpath != "") "mkdir -p $out/$(dirname ${relpath})"} + cp -r ${repo} $out/${relpath} + chmod u+w -R $out/${relpath} + '') kernelDirs + ) + ); - kernel.relpath = let - kernelName = if elem config.deviceFamily [ "taimen" "muskie"] then "wahoo" - else if elem config.deviceFamily [ "redfin" ] then "redbull" - else config.deviceFamily; - in mkDefault "device/google/${kernelName}-kernel"; + kernel.relpath = + let + kernelName = + if + elem config.deviceFamily [ + "taimen" + "muskie" + ] + then + "wahoo" + else if elem config.deviceFamily [ "redfin" ] then + "redbull" + else + config.deviceFamily; + in + mkDefault "device/google/${kernelName}-kernel"; build.kernel = kernel; } diff --git a/flavors/vanilla/11/kernel/update-kernels.sh b/flavors/vanilla/11/kernel/update-kernels.sh index 7850b70f..52936d0d 100755 --- a/flavors/vanilla/11/kernel/update-kernels.sh +++ b/flavors/vanilla/11/kernel/update-kernels.sh @@ -9,16 +9,16 @@ export TMPDIR=/tmp readarray -t devices < <(jq -r 'keys[]' # from mako.template import Template # ModuleNotFoundError: No module named 'mako' # TODO: mkBefore here is a hack - envPackages = with pkgs; mkBefore [ - (python2.withPackages (p: with p; [ Mako ])) - (python3.withPackages (p: with p; [ Mako ])) - ]; + envPackages = + with pkgs; + mkBefore [ + (python2.withPackages (p: with p; [ Mako ])) + (python3.withPackages (p: with p; [ Mako ])) + ]; build = { waydroid = config.build.mkAndroid { name = "robotnix-${config.productName}-${config.buildNumber}"; - makeTargets = [ "systemimage" "vendorimage" ]; + makeTargets = [ + "systemimage" + "vendorimage" + ]; installPhase = '' mkdir -p $out diff --git a/flavors/waydroid/extract-patch-metadata.py b/flavors/waydroid/extract-patch-metadata.py index a76bb837..da36f01a 100755 --- a/flavors/waydroid/extract-patch-metadata.py +++ b/flavors/waydroid/extract-patch-metadata.py @@ -7,24 +7,24 @@ def main() -> None: - data = json.load(open('repo-lineage-17.1.json')) - waydroid_vendor = data['vendor/extra'] - git_info = checkout_git(waydroid_vendor['url'], waydroid_vendor['rev']) - topdir = git_info['path'] + data = json.load(open("repo-lineage-17.1.json")) + waydroid_vendor = data["vendor/extra"] + git_info = checkout_git(waydroid_vendor["url"], waydroid_vendor["rev"]) + topdir = git_info["path"] output = {} - patches_dir = os.path.join(topdir, 'waydroid-patches', 'base-patches') + patches_dir = os.path.join(topdir, "waydroid-patches", "base-patches") for dirpath, dirs, files in os.walk(patches_dir): - if any(f.endswith('.patch') for f in files): - src_path = dirpath[len(topdir)+1:] - dest_path = dirpath[len(patches_dir)+1:] + if any(f.endswith(".patch") for f in files): + src_path = dirpath[len(topdir) + 1 :] + dest_path = dirpath[len(patches_dir) + 1 :] output[dest_path] = { - 'dir': src_path, - 'files': sorted(files), + "dir": src_path, + "files": sorted(files), } - save('patch-metadata.json', output) + save("patch-metadata.json", output) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/flavors/waydroid/update.sh b/flavors/waydroid/update.sh index 2d3e118e..b436f073 100755 --- a/flavors/waydroid/update.sh +++ b/flavors/waydroid/update.sh @@ -14,13 +14,13 @@ wget -O - https://raw.githubusercontent.com/waydroid/android_vendor_waydroid/lin popd args=( - "https://github.com/LineageOS/android.git" - "lineage-17.1" # static branch name - --ref-type branch + "https://github.com/LineageOS/android.git" + "lineage-17.1" # static branch name + --ref-type branch ) for manifest in "${repo_tmp}"/.repo/local_manifests/*.xml; do - args+=(--local-manifest "${manifest}") + args+=(--local-manifest "${manifest}") done export TMPDIR=/tmp diff --git a/lib/default.nix b/lib/default.nix index 31747051..37275f21 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -5,31 +5,50 @@ lib: rec { # Guess resource type. Should normally work fine, but can't detect color/dimension types - resourceTypeName = r: - if lib.isBool r then "bool" - else if lib.isInt r then "integer" - else if lib.isString r then "string" + resourceTypeName = + r: + if lib.isBool r then + "bool" + else if lib.isInt r then + "integer" + else if lib.isString r then + "string" else if lib.isList r then - (assert (lib.length r != 0); # Cannot autodetect type of empty list - if lib.isInt (lib.head r) then "integer-array" - else if lib.isString (lib.head r) then "string-array" - else assert false; "Unknown type" + ( + assert (lib.length r != 0); # Cannot autodetect type of empty list + if lib.isInt (lib.head r) then + "integer-array" + else if lib.isString (lib.head r) then + "string-array" + else + assert false; + "Unknown type" ) - else assert false; "Unknown type"; - resourceValueXML = value: type: { - bool = lib.boolToString value; - color = value; # define our own specialized type for these? - dimen = value; - integer = toString value; - string = value; - integer-array = lib.concatMapStringsSep "" (i: "${toString i}") value; - string-array = lib.concatMapStringsSep "" (i: "${i}") value; - # Ignoring other typed arrays for now - }.${type}; + else + assert false; + "Unknown type"; + resourceValueXML = + value: type: + { + bool = lib.boolToString value; + color = value; # define our own specialized type for these? + dimen = value; + integer = toString value; + string = value; + integer-array = lib.concatMapStringsSep "" (i: "${toString i}") value; + string-array = lib.concatMapStringsSep "" (i: "${i}") value; + # Ignoring other typed arrays for now + } + .${type}; - resourceXML = name: value: let - resourceXMLEntity = name: value: type: ''<${type} name="${name}">${resourceValueXML value type}''; - in if lib.isAttrs value then + resourceXML = + name: value: + let + resourceXMLEntity = + name: value: type: + ''<${type} name="${name}">${resourceValueXML value type}''; + in + if lib.isAttrs value then # Submodule with manually specified resource type resourceXMLEntity name value.value value.type else diff --git a/modules/10/default.nix b/modules/10/default.nix index 7f5450e4..17132226 100644 --- a/modules/10/default.nix +++ b/modules/10/default.nix @@ -1,7 +1,12 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkIf mkDefault mkMerge; @@ -11,62 +16,74 @@ let hash = builtins.hashString "sha256" "${config.buildNumber} ${builtins.toString config.buildDateTime}"; in mkIf (config.androidVersion == 10) (mkMerge [ -{ - source.dirs."build/make".patches = [ - ./build_make/0001-Readonly-source-fix.patch - ] ++ (lib.optional (!(lib.elem config.flavor [ "lineageos" "waydroid" ])) - (pkgs.substituteAll { - src = ./build_make/0002-Partition-size-fix.patch; - inherit (pkgs) coreutils; - }) - ); + { + source.dirs."build/make".patches = + [ ./build_make/0001-Readonly-source-fix.patch ] + ++ (lib.optional + ( + !(lib.elem config.flavor [ + "lineageos" + "waydroid" + ]) + ) + ( + pkgs.substituteAll { + src = ./build_make/0002-Partition-size-fix.patch; + inherit (pkgs) coreutils; + } + ) + ); - # This one script needs python2. Used by sdk builds - source.dirs."development".postPatch = '' - substituteInPlace build/tools/mk_sources_zip.py \ - --replace "#!/usr/bin/python" "#!${pkgs.python2.interpreter}" - ''; + # This one script needs python2. Used by sdk builds + source.dirs."development".postPatch = '' + substituteInPlace build/tools/mk_sources_zip.py \ + --replace "#!/usr/bin/python" "#!${pkgs.python2.interpreter}" + ''; - kernel.clangVersion = mkDefault "r349610"; -} -(mkIf config.useReproducibilityFixes { - source.dirs."build/make" = { - patches = [ - ./build_make/0003-Make-vendor_manifest.xml-reproducible.patch - (pkgs.substituteAll { - src = ./build_make/0004-Set-uuid-and-hash_seed-for-userdata-and-cache.patch; - inherit hash; - }) - ./build_make/0005-Add-marker-to-insert-AVB-salt-flags.patch - ./build_make/0006-Fix-UUID-for-f2fs-partitions.patch - ]; + kernel.clangVersion = mkDefault "r349610"; + } + (mkIf config.useReproducibilityFixes { + source.dirs."build/make" = { + patches = [ + ./build_make/0003-Make-vendor_manifest.xml-reproducible.patch + (pkgs.substituteAll { + src = ./build_make/0004-Set-uuid-and-hash_seed-for-userdata-and-cache.patch; + inherit hash; + }) + ./build_make/0005-Add-marker-to-insert-AVB-salt-flags.patch + ./build_make/0006-Fix-UUID-for-f2fs-partitions.patch + ]; - postPatch = let - # Make salt based on combination of partition name and hash. Needed for reproducibility. - salt = partition: builtins.hashString "sha256" "${partition} ${hash}"; - avbSaltFlags = pkgs.writeText "avb_salt_flags" '' - BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS += --salt ${salt "boot"} - BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS += --salt ${salt "dtbo"} - BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system"} - BOARD_AVB_SYSTEM_OTHER_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system_other"} - BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "vendor"} - BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS += --salt ${salt "recovery"} - BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "product"} - BOARD_AVB_PRODUCT_SERVICES_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "product_services"} - BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "odm"} - ''; - in '' - sed -i -e '/### AVB SALT MARKER ###/r ${avbSaltFlags}' core/Makefile - ''; - }; + postPatch = + let + # Make salt based on combination of partition name and hash. Needed for reproducibility. + salt = partition: builtins.hashString "sha256" "${partition} ${hash}"; + avbSaltFlags = pkgs.writeText "avb_salt_flags" '' + BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS += --salt ${salt "boot"} + BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS += --salt ${salt "dtbo"} + BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system"} + BOARD_AVB_SYSTEM_OTHER_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system_other"} + BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "vendor"} + BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS += --salt ${salt "recovery"} + BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "product"} + BOARD_AVB_PRODUCT_SERVICES_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "product_services"} + BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "odm"} + ''; + in + '' + sed -i -e '/### AVB SALT MARKER ###/r ${avbSaltFlags}' core/Makefile + ''; + }; - source.dirs."external/f2fs-tools".patches = [ - ./external_f2fs-tools/0001-mkfs.f2fs-add-UUID-option.patch - ./external_f2fs-tools/0002-mkfs.f2fs-set-fixed-version-string.patch - ./external_f2fs-tools/0003-mkfs.f2fs-Use-SOURCE_DATE_EPOCH-as-time-if-available.patch - ./external_f2fs-tools/0004-fsck.f2fs-use-SOURCE_DATE_EPOCH-as-time-if-available.patch - ]; + source.dirs."external/f2fs-tools".patches = [ + ./external_f2fs-tools/0001-mkfs.f2fs-add-UUID-option.patch + ./external_f2fs-tools/0002-mkfs.f2fs-set-fixed-version-string.patch + ./external_f2fs-tools/0003-mkfs.f2fs-Use-SOURCE_DATE_EPOCH-as-time-if-available.patch + ./external_f2fs-tools/0004-fsck.f2fs-use-SOURCE_DATE_EPOCH-as-time-if-available.patch + ]; - source.dirs."system/extras".patches = [ ./system_extras/0001-mkf2fsuserimg.sh-add-UUID-option.patch ]; -}) + source.dirs."system/extras".patches = [ + ./system_extras/0001-mkf2fsuserimg.sh-add-UUID-option.patch + ]; + }) ]) diff --git a/modules/11/default.nix b/modules/11/default.nix index 27a5c68d..718f4acd 100644 --- a/modules/11/default.nix +++ b/modules/11/default.nix @@ -1,7 +1,12 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkIf mkDefault mkMerge; @@ -11,62 +16,74 @@ let hash = builtins.hashString "sha256" "${config.buildNumber} ${builtins.toString config.buildDateTime}"; in mkIf (config.androidVersion == 11) (mkMerge [ -{ - source.dirs."build/make".patches = [ - ./build_make/0001-Readonly-source-fix.patch - ] ++ (lib.optional (!(lib.elem config.flavor [ "grapheneos" "lineageos" ])) - (pkgs.substituteAll { - src = ./build_make/0002-Partition-size-fix.patch; - inherit (pkgs) coreutils; - }) - ); + { + source.dirs."build/make".patches = + [ ./build_make/0001-Readonly-source-fix.patch ] + ++ (lib.optional + ( + !(lib.elem config.flavor [ + "grapheneos" + "lineageos" + ]) + ) + ( + pkgs.substituteAll { + src = ./build_make/0002-Partition-size-fix.patch; + inherit (pkgs) coreutils; + } + ) + ); - # This one script needs python2. Used by sdk builds - source.dirs."development".postPatch = '' - substituteInPlace build/tools/mk_sources_zip.py \ - --replace "#!/usr/bin/python" "#!${pkgs.python2.interpreter}" - ''; + # This one script needs python2. Used by sdk builds + source.dirs."development".postPatch = '' + substituteInPlace build/tools/mk_sources_zip.py \ + --replace "#!/usr/bin/python" "#!${pkgs.python2.interpreter}" + ''; - kernel.clangVersion = mkDefault "r370808"; -} -(mkIf config.useReproducibilityFixes { - source.dirs."build/make" = { - patches = [ - (pkgs.substituteAll { - src = ./build_make/0003-Set-uuid-and-hash_seed-for-userdata-and-cache.patch; - inherit hash; - }) - ./build_make/0004-Add-marker-to-insert-AVB-salt-flags.patch - ./build_make/0005-Fix-UUID-for-f2fs-partitions.patch - ]; + kernel.clangVersion = mkDefault "r370808"; + } + (mkIf config.useReproducibilityFixes { + source.dirs."build/make" = { + patches = [ + (pkgs.substituteAll { + src = ./build_make/0003-Set-uuid-and-hash_seed-for-userdata-and-cache.patch; + inherit hash; + }) + ./build_make/0004-Add-marker-to-insert-AVB-salt-flags.patch + ./build_make/0005-Fix-UUID-for-f2fs-partitions.patch + ]; - postPatch = let - # Make salt based on combination of partition name and hash. Needed for reproducibility. - salt = partition: builtins.hashString "sha256" "${partition} ${hash}"; - avbSaltFlags = pkgs.writeText "avb_salt_flags" '' - BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS += --salt ${salt "boot"} - BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS += --salt ${salt "dtbo"} - BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system"} - BOARD_AVB_SYSTEM_OTHER_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system_other"} - BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "vendor"} - BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS += --salt ${salt "recovery"} - BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "product"} - BOARD_AVB_PRODUCT_SERVICES_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "product_services"} - BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system_ext"} - BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "odm"} - ''; - in '' - sed -i -e '/### AVB SALT MARKER ###/r ${avbSaltFlags}' core/Makefile - ''; - }; + postPatch = + let + # Make salt based on combination of partition name and hash. Needed for reproducibility. + salt = partition: builtins.hashString "sha256" "${partition} ${hash}"; + avbSaltFlags = pkgs.writeText "avb_salt_flags" '' + BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS += --salt ${salt "boot"} + BOARD_AVB_DTBO_ADD_HASH_FOOTER_ARGS += --salt ${salt "dtbo"} + BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system"} + BOARD_AVB_SYSTEM_OTHER_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system_other"} + BOARD_AVB_VENDOR_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "vendor"} + BOARD_AVB_RECOVERY_ADD_HASH_FOOTER_ARGS += --salt ${salt "recovery"} + BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "product"} + BOARD_AVB_PRODUCT_SERVICES_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "product_services"} + BOARD_AVB_SYSTEM_EXT_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "system_ext"} + BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS += --salt ${salt "odm"} + ''; + in + '' + sed -i -e '/### AVB SALT MARKER ###/r ${avbSaltFlags}' core/Makefile + ''; + }; - source.dirs."external/f2fs-tools".patches = [ - ./external_f2fs-tools/0001-mkfs.f2fs-add-UUID-option.patch - ./external_f2fs-tools/0002-mkfs.f2fs-set-fixed-version-string.patch - ./external_f2fs-tools/0003-mkfs.f2fs-Use-SOURCE_DATE_EPOCH-as-time-if-available.patch - ./external_f2fs-tools/0004-fsck.f2fs-use-SOURCE_DATE_EPOCH-as-time-if-available.patch - ]; + source.dirs."external/f2fs-tools".patches = [ + ./external_f2fs-tools/0001-mkfs.f2fs-add-UUID-option.patch + ./external_f2fs-tools/0002-mkfs.f2fs-set-fixed-version-string.patch + ./external_f2fs-tools/0003-mkfs.f2fs-Use-SOURCE_DATE_EPOCH-as-time-if-available.patch + ./external_f2fs-tools/0004-fsck.f2fs-use-SOURCE_DATE_EPOCH-as-time-if-available.patch + ]; - source.dirs."system/extras".patches = [ ./system_extras/0001-mkf2fsuserimg.sh-add-UUID-option.patch ]; -}) + source.dirs."system/extras".patches = [ + ./system_extras/0001-mkf2fsuserimg.sh-add-UUID-option.patch + ]; + }) ]) diff --git a/modules/12/default.nix b/modules/12/default.nix index 97ac90cb..ed917bf2 100644 --- a/modules/12/default.nix +++ b/modules/12/default.nix @@ -1,18 +1,25 @@ # SPDX-FileCopyrightText: 2021 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkIf; in mkIf (config.androidVersion == 12) { - source.dirs."build/make".patches = [ - ./build_make/0001-Readonly-source-fix.patch - #./build_make/0003-Add-option-to-include-prebuilt-images-when-signing-t.patch # Moved temporarily to modules/pixel/driver-binaries.nix - ] ++ lib.optionals (config.flavor != "lineageos") [ - ./build_make/0002-Add-vendor-bootconfig.img-to-target-files-package.patch - ]; + source.dirs."build/make".patches = + [ + ./build_make/0001-Readonly-source-fix.patch + #./build_make/0003-Add-option-to-include-prebuilt-images-when-signing-t.patch # Moved temporarily to modules/pixel/driver-binaries.nix + ] + ++ lib.optionals (config.flavor != "lineageos") [ + ./build_make/0002-Add-vendor-bootconfig.img-to-target-files-package.patch + ]; #kernel.clangVersion = mkDefault "r370808"; } diff --git a/modules/13/default.nix b/modules/13/default.nix index 60c6ae63..b2512d26 100644 --- a/modules/13/default.nix +++ b/modules/13/default.nix @@ -1,13 +1,16 @@ # SPDX-FileCopyrightText: 2021 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkIf; in mkIf (config.androidVersion == 13) { - source.dirs."build/make".patches = [ - ./build_make/0001-Readonly-source-fix.patch - ]; + source.dirs."build/make".patches = [ ./build_make/0001-Readonly-source-fix.patch ]; } diff --git a/modules/9/default.nix b/modules/9/default.nix index e4e32b23..562d0739 100644 --- a/modules/9/default.nix +++ b/modules/9/default.nix @@ -1,11 +1,16 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkIf mkDefault; - flex = pkgs.callPackage ./flex-2.5.39.nix {}; + flex = pkgs.callPackage ./flex-2.5.39.nix { }; in mkIf (config.androidVersion == 9) { # Some android version-specific fixes: diff --git a/modules/9/flex-2.5.39.nix b/modules/9/flex-2.5.39.nix index ac50b2cf..47397faa 100644 --- a/modules/9/flex-2.5.39.nix +++ b/modules/9/flex-2.5.39.nix @@ -1,13 +1,18 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ stdenv, fetchurl, bison, m4 }: +{ + stdenv, + fetchurl, + bison, + m4, +}: stdenv.mkDerivation { name = "flex-2.5.39"; src = fetchurl { - url = mirror://sourceforge/flex/flex-2.5.39.tar.bz2; + url = "mirror://sourceforge/flex/flex-2.5.39.tar.bz2"; sha256 = "0zv15giw3gma03y2bzw78hjfy49vyir7vbcgnh9bb3637dgvblmd"; }; @@ -16,7 +21,7 @@ stdenv.mkDerivation { propagatedNativeBuildInputs = [ m4 ]; meta = { - homepage = http://flex.sourceforge.net/; + homepage = "http://flex.sourceforge.net/"; description = "A fast lexical analyser generator"; }; } diff --git a/modules/apps/auditor.nix b/modules/apps/auditor.nix index 90175f18..183832f1 100644 --- a/modules/apps/auditor.nix +++ b/modules/apps/auditor.nix @@ -1,10 +1,21 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, apks, lib, ... }: +{ + config, + pkgs, + apks, + lib, + ... +}: let - inherit (lib) mkIf mkOption mkEnableOption types; + inherit (lib) + mkIf + mkOption + mkEnableOption + types + ; cfg = config.apps.auditor; supportedDevices = import ../../apks/auditor/supported-devices.nix; @@ -23,10 +34,12 @@ in }; config = mkIf cfg.enable { - assertions = [ { - assertion = builtins.elem config.device supportedDevices; - message = "Device ${config.device} is currently unsupported for use with Auditor app."; - } ]; + assertions = [ + { + assertion = builtins.elem config.device supportedDevices; + message = "Device ${config.device} is currently unsupported for use with Auditor app."; + } + ]; apps.prebuilt.Auditor = { apk = apks.auditor.override { diff --git a/modules/apps/chromium-trichrome-patcher.py b/modules/apps/chromium-trichrome-patcher.py index c4f6584b..e5b23377 100644 --- a/modules/apps/chromium-trichrome-patcher.py +++ b/modules/apps/chromium-trichrome-patcher.py @@ -5,14 +5,16 @@ infilename, outfilename, orig_certdigest, new_certdigest = sys.argv[1:] -zin = zipfile.ZipFile(infilename, 'r') -zout = zipfile.ZipFile(outfilename, 'w') +zin = zipfile.ZipFile(infilename, "r") +zout = zipfile.ZipFile(outfilename, "w") for info in zin.infolist(): data = zin.read(info.filename) - if info.filename == 'AndroidManifest.xml': + if info.filename == "AndroidManifest.xml": # Make sure we can find the certdigest - data.rindex(orig_certdigest.encode('utf-16-le')) + data.rindex(orig_certdigest.encode("utf-16-le")) # Replace it - data = data.replace(orig_certdigest.encode('utf-16-le'), new_certdigest.encode('utf-16-le')) + data = data.replace( + orig_certdigest.encode("utf-16-le"), new_certdigest.encode("utf-16-le") + ) zout.writestr(info, data) diff --git a/modules/apps/chromium.nix b/modules/apps/chromium.nix index 27faedde..ecb6d23b 100644 --- a/modules/apps/chromium.nix +++ b/modules/apps/chromium.nix @@ -1,10 +1,21 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, apks, lib, ... }: +{ + config, + pkgs, + apks, + lib, + ... +}: let - inherit (lib) mkIf mkMerge mkEnableOption mkOverride; + inherit (lib) + mkIf + mkMerge + mkEnableOption + mkOverride + ; mkWeakDefault = mkOverride 1200; # Priority betrween mkDefault and mkOptionDefault @@ -12,34 +23,46 @@ let # error: failed to deserialize resources.pb: duplicate configuration in resource table. # The version from chromium works, however: https://bugs.chromium.org/p/chromium/issues/detail?id=1106115 #aapt2 = "${pkgs.androidPkgs.sdk (p: with p; [ cmdline-tools-latest build-tools-30-0-1 ])}/share/android-sdk/build-tools/30.0.1/aapt2"; - aapt2 = pkgs.stdenv.mkDerivation { # TODO: Move this into the chromium derivation. Use their own aapt2/bundletool. - name = "aapt2"; - src = pkgs.fetchcipd { - package = "chromium/third_party/android_build_tools/aapt2"; - version = "O9eXFyC5ZkcYvDfHRLKPO1g1Xwf7M33wT3cuJtyfc0sC"; - sha256 = "0bv8qx7snyyndk5879xjbj3ncsb5yxcgp8w0wwfrif3m22d1fn84"; - }; - nativeBuildInputs = [ pkgs.autoPatchelfHook ]; - installPhase = "mkdir -p $out/bin && cp aapt2 $out/bin/"; - } + "/bin/aapt2"; + aapt2 = + pkgs.stdenv.mkDerivation { + # TODO: Move this into the chromium derivation. Use their own aapt2/bundletool. + name = "aapt2"; + src = pkgs.fetchcipd { + package = "chromium/third_party/android_build_tools/aapt2"; + version = "O9eXFyC5ZkcYvDfHRLKPO1g1Xwf7M33wT3cuJtyfc0sC"; + sha256 = "0bv8qx7snyyndk5879xjbj3ncsb5yxcgp8w0wwfrif3m22d1fn84"; + }; + nativeBuildInputs = [ pkgs.autoPatchelfHook ]; + installPhase = "mkdir -p $out/bin && cp aapt2 $out/bin/"; + } + + "/bin/aapt2"; # Create a universal apk from an "android app bundle" - aab2apk = aab: pkgs.runCommand "aab-universal.apk" { nativeBuildInputs = with pkgs; [ bundletool unzip ]; } '' - bundletool build-apks build-apks --bundle ${aab} --output result.apks --mode universal --aapt2 ${aapt2} - unzip result.apks universal.apk - mv universal.apk $out - ''; + aab2apk = + aab: + pkgs.runCommand "aab-universal.apk" + { + nativeBuildInputs = with pkgs; [ + bundletool + unzip + ]; + } + '' + bundletool build-apks build-apks --bundle ${aab} --output result.apks --mode universal --aapt2 ${aapt2} + unzip result.apks universal.apk + mv universal.apk $out + ''; # This is the default cert used in chrome/android/trichrome.gni of chromium source defaultTrichromeCertDigest = "32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0"; # Override the trichrome_certdigest in an already-built apk - patchTrichromeApk = name: src: newCertDigest: pkgs.runCommand "${name}-trichrome-patched.apk" { - nativeBuildInputs = with pkgs; [ python3 ]; - } '' - python3 ${./chromium-trichrome-patcher.py} ${src} patched.apk ${lib.toLower defaultTrichromeCertDigest} ${lib.toLower newCertDigest} - ${pkgs.robotnix.build-tools}/zipalign -p -f 4 patched.apk $out - ''; + patchTrichromeApk = + name: src: newCertDigest: + pkgs.runCommand "${name}-trichrome-patched.apk" { nativeBuildInputs = with pkgs; [ python3 ]; } '' + python3 ${./chromium-trichrome-patcher.py} ${src} patched.apk ${lib.toLower defaultTrichromeCertDigest} ${lib.toLower newCertDigest} + ${pkgs.robotnix.build-tools}/zipalign -p -f 4 patched.apk $out + ''; in { options = { @@ -48,87 +71,156 @@ in apps.vanadium.enable = mkEnableOption "vanadium browser"; }; - config = mkMerge ((lib.flatten (map - ({ name, displayName, buildSeparately ? false, chromeModernIsBundled ? true, isTriChrome ? (config.androidVersion >= 10) }: let - # There is a lot of shared code between chrome app and chrome webview. So we - # default to building them in a single derivation. This is not optimal if - # the user is enabling/disabling the apps/webview independently, but the - # benefits outweigh the costs. - packageName = "org.robotnix.${name}"; # Override package names here so we don't have to worry about conflicts - webviewPackageName = "org.robotnix.${name}.webview"; - trichromeLibraryPackageName = "org.robotnix.${name}.trichromelibrary"; + config = mkMerge ( + (lib.flatten ( + map + ( + { + name, + displayName, + buildSeparately ? false, + chromeModernIsBundled ? true, + isTriChrome ? (config.androidVersion >= 10), + }: + let + # There is a lot of shared code between chrome app and chrome webview. So we + # default to building them in a single derivation. This is not optimal if + # the user is enabling/disabling the apps/webview independently, but the + # benefits outweigh the costs. + packageName = "org.robotnix.${name}"; # Override package names here so we don't have to worry about conflicts + webviewPackageName = "org.robotnix.${name}.webview"; + trichromeLibraryPackageName = "org.robotnix.${name}.trichromelibrary"; - patchedTrichromeApk = componentName: apk: patchTrichromeApk "${name}-${componentName}" apk config.apps.prebuilt.${name}.fingerprint; + patchedTrichromeApk = + componentName: apk: + patchTrichromeApk "${name}-${componentName}" apk config.apps.prebuilt.${name}.fingerprint; - _browser = buildTargets: apks.${name}.override ({ customGnFlags ? {}, ... }: { - inherit packageName webviewPackageName trichromeLibraryPackageName displayName buildTargets; - targetCPU = { arm64 = "arm64"; arm = "arm"; x86_64 = "x64"; x86 = "x86";}.${config.arch}; - }); - chromiumTargets = - if isTriChrome then [ "trichrome_chrome_bundle" "trichrome_library_apk" ] - else if chromeModernIsBundled then [ "chrome_modern_public_bundle" ] - else [ "chrome_modern_public_apk" ]; - webviewTargets = - if isTriChrome then [ "trichrome_webview_apk" "trichrome_library_apk" ] - else [ "system_webview_apk" ]; + _browser = + buildTargets: + apks.${name}.override ( + { + customGnFlags ? { }, + ... + }: + { + inherit + packageName + webviewPackageName + trichromeLibraryPackageName + displayName + buildTargets + ; + targetCPU = + { + arm64 = "arm64"; + arm = "arm"; + x86_64 = "x64"; + x86 = "x86"; + } + .${config.arch}; + } + ); + chromiumTargets = + if isTriChrome then + [ + "trichrome_chrome_bundle" + "trichrome_library_apk" + ] + else if chromeModernIsBundled then + [ "chrome_modern_public_bundle" ] + else + [ "chrome_modern_public_apk" ]; + webviewTargets = + if isTriChrome then + [ + "trichrome_webview_apk" + "trichrome_library_apk" + ] + else + [ "system_webview_apk" ]; - browser = - if buildSeparately - then pkgs.symlinkJoin { - inherit name; - paths = - lib.optional config.apps.${name}.enable (_browser chromiumTargets) - ++ lib.optional config.webview.${name}.enable (_browser webviewTargets); - } - else _browser (lib.unique ( - lib.optionals config.apps.${name}.enable chromiumTargets - ++ lib.optionals config.webview.${name}.enable webviewTargets - )); + browser = + if buildSeparately then + pkgs.symlinkJoin { + inherit name; + paths = + lib.optional config.apps.${name}.enable (_browser chromiumTargets) + ++ lib.optional config.webview.${name}.enable (_browser webviewTargets); + } + else + _browser ( + lib.unique ( + lib.optionals config.apps.${name}.enable chromiumTargets + ++ lib.optionals config.webview.${name}.enable webviewTargets + ) + ); - in [ - { - apps.prebuilt.${name} = { - apk = - if isTriChrome then patchedTrichromeApk "browser" (aab2apk "${browser}/TrichromeChrome.aab") - else if chromeModernIsBundled then aab2apk "${browser}/ChromeModernPublic.aab" - else "${browser}/ChromeModernPublic.apk"; - enable = mkWeakDefault config.apps.${name}.enable; - }; + in + [ + { + apps.prebuilt.${name} = { + apk = + if isTriChrome then + patchedTrichromeApk "browser" (aab2apk "${browser}/TrichromeChrome.aab") + else if chromeModernIsBundled then + aab2apk "${browser}/ChromeModernPublic.aab" + else + "${browser}/ChromeModernPublic.apk"; + enable = mkWeakDefault config.apps.${name}.enable; + }; - # Unconditionally fill out the apk/description here, but it will not be included unless webview..enable = true; - webview.${name} = { - packageName = webviewPackageName; - description = "${displayName} WebView"; - apk = - if isTriChrome - then patchedTrichromeApk "webview" "${browser}/TrichromeWebView.apk" - else "${browser}/SystemWebView.apk"; - }; + # Unconditionally fill out the apk/description here, but it will not be included unless webview..enable = true; + webview.${name} = { + packageName = webviewPackageName; + description = "${displayName} WebView"; + apk = + if isTriChrome then + patchedTrichromeApk "webview" "${browser}/TrichromeWebView.apk" + else + "${browser}/SystemWebView.apk"; + }; - build.${name} = browser; # Put here for convenience + build.${name} = browser; # Put here for convenience - apps.prebuilt."${name}TrichromeLibrary" = { - apk = "${browser}/TrichromeLibrary.apk"; - enable = mkWeakDefault (isTriChrome && (config.apps.${name}.enable || config.webview.${name}.enable)); - certificate = config.apps.prebuilt.${name}.certificate; # Share certificate with application - fingerprint = config.apps.prebuilt.${name}.fingerprint; + apps.prebuilt."${name}TrichromeLibrary" = { + apk = "${browser}/TrichromeLibrary.apk"; + enable = mkWeakDefault ( + isTriChrome && (config.apps.${name}.enable || config.webview.${name}.enable) + ); + certificate = config.apps.prebuilt.${name}.certificate; # Share certificate with application + fingerprint = config.apps.prebuilt.${name}.fingerprint; + }; + } + ] + ) + [ + { + name = "chromium"; + displayName = "Chromium"; + } + # For an unknown reason, Bromite fails to build chrome_modern_public_bundle + # simultaneously with system_webview_apk as of 2020-12-22 + { + name = "bromite"; + displayName = "Bromite"; + buildSeparately = true; + isTriChrome = false; + } + { + name = "vanadium"; + displayName = "Vanadium"; + } + ] + )) + ++ [ + { + # Snakeoil key fingerprints + apps.prebuilt = mkIf (!config.signing.enable) { + chromium.fingerprint = "A9934B9FF708E2731A191453E53D961F57DA240AC50270287A8D5A0BFCC2A32F"; + bromite.fingerprint = "84DC65839E28832CD7CEB132E484F26857A075AFF5CFEB65802B489949AA6C36"; + vanadium.fingerprint = "67732B459F18ACD4BA86A6F1EE6D77C5AB347170A9CF29040CA874D6EE3FD61B"; }; } - ]) - [ { name = "chromium"; displayName = "Chromium"; } - # For an unknown reason, Bromite fails to build chrome_modern_public_bundle - # simultaneously with system_webview_apk as of 2020-12-22 - { name = "bromite"; displayName = "Bromite"; buildSeparately = true; isTriChrome = false; } - { name = "vanadium"; displayName = "Vanadium"; } ] - )) ++ [ - { - # Snakeoil key fingerprints - apps.prebuilt = mkIf (!config.signing.enable) { - chromium.fingerprint = "A9934B9FF708E2731A191453E53D961F57DA240AC50270287A8D5A0BFCC2A32F"; - bromite.fingerprint = "84DC65839E28832CD7CEB132E484F26857A075AFF5CFEB65802B489949AA6C36"; - vanadium.fingerprint = "67732B459F18ACD4BA86A6F1EE6D77C5AB347170A9CF29040CA874D6EE3FD61B"; - }; - } - ]); + ); } diff --git a/modules/apps/fdroid.nix b/modules/apps/fdroid.nix index 73ecaf5f..73ebe9bd 100644 --- a/modules/apps/fdroid.nix +++ b/modules/apps/fdroid.nix @@ -1,10 +1,22 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, apks, lib, robotnixlib, ... }: +{ + config, + pkgs, + apks, + lib, + robotnixlib, + ... +}: let - inherit (lib) mkIf mkOption mkEnableOption types; + inherit (lib) + mkIf + mkOption + mkEnableOption + types + ; cfg = config.apps.fdroid; privext = pkgs.fetchFromGitLab { @@ -20,56 +32,66 @@ in # See also `apps/src/main/java/org/fdroid/fdroid/data/DBHelper.java` in F-Droid source additionalRepos = mkOption { - default = {}; + default = { }; description = '' Additional F-Droid repositories to include in the default build. Note that changes to this setting will only take effect on a freshly installed device--or if the F-Droid storage is cleared. ''; - type = types.attrsOf (types.submodule ({ name, ... }: { - options = { - enable = mkOption { - default = false; - type = types.bool; - description = "Whether to enable this repository by default in F-Droid."; - }; + type = types.attrsOf ( + types.submodule ( + { name, ... }: + { + options = { + enable = mkOption { + default = false; + type = types.bool; + description = "Whether to enable this repository by default in F-Droid."; + }; - name = mkOption { - default = name; - type = types.str; - description = "Display name to use for this repository"; - }; + name = mkOption { + default = name; + type = types.str; + description = "Display name to use for this repository"; + }; - url = mkOption { - type = types.str; - description = "URL for F-Droid repository"; - }; + url = mkOption { + type = types.str; + description = "URL for F-Droid repository"; + }; - description = mkOption { - type = types.str; - default = "Empty description"; # fdroid parsing of additional_repos.xml requires all items to have text - description = "Longer textual description of this repository"; - }; + description = mkOption { + type = types.str; + default = "Empty description"; # fdroid parsing of additional_repos.xml requires all items to have text + description = "Longer textual description of this repository"; + }; - version = mkOption { - type = types.int; - default = 0; - description = "Which version of fdroidserver built this repo"; - internal = true; - }; + version = mkOption { + type = types.int; + default = 0; + description = "Which version of fdroidserver built this repo"; + internal = true; + }; - pushRequests = mkOption { - type = types.enum [ "ignore" "prompt" "always" ]; - description = "Allow this repository to specify apps which should be automatically installed/uninstalled"; - default = "ignore"; - }; + pushRequests = mkOption { + type = types.enum [ + "ignore" + "prompt" + "always" + ]; + description = "Allow this repository to specify apps which should be automatically installed/uninstalled"; + default = "ignore"; + }; - pubkey = mkOption { # Wew these are long AF. TODO: Some way to generate these? - type = types.str; - description = "Public key associated with this repository. Can be found in `/index.xml` under the repo URL."; - }; - }; - })); + pubkey = mkOption { + # Wew these are long AF. TODO: Some way to generate these? + type = types.str; + description = "Public key associated with this repository. Can be found in `/index.xml` under the repo URL."; + }; + }; + } + ) + ); }; }; @@ -80,8 +102,13 @@ in sha256 = "sha256-wWd/so9s/Ahdp6WtFbp1sjfNlbt4pnmqqNsMGt1o8QQ="; }; - fingerprint = mkIf (!config.signing.enable) "7352DAE94B237866E7FB44FD94ADE44E8B6E05397E7D1FB45616A00E225063FF"; - usesOptionalLibraries = [ "androidx.window.extensions" "androidx.window.sidecar" ]; + fingerprint = mkIf ( + !config.signing.enable + ) "7352DAE94B237866E7FB44FD94ADE44E8B6E05397E7D1FB45616A00E225063FF"; + usesOptionalLibraries = [ + "androidx.window.extensions" + "androidx.window.sidecar" + ]; }; # TODO: Put this under product/ @@ -97,20 +124,26 @@ in system.additionalProductPackages = [ "F-DroidPrivilegedExtension" ]; - etc = mkIf (cfg.additionalRepos != {}) { + etc = mkIf (cfg.additionalRepos != { }) { "org.fdroid.fdroid/additional_repos.xml" = { partition = "system"; # TODO: Make this work in /product partition text = robotnixlib.configXML { # Their XML schema is just a list of strings. Each 7 entries represents one repo. - additional_repos = lib.flatten (lib.mapAttrsToList (_: repo: with repo; (map (v: toString v) [ - name - url - description - version - (if enable then "1" else "0") - pushRequests - pubkey - ])) cfg.additionalRepos); + additional_repos = lib.flatten ( + lib.mapAttrsToList ( + _: repo: + with repo; + (map (v: toString v) [ + name + url + description + version + (if enable then "1" else "0") + pushRequests + pubkey + ]) + ) cfg.additionalRepos + ); }; }; }; diff --git a/modules/apps/prebuilt.nix b/modules/apps/prebuilt.nix index 637aabb9..394be79e 100644 --- a/modules/apps/prebuilt.nix +++ b/modules/apps/prebuilt.nix @@ -1,37 +1,50 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkOption mkDefault types; cfg = config.apps.prebuilt; - androidmk = prebuilt: pkgs.writeText "Android.mk" ('' - LOCAL_PATH := $(call my-dir) - - include $(CLEAR_VARS) - - LOCAL_MODULE := ${prebuilt.moduleName} - LOCAL_MODULE_CLASS := APPS - LOCAL_SRC_FILES := ${prebuilt.name}.apk - LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) - LOCAL_MODULE_TAGS := optional - - LOCAL_PRIVILEGED_MODULE := ${lib.boolToString prebuilt.privileged} - LOCAL_CERTIFICATE := ${ - if (prebuilt.certificate == "PRESIGNED") then "PRESIGNED" - else if builtins.elem prebuilt.certificate deviceCertificates - then (if (prebuilt.certificate == "releasekey") then "testkey" else prebuilt.certificate) - else "robotnix/prebuilt/${prebuilt.name}/${prebuilt.certificate}" - } - ${lib.optionalString (prebuilt.partition == "vendor") "LOCAL_VENDOR_MODULE := true"} - ${lib.optionalString (prebuilt.partition == "product") "LOCAL_PRODUCT_MODULE := true"} - ${lib.optionalString (config.androidVersion >= 11 && prebuilt.usesLibraries != []) "LOCAL_USES_LIBRARIES := ${builtins.concatStringsSep " " prebuilt.usesLibraries}"} - ${lib.optionalString (config.androidVersion >= 11 && prebuilt.usesOptionalLibraries != []) "LOCAL_OPTIONAL_USES_LIBRARIES := ${builtins.concatStringsSep " " prebuilt.usesOptionalLibraries}"} - ${prebuilt.extraConfig} - - include $(BUILD_PREBUILT) + androidmk = + prebuilt: + pkgs.writeText "Android.mk" ('' + LOCAL_PATH := $(call my-dir) + + include $(CLEAR_VARS) + + LOCAL_MODULE := ${prebuilt.moduleName} + LOCAL_MODULE_CLASS := APPS + LOCAL_SRC_FILES := ${prebuilt.name}.apk + LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) + LOCAL_MODULE_TAGS := optional + + LOCAL_PRIVILEGED_MODULE := ${lib.boolToString prebuilt.privileged} + LOCAL_CERTIFICATE := ${ + if (prebuilt.certificate == "PRESIGNED") then + "PRESIGNED" + else if builtins.elem prebuilt.certificate deviceCertificates then + (if (prebuilt.certificate == "releasekey") then "testkey" else prebuilt.certificate) + else + "robotnix/prebuilt/${prebuilt.name}/${prebuilt.certificate}" + } + ${lib.optionalString (prebuilt.partition == "vendor") "LOCAL_VENDOR_MODULE := true"} + ${lib.optionalString (prebuilt.partition == "product") "LOCAL_PRODUCT_MODULE := true"} + ${lib.optionalString ( + config.androidVersion >= 11 && prebuilt.usesLibraries != [ ] + ) "LOCAL_USES_LIBRARIES := ${builtins.concatStringsSep " " prebuilt.usesLibraries}"} + ${lib.optionalString (config.androidVersion >= 11 && prebuilt.usesOptionalLibraries != [ ]) + "LOCAL_OPTIONAL_USES_LIBRARIES := ${builtins.concatStringsSep " " prebuilt.usesOptionalLibraries}" + } + ${prebuilt.extraConfig} + + include $(BUILD_PREBUILT) ''); # Cert fingerprints from default AOSP test-keys: build/make/tools/releasetools/testdata @@ -44,12 +57,17 @@ let }; deviceCertificates = lib.attrNames defaultDeviceCertFingerprints; - _keyPath = keyStorePath: name: - if builtins.elem name deviceCertificates - then (if config.signing.enable - then "${keyStorePath}/${config.device}/${name}" - else "${keyStorePath}/${lib.replaceStrings ["releasekey"] ["testkey"] name}") # If not signing.enable, use test keys from AOSP - else "${keyStorePath}/${name}"; + _keyPath = + keyStorePath: name: + if builtins.elem name deviceCertificates then + ( + if config.signing.enable then + "${keyStorePath}/${config.device}/${name}" + else + "${keyStorePath}/${lib.replaceStrings [ "releasekey" ] [ "testkey" ] name}" + ) # If not signing.enable, use test keys from AOSP + else + "${keyStorePath}/${name}"; evalTimeKeyPath = name: _keyPath config.signing.keyStorePath name; buildTimeKeyPath = name: _keyPath config.signing.buildTimeKeyStorePath name; @@ -60,268 +78,305 @@ in { options = { apps.prebuilt = mkOption { - default = {}; + default = { }; description = "Prebuilt APKs to include in the robotnix build"; - type = let - _config = config; - in types.attrsOf (types.submodule ({ name, config, ... }: { - options = { - enable = mkOption { - default = true; - description = "Include ${name} APK in Android build"; - type = types.bool; - }; - - name = mkOption { - default = name; - description = "Name of application. (No spaces)"; - type = types.str; # TODO: Use strMatching to enforce no spaces? - }; - - modulePrefix = mkOption { - default = "Robotnix"; - description = "Prefix to prepend to the module name to avoid conflicts. (No spaces)"; - type = types.str; # TODO: Use strMatching to enforce no spaces? - }; - - moduleName = mkOption { - default = "${config.modulePrefix}${config.name}"; - description = "Module name in the AOSP build system. (No spaces)"; - type = types.str; - internal = true; - }; - - apk = mkOption { - type = with types; nullOr path; - default = null; # TODO: Consider a .enable option - description = "APK file to include in build"; - }; - - signedApk = mkOption { - type = types.path; - internal = true; - description = "Robotnix-signed version of APK file"; - }; - - fingerprint = mkOption { - description = "SHA256 fingerprint from certificate used to sign apk. Should be set automatically based on `keyStorePath` if `signing.enable = true`"; - type = types.strMatching "[0-9A-F]{64}"; # TODO: Type check fingerprints elsewhere - apply = lib.toUpper; - internal = true; - }; - - packageName = mkOption { # Only used with privapp permissions - description = "APK's Java-style package name (applicationId). This setting only necessary to be set if also using `privappPermissions`."; - type = types.strMatching "[a-zA-Z0-9_.]*"; - example = "com.android.test"; - }; - - certificate = mkOption { - default = lib.toLower name; - type = types.str; - description = '' - Name of certificate to sign APK with. Defaults to the name of the prebuilt app. - If it is a device-specific certificate, the cert/key should be under `''${keyStorePath}/''${device}/''${certificate}.{x509.pem,pk8}`. - Otherwise, it should be `''${keyStorePath}/''${certificate}.{x509.pem,pk8}`. - Finally, the special string "PRESIGNED" will just use the APK as-is. - ''; - }; - - snakeoilKeyPath = mkOption { - type = types.path; - internal = true; - }; - - privileged = mkOption { - default = false; - type = types.bool; - description = "Whether this APK should be included as a privileged application."; - }; - - privappPermissions = mkOption { - default = []; - type = types.listOf types.str; - description = '' - Privileged permissions to apply to this application. - Refer to this [link](https://developer.android.com/reference/android/Manifest.permission) and note permissions which say - "not for use by third-party applications". - ''; - example = [ "INSTALL_PACKAGES" ]; - }; - - defaultPermissions = mkOption { - default = []; - type = types.listOf types.str; - description = "Permissions to be enabled by default without user prompting."; - example = [ "INSTALL_PACKAGES" ]; - }; - - partition = mkOption { - description = "Partition on which to place this app"; - type = types.enum [ "vendor" "system" "product" ]; - }; - - allowInPowerSave = mkOption { - default = false; - type = types.bool; - description = '' - Whether to allow this application to operate in \"power save\" mode. - Disables battery optimization for this app. - ''; - }; - - usesLibraries = mkOption { - default = []; - type = types.listOf types.str; - description = '' - Shared library dependencies of this app. - - For more information, see . - ''; - }; - - usesOptionalLibraries = mkOption { - default = []; - type = types.listOf types.str; - description = '' - Optional shared library dependencies of this app. - - For more information, see . - ''; - }; - - extraConfig = mkOption { - default = ""; - type = types.lines; - internal = true; - }; - }; - - config = { - partition = mkDefault (if (_config.androidVersion >= 10) then "product" else "system"); - - # Uses the sandbox exception in /keys - signedApk = mkDefault ( - if config.certificate == "PRESIGNED" then config.apk else (pkgs.robotnix.signApk { - inherit (config) apk; - keyPath = - if _config.signing.enable - then buildTimeKeyPath config.certificate - else "${config.snakeoilKeyPath}/${config.certificate}"; - })); - - fingerprint = let - snakeoilFingerprint = pkgs.robotnix.certFingerprint "${config.snakeoilKeyPath}/${config.certificate}.x509.pem"; - in mkDefault ( - if config.certificate == "PRESIGNED" - then pkgs.robotnix.apkFingerprint config.signedApk # TODO: IFD - else if _config.signing.enable - then pkgs.robotnix.certFingerprint (putInStore "${evalTimeKeyPath config.certificate}.x509.pem") # TODO: IFD - else # !_config.signing.enable - defaultDeviceCertFingerprints.${name} or ( - builtins.trace '' - Used IFD to get fingerprint of reproducible app certificate. - Recommend setting: - apps.prebuilt.${config.name}.fingerprint = mkIf (!config.signing.enable) "${snakeoilFingerprint}" - '' - snakeoilFingerprint - ) - ); - - snakeoilKeyPath = pkgs.runCommand "${config.certificate}-snakeoil-cert" {} '' - echo "Generating snakeoil key for ${config.name} (will be replaced when signing target files)" - # Using certtool + sha256 of the cert name as seed for reproducibility. Seed needs 28 bytes for 2048 bit keys. - ${pkgs.gnutls}/bin/certtool \ - --generate-privkey --outfile ${config.certificate}.key \ - --key-type=rsa --bits=2048 \ - --seed=${builtins.substring 0 (28*2) (builtins.hashString "sha256" config.certificate)} - # Set serial number and fake time for reproducibility - ${pkgs.libfaketime}/bin/faketime -f "2020-01-01 00:00:01" \ - ${pkgs.openssl}/bin/openssl req -new -x509 -sha256 \ - -key ${config.certificate}.key -out ${config.certificate}.x509.pem \ - -days 10000 -subj "/CN=Robotnix ${config.certificate}" \ - -set_serial 0 - # Convert to DER format - ${pkgs.openssl}/bin/openssl pkcs8 -in ${config.certificate}.key -topk8 -nocrypt -outform DER -out ${config.certificate}.pk8 - mkdir -p $out/ - cp ${config.certificate}.{pk8,x509.pem} $out/ - ''; - }; - })); + type = + let + _config = config; + in + types.attrsOf ( + types.submodule ( + { name, config, ... }: + { + options = { + enable = mkOption { + default = true; + description = "Include ${name} APK in Android build"; + type = types.bool; + }; + + name = mkOption { + default = name; + description = "Name of application. (No spaces)"; + type = types.str; # TODO: Use strMatching to enforce no spaces? + }; + + modulePrefix = mkOption { + default = "Robotnix"; + description = "Prefix to prepend to the module name to avoid conflicts. (No spaces)"; + type = types.str; # TODO: Use strMatching to enforce no spaces? + }; + + moduleName = mkOption { + default = "${config.modulePrefix}${config.name}"; + description = "Module name in the AOSP build system. (No spaces)"; + type = types.str; + internal = true; + }; + + apk = mkOption { + type = with types; nullOr path; + default = null; # TODO: Consider a .enable option + description = "APK file to include in build"; + }; + + signedApk = mkOption { + type = types.path; + internal = true; + description = "Robotnix-signed version of APK file"; + }; + + fingerprint = mkOption { + description = "SHA256 fingerprint from certificate used to sign apk. Should be set automatically based on `keyStorePath` if `signing.enable = true`"; + type = types.strMatching "[0-9A-F]{64}"; # TODO: Type check fingerprints elsewhere + apply = lib.toUpper; + internal = true; + }; + + packageName = mkOption { + # Only used with privapp permissions + description = "APK's Java-style package name (applicationId). This setting only necessary to be set if also using `privappPermissions`."; + type = types.strMatching "[a-zA-Z0-9_.]*"; + example = "com.android.test"; + }; + + certificate = mkOption { + default = lib.toLower name; + type = types.str; + description = '' + Name of certificate to sign APK with. Defaults to the name of the prebuilt app. + If it is a device-specific certificate, the cert/key should be under `''${keyStorePath}/''${device}/''${certificate}.{x509.pem,pk8}`. + Otherwise, it should be `''${keyStorePath}/''${certificate}.{x509.pem,pk8}`. + Finally, the special string "PRESIGNED" will just use the APK as-is. + ''; + }; + + snakeoilKeyPath = mkOption { + type = types.path; + internal = true; + }; + + privileged = mkOption { + default = false; + type = types.bool; + description = "Whether this APK should be included as a privileged application."; + }; + + privappPermissions = mkOption { + default = [ ]; + type = types.listOf types.str; + description = '' + Privileged permissions to apply to this application. + Refer to this [link](https://developer.android.com/reference/android/Manifest.permission) and note permissions which say + "not for use by third-party applications". + ''; + example = [ "INSTALL_PACKAGES" ]; + }; + + defaultPermissions = mkOption { + default = [ ]; + type = types.listOf types.str; + description = "Permissions to be enabled by default without user prompting."; + example = [ "INSTALL_PACKAGES" ]; + }; + + partition = mkOption { + description = "Partition on which to place this app"; + type = types.enum [ + "vendor" + "system" + "product" + ]; + }; + + allowInPowerSave = mkOption { + default = false; + type = types.bool; + description = '' + Whether to allow this application to operate in \"power save\" mode. + Disables battery optimization for this app. + ''; + }; + + usesLibraries = mkOption { + default = [ ]; + type = types.listOf types.str; + description = '' + Shared library dependencies of this app. + + For more information, see . + ''; + }; + + usesOptionalLibraries = mkOption { + default = [ ]; + type = types.listOf types.str; + description = '' + Optional shared library dependencies of this app. + + For more information, see . + ''; + }; + + extraConfig = mkOption { + default = ""; + type = types.lines; + internal = true; + }; + }; + + config = { + partition = mkDefault (if (_config.androidVersion >= 10) then "product" else "system"); + + # Uses the sandbox exception in /keys + signedApk = mkDefault ( + if config.certificate == "PRESIGNED" then + config.apk + else + (pkgs.robotnix.signApk { + inherit (config) apk; + keyPath = + if _config.signing.enable then + buildTimeKeyPath config.certificate + else + "${config.snakeoilKeyPath}/${config.certificate}"; + }) + ); + + fingerprint = + let + snakeoilFingerprint = pkgs.robotnix.certFingerprint "${config.snakeoilKeyPath}/${config.certificate}.x509.pem"; + in + mkDefault ( + if config.certificate == "PRESIGNED" then + pkgs.robotnix.apkFingerprint config.signedApk # TODO: IFD + else if _config.signing.enable then + pkgs.robotnix.certFingerprint (putInStore "${evalTimeKeyPath config.certificate}.x509.pem") # TODO: IFD + # !_config.signing.enable + else + defaultDeviceCertFingerprints.${name} or (builtins.trace '' + Used IFD to get fingerprint of reproducible app certificate. + Recommend setting: + apps.prebuilt.${config.name}.fingerprint = mkIf (!config.signing.enable) "${snakeoilFingerprint}" + '' snakeoilFingerprint) + ); + + snakeoilKeyPath = pkgs.runCommand "${config.certificate}-snakeoil-cert" { } '' + echo "Generating snakeoil key for ${config.name} (will be replaced when signing target files)" + # Using certtool + sha256 of the cert name as seed for reproducibility. Seed needs 28 bytes for 2048 bit keys. + ${pkgs.gnutls}/bin/certtool \ + --generate-privkey --outfile ${config.certificate}.key \ + --key-type=rsa --bits=2048 \ + --seed=${builtins.substring 0 (28 * 2) (builtins.hashString "sha256" config.certificate)} + # Set serial number and fake time for reproducibility + ${pkgs.libfaketime}/bin/faketime -f "2020-01-01 00:00:01" \ + ${pkgs.openssl}/bin/openssl req -new -x509 -sha256 \ + -key ${config.certificate}.key -out ${config.certificate}.x509.pem \ + -days 10000 -subj "/CN=Robotnix ${config.certificate}" \ + -set_serial 0 + # Convert to DER format + ${pkgs.openssl}/bin/openssl pkcs8 -in ${config.certificate}.key -topk8 -nocrypt -outform DER -out ${config.certificate}.pk8 + mkdir -p $out/ + cp ${config.certificate}.{pk8,x509.pem} $out/ + ''; + }; + } + ) + ); }; }; config = { - source.dirs = lib.listToAttrs (map (prebuilt: { - name = "robotnix/prebuilt/${prebuilt.name}"; - value = { - src = pkgs.runCommand "prebuilt_${prebuilt.name}" {} ('' - set -euo pipefail - - mkdir -p $out - cp ${androidmk prebuilt} $out/Android.mk - cp ${prebuilt.apk} $out/${prebuilt.name}.apk - - ### Check minSdkVersion, targetSdkVersion - # TODO: Also check permissions? - MANIFEST_DUMP=$(${pkgs.robotnix.build-tools}/aapt2 d xmltree --file AndroidManifest.xml ${prebuilt.apk}) - - # It would be better if we could convert it back into true XML and then select based on XPath - MIN_SDK_VERSION=$(echo "$MANIFEST_DUMP" | grep minSdkVersion | cut -d= -f2) - TARGET_SDK_VERSION=$(echo "$MANIFEST_DUMP" | grep targetSdkVersion | cut -d= -f2) - - if [[ "$MIN_SDK_VERSION" -gt "${builtins.toString config.apiLevel}" ]]; then - echo "ERROR: OS API level is (${builtins.toString config.apiLevel}) but APK requires at least $MIN_SDK_VERSION" - exit 1 - fi - - if [[ "$TARGET_SDK_VERSION" -lt "${builtins.toString config.apiLevel}" ]]; then - echo "WARNING: APK was compiled against an older SDK API level ($TARGET_SDK_VERSION) than used in OS (${builtins.toString config.apiLevel})" - fi - '' + lib.optionalString ((prebuilt.certificate != "PRESIGNED") && !(builtins.elem prebuilt.certificate deviceCertificates)) '' - cp ${prebuilt.snakeoilKeyPath}/${prebuilt.certificate}.{pk8,x509.pem} $out/ - ''); - }; - }) enabledPrebuilts); + source.dirs = lib.listToAttrs ( + map (prebuilt: { + name = "robotnix/prebuilt/${prebuilt.name}"; + value = { + src = pkgs.runCommand "prebuilt_${prebuilt.name}" { } ( + '' + set -euo pipefail + + mkdir -p $out + cp ${androidmk prebuilt} $out/Android.mk + cp ${prebuilt.apk} $out/${prebuilt.name}.apk + + ### Check minSdkVersion, targetSdkVersion + # TODO: Also check permissions? + MANIFEST_DUMP=$(${pkgs.robotnix.build-tools}/aapt2 d xmltree --file AndroidManifest.xml ${prebuilt.apk}) + + # It would be better if we could convert it back into true XML and then select based on XPath + MIN_SDK_VERSION=$(echo "$MANIFEST_DUMP" | grep minSdkVersion | cut -d= -f2) + TARGET_SDK_VERSION=$(echo "$MANIFEST_DUMP" | grep targetSdkVersion | cut -d= -f2) + + if [[ "$MIN_SDK_VERSION" -gt "${builtins.toString config.apiLevel}" ]]; then + echo "ERROR: OS API level is (${builtins.toString config.apiLevel}) but APK requires at least $MIN_SDK_VERSION" + exit 1 + fi + + if [[ "$TARGET_SDK_VERSION" -lt "${builtins.toString config.apiLevel}" ]]; then + echo "WARNING: APK was compiled against an older SDK API level ($TARGET_SDK_VERSION) than used in OS (${builtins.toString config.apiLevel})" + fi + '' + + + lib.optionalString + ((prebuilt.certificate != "PRESIGNED") && !(builtins.elem prebuilt.certificate deviceCertificates)) + '' + cp ${prebuilt.snakeoilKeyPath}/${prebuilt.certificate}.{pk8,x509.pem} $out/ + '' + ); + }; + }) enabledPrebuilts + ); # TODO: Make just a single file with each of these configuration types instead of one for each app? - etc = let - confToAttrs = f: - (lib.listToAttrs (map (prebuilt: { - name = (f prebuilt).path; - value = { - text = (f prebuilt).text; - inherit (prebuilt) partition; - }; - }) (lib.filter (prebuilt: (f prebuilt).filter) enabledPrebuilts))); - in + etc = + let + confToAttrs = + f: + (lib.listToAttrs ( + map (prebuilt: { + name = (f prebuilt).path; + value = { + text = (f prebuilt).text; + inherit (prebuilt) partition; + }; + }) (lib.filter (prebuilt: (f prebuilt).filter) enabledPrebuilts) + )); + in confToAttrs (prebuilt: { path = "permissions/privapp-permissions-${prebuilt.packageName}.xml"; - filter = prebuilt.privappPermissions != []; + filter = prebuilt.privappPermissions != [ ]; text = '' - ${lib.concatMapStrings (p: "") prebuilt.privappPermissions} + ${ + lib.concatMapStrings ( + p: "" + ) prebuilt.privappPermissions + } ''; - }) // - confToAttrs (prebuilt: { + }) + // confToAttrs (prebuilt: { path = "default-permissions/default-permissions-${prebuilt.packageName}.xml"; - filter = prebuilt.defaultPermissions != []; + filter = prebuilt.defaultPermissions != [ ]; # TODO: Allow user to set "fixed" in the configuration? text = '' - ${lib.concatMapStrings (p: "") prebuilt.defaultPermissions} + ${ + lib.concatMapStrings ( + p: "" + ) prebuilt.defaultPermissions + } ''; - }) // - confToAttrs (prebuilt: { + }) + // confToAttrs (prebuilt: { path = "sysconfig/whitelist-${prebuilt.packageName}.xml"; filter = prebuilt.allowInPowerSave; text = '' @@ -332,12 +387,19 @@ in ''; }); - system.additionalProductPackages = map (p: p.moduleName) (lib.filter (p: p.partition == "system") enabledPrebuilts); - product.additionalProductPackages = map (p: p.moduleName) (lib.filter (p: p.partition == "product") enabledPrebuilts); + system.additionalProductPackages = map (p: p.moduleName) ( + lib.filter (p: p.partition == "system") enabledPrebuilts + ); + product.additionalProductPackages = map (p: p.moduleName) ( + lib.filter (p: p.partition == "product") enabledPrebuilts + ); # Convenience derivation to get all prebuilt apks -- for use in custom fdroid repo? - build.prebuiltApks = pkgs.linkFarm "${config.device}-prebuilt-apks" - (map (p: { name="${p.name}.apk"; path=p.signedApk; }) - (lib.filter (p: p.name != "CustomWebview") enabledPrebuilts)); + build.prebuiltApks = pkgs.linkFarm "${config.device}-prebuilt-apks" ( + map (p: { + name = "${p.name}.apk"; + path = p.signedApk; + }) (lib.filter (p: p.name != "CustomWebview") enabledPrebuilts) + ); }; } diff --git a/modules/apps/seedvault.nix b/modules/apps/seedvault.nix index 7c80517c..387ac75f 100644 --- a/modules/apps/seedvault.nix +++ b/modules/apps/seedvault.nix @@ -1,10 +1,22 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, apks, lib, ... }: +{ + config, + pkgs, + apks, + lib, + ... +}: let - inherit (lib) mkIf mkMerge mkOption mkEnableOption types; + inherit (lib) + mkIf + mkMerge + mkOption + mkEnableOption + types + ; cfg = config.apps.seedvault; in @@ -22,56 +34,61 @@ in }; config = mkIf (cfg.enable && (!cfg.includedInFlavor)) (mkMerge [ - { - # In order to switch to using this if it's not set on the first boot, run these: - # $ bmgr list transports - # $ bmgr transport com.stevesoltys.seedvault.transport.ConfigurableBackupTransport + { + # In order to switch to using this if it's not set on the first boot, run these: + # $ bmgr list transports + # $ bmgr transport com.stevesoltys.seedvault.transport.ConfigurableBackupTransport - # Set as default - resources."frameworks/base/packages/SettingsProvider".def_backup_enabled = true; - resources."frameworks/base/packages/SettingsProvider".def_backup_transport = "com.stevesoltys.seedvault.transport.ConfigurableBackupTransport"; - } - (mkIf (config.androidVersion == 12) { - # For android 11, just use the source tree from upstream, and have soong build it - source.dirs."robotnix/seedvault".src = pkgs.fetchFromGitHub { - owner = "seedvault-app"; - repo = "seedvault"; - rev = "b0c6eeb9f7af7845cabdac58a87f183551a053a1"; # 2021-10-23 - sha256 = "0fc7bq8wmav25cb51s7hidrbdb17wq03naymclqbwsc9pxrv4px6"; - }; - source.dirs."robotnix/seedvault".patches = [ ./seedvault-12.patch ]; + # Set as default + resources."frameworks/base/packages/SettingsProvider".def_backup_enabled = true; + resources."frameworks/base/packages/SettingsProvider".def_backup_transport = "com.stevesoltys.seedvault.transport.ConfigurableBackupTransport"; + } + (mkIf (config.androidVersion == 12) { + # For android 11, just use the source tree from upstream, and have soong build it + source.dirs."robotnix/seedvault".src = pkgs.fetchFromGitHub { + owner = "seedvault-app"; + repo = "seedvault"; + rev = "b0c6eeb9f7af7845cabdac58a87f183551a053a1"; # 2021-10-23 + sha256 = "0fc7bq8wmav25cb51s7hidrbdb17wq03naymclqbwsc9pxrv4px6"; + }; + source.dirs."robotnix/seedvault".patches = [ ./seedvault-12.patch ]; - # TODO: Move to product partition? - system.additionalProductPackages = [ "Seedvault" ]; - }) - (mkIf (config.androidVersion == 11) { - # For android 11, just use the source tree from upstream, and have soong build it - source.dirs."robotnix/seedvault".src = pkgs.fetchFromGitHub { - owner = "seedvault-app"; - repo = "seedvault"; - rev = "11-2.3"; # 2021-10-04 - sha256 = "0blqjm5zamam1imzgpkwyvg6n6c2aa9cj5kvcjj44a9glyyqqmry"; - }; + # TODO: Move to product partition? + system.additionalProductPackages = [ "Seedvault" ]; + }) + (mkIf (config.androidVersion == 11) { + # For android 11, just use the source tree from upstream, and have soong build it + source.dirs."robotnix/seedvault".src = pkgs.fetchFromGitHub { + owner = "seedvault-app"; + repo = "seedvault"; + rev = "11-2.3"; # 2021-10-04 + sha256 = "0blqjm5zamam1imzgpkwyvg6n6c2aa9cj5kvcjj44a9glyyqqmry"; + }; - product.additionalProductPackages = [ "Seedvault" ]; - }) - (mkIf (config.androidVersion == 10) { - # For android 10, use the version built natively in nix using gradle2nix. - apps.prebuilt.Seedvault = { - apk = apks.seedvault_10; - packageName = "com.stevesoltys.seedvault"; - certificate = "platform"; # Needs this certificate to use MANAGE_DOCUMENTS permission - privileged = true; - privappPermissions = [ "BACKUP" "MANAGE_USB" "WRITE_SECURE_SETTINGS" "INSTALL_PACKAGES" ]; - }; + product.additionalProductPackages = [ "Seedvault" ]; + }) + (mkIf (config.androidVersion == 10) { + # For android 10, use the version built natively in nix using gradle2nix. + apps.prebuilt.Seedvault = { + apk = apks.seedvault_10; + packageName = "com.stevesoltys.seedvault"; + certificate = "platform"; # Needs this certificate to use MANAGE_DOCUMENTS permission + privileged = true; + privappPermissions = [ + "BACKUP" + "MANAGE_USB" + "WRITE_SECURE_SETTINGS" + "INSTALL_PACKAGES" + ]; + }; - etc."sysconfig/com.stevesoltys.seedvault.xml".text = '' - - - - - ''; - }) + etc."sysconfig/com.stevesoltys.seedvault.xml".text = '' + + + + + ''; + }) ]); } diff --git a/modules/apps/updater.nix b/modules/apps/updater.nix index 3cc7fcd7..78c53338 100644 --- a/modules/apps/updater.nix +++ b/modules/apps/updater.nix @@ -1,10 +1,21 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkOption mkEnableOption mkIf mkMerge types; + inherit (lib) + mkOption + mkEnableOption + mkIf + mkMerge + types + ; cfg = config.apps.updater; @@ -38,7 +49,10 @@ in }; flavor = mkOption { - type = types.enum [ "grapheneos" "lineageos" ]; + type = types.enum [ + "grapheneos" + "lineageos" + ]; default = "grapheneos"; description = '' Which updater package to use, and which kind of metadata to generate for it. @@ -53,47 +67,45 @@ in }; }; - config = let - isLos20 = cfg.flavor == "lineageos" && lib.versionAtLeast (toString config.androidVersion) "13"; - in mkMerge [ - (mkIf cfg.enable (mkMerge [ - { - # TODO: It's currently on system partition in upstream. Shouldn't it be on product partition? - system.additionalProductPackages = [ "Updater" ]; - } + config = + let + isLos20 = cfg.flavor == "lineageos" && lib.versionAtLeast (toString config.androidVersion) "13"; + in + mkMerge [ + (mkIf cfg.enable (mkMerge [ + { + # TODO: It's currently on system partition in upstream. Shouldn't it be on product partition? + system.additionalProductPackages = [ "Updater" ]; + } - (mkIf (cfg.flavor == "grapheneos") { - resources.${relpath} = { - inherit (cfg) url; - channel_default = config.channel; - }; + (mkIf (cfg.flavor == "grapheneos") { + resources.${relpath} = { + inherit (cfg) url; + channel_default = config.channel; + }; - source.dirs = mkIf (!cfg.includedInFlavor) (mkMerge [ - { - ${relpath}.src = src; - } - (mkIf (!cfg.includedInFlavor && config.androidVersion >= 11) { - # Add selinux policies - "robotnix/updater-sepolicy".src = ./updater-sepolicy; - "build/make".postPatch = '' - # Originally from https://github.com/RattlesnakeOS/core-config-repo/blob/0d2cb86007c3b4df98d4f99af3dedf1ccf52b6b1/hooks/aosp_build_pre.sh - sed -i '/product-graph dump-products/a #add selinux policies last\n$(eval include robotnix/updater-sepolicy/sepolicy.mk)' "core/config.mk" - ''; - }) - ]); - }) + source.dirs = mkIf (!cfg.includedInFlavor) (mkMerge [ + { ${relpath}.src = src; } + (mkIf (!cfg.includedInFlavor && config.androidVersion >= 11) { + # Add selinux policies + "robotnix/updater-sepolicy".src = ./updater-sepolicy; + "build/make".postPatch = '' + # Originally from https://github.com/RattlesnakeOS/core-config-repo/blob/0d2cb86007c3b4df98d4f99af3dedf1ccf52b6b1/hooks/aosp_build_pre.sh + sed -i '/product-graph dump-products/a #add selinux policies last\n$(eval include robotnix/updater-sepolicy/sepolicy.mk)' "core/config.mk" + ''; + }) + ]); + }) - (mkIf (cfg.flavor == "lineageos") { - resources."packages/apps/Updater" = mkIf (cfg.flavor == "lineageos") { - updater_server_url = "${cfg.url}lineageos-${config.device}.json"; - }; - }) - ])) + (mkIf (cfg.flavor == "lineageos") { + resources."packages/apps/Updater" = mkIf (cfg.flavor == "lineageos") { + updater_server_url = "${cfg.url}lineageos-${config.device}.json"; + }; + }) + ])) - # Remove package if it's disabled by configuration - # Don't remove it in LineageOS 20, it doesn't like that - (mkIf (!cfg.enable && cfg.includedInFlavor && !isLos20) { - source.dirs.${relpath}.enable = false; - }) - ]; + # Remove package if it's disabled by configuration + # Don't remove it in LineageOS 20, it doesn't like that + (mkIf (!cfg.enable && cfg.includedInFlavor && !isLos20) { source.dirs.${relpath}.enable = false; }) + ]; } diff --git a/modules/apv/apv-lib-check.sh b/modules/apv/apv-lib-check.sh index 759cfb20..0ec693d5 100755 --- a/modules/apv/apv-lib-check.sh +++ b/modules/apv/apv-lib-check.sh @@ -10,17 +10,17 @@ UPSTREAM=$2 cd "$BUILT" check_partition() { - local partition=$1 + local partition=$1 - while read -r lib; do - libdir=$( (readelf -h "$lib" | grep -q ELF64) && echo lib64 || echo lib ) + while read -r lib; do + libdir=$( (readelf -h "$lib" | grep -q ELF64) && echo lib64 || echo lib) - while read -r required_lib; do - if [[ ! (-f "$BUILT/$partition/$libdir/$required_lib" || -L "$BUILT/$partition/$libdir/$required_lib" ) && -e "$UPSTREAM/$partition/$libdir/$required_lib" ]]; then - echo "$partition/$libdir/$required_lib is needed by $lib" - fi - done < <(readelf -d "$lib" | grep NEEDED | tr -s ' ' | cut -d ' ' -f6 | tr -d '[]') - done < <(find "$partition" -type f -name '*.so') + while read -r required_lib; do + if [[ ! (-f "$BUILT/$partition/$libdir/$required_lib" || -L "$BUILT/$partition/$libdir/$required_lib") && -e "$UPSTREAM/$partition/$libdir/$required_lib" ]]; then + echo "$partition/$libdir/$required_lib is needed by $lib" + fi + done < <(readelf -d "$lib" | grep NEEDED | tr -s ' ' | cut -d ' ' -f6 | tr -d '[]') + done < <(find "$partition" -type f -name '*.so') } check_partition "system_ext" diff --git a/modules/apv/autogenerate.nix b/modules/apv/autogenerate.nix index a4f13e84..32890626 100644 --- a/modules/apv/autogenerate.nix +++ b/modules/apv/autogenerate.nix @@ -1,19 +1,37 @@ # SPDX-FileCopyrightText: 2021 Daniel Fullmer # SPDX-License-Identifier: MIT -{ pkgs ? (import ../../pkgs {}) }: +{ + pkgs ? (import ../../pkgs { }), +}: let inherit (pkgs) lib; robotnix = configuration: import ../../default.nix { inherit configuration pkgs; }; - devices = [ "crosshatch" "blueline" "bonito" "sargo" "coral" "flame" "sunfish" "bramble" "redfin" "barbet" "raven" "oriole" ]; + devices = [ + "crosshatch" + "blueline" + "bonito" + "sargo" + "coral" + "flame" + "sunfish" + "bramble" + "redfin" + "barbet" + "raven" + "oriole" + ]; - deviceAttrs = - (device: let + deviceAttrs = ( + device: + let aospBuild = robotnix { - inherit device; flavor = "vanilla"; apv.enable = false; + inherit device; + flavor = "vanilla"; + apv.enable = false; # Add just enough so that it creates a vendor image - source.dirs."vendor/google_devices/${device}".src = pkgs.runCommand "empty-vendor" {} '' + source.dirs."vendor/google_devices/${device}".src = pkgs.runCommand "empty-vendor" { } '' mkdir -p $out/proprietary cat > $out/proprietary/BoardConfigVendor.mk < upstream-files - find ${pkgs.robotnix.unpackImg aospBuild.img} -type f -printf "%P\n" | sort > built-files + suggestedConfig = + pkgs.runCommand "${device}-config.json" { nativeBuildInputs = [ pkgs.python3 ]; } + '' + find ${pkgs.robotnix.unpackImg aospBuild.config.apv.img} -type f -printf "%P\n" | sort > upstream-files + find ${pkgs.robotnix.unpackImg aospBuild.img} -type f -printf "%P\n" | sort > built-files - python3 ${./autogenerate.py} \ - ${aospBuild.config.device} \ - ${aospBuild.config.build.moduleInfo} \ - built-files \ - upstream-files \ - > config.json + python3 ${./autogenerate.py} \ + ${aospBuild.config.device} \ + ${aospBuild.config.build.moduleInfo} \ + built-files \ + upstream-files \ + > config.json - ${pkgs.jq}/bin/jq -s '.[0] * .[1]' ${pkgs.android-prepare-vendor.src}/${device}/config.json config.json > $out - ''; - suggestedBuild = robotnix { inherit device; flavor = "vanilla"; apv.customConfig = lib.importJSON suggestedConfig; }; - AOSPAllianceBuild = robotnix { inherit device; flavor = "vanilla"; }; - jsonDiff = pkgs.runCommand "${device}-suggested-apv-json.diff" {} '' + ${pkgs.jq}/bin/jq -s '.[0] * .[1]' ${pkgs.android-prepare-vendor.src}/${device}/config.json config.json > $out + ''; + suggestedBuild = robotnix { + inherit device; + flavor = "vanilla"; + apv.customConfig = lib.importJSON suggestedConfig; + }; + AOSPAllianceBuild = robotnix { + inherit device; + flavor = "vanilla"; + }; + jsonDiff = pkgs.runCommand "${device}-suggested-apv-json.diff" { } '' ${pkgs.nodePackages.json-diff}/bin/json-diff ${pkgs.android-prepare-vendor.src}/${device}/config.json ${suggestedConfig} > $out || true ''; - in { + in + { inherit aospBuild; inherit suggestedConfig; inherit jsonDiff; inherit suggestedBuild; aospDiff = pkgs.robotnix.compareImagesQuickDiff aospBuild.config.apv.img aospBuild.img; suggestedBuildDiff = pkgs.robotnix.compareImagesQuickDiff suggestedBuild.config.apv.img suggestedBuild.img; - }); -in { + } + ); +in +{ devices = lib.genAttrs devices deviceAttrs; - combined = pkgs.runCommand "apv-generated-combined" {} - (lib.concatMapStringsSep "\n" (device: '' + combined = pkgs.runCommand "apv-generated-combined" { } ( + lib.concatMapStringsSep "\n" (device: '' mkdir -p $out/${device} ${pkgs.jq}/bin/jq -s '.[0] * .[1]' ${pkgs.android-prepare-vendor.src}/${device}/config.json ${(deviceAttrs device).suggestedConfig} > $out/${device}/config.json - '') devices); + '') devices + ); } diff --git a/modules/apv/autogenerate.py b/modules/apv/autogenerate.py index 9a0104fc..87e86614 100755 --- a/modules/apv/autogenerate.py +++ b/modules/apv/autogenerate.py @@ -15,23 +15,27 @@ def main() -> None: def _replace_system_system(s: str) -> str: - if s.startswith('system/system/'): - return s[len('system/'):] + if s.startswith("system/system/"): + return s[len("system/") :] else: return s device_name = sys.argv[1] module_json = json.load(open(sys.argv[2])) - built_files = set(_replace_system_system(s) for s in open(sys.argv[3]).read().split('\n')) - upstream_files = set(_replace_system_system(s) for s in open(sys.argv[4]).read().split('\n')) + built_files = set( + _replace_system_system(s) for s in open(sys.argv[3]).read().split("\n") + ) + upstream_files = set( + _replace_system_system(s) for s in open(sys.argv[4]).read().split("\n") + ) - filename_prefix = f'out/target/product/{device_name}/' + filename_prefix = f"out/target/product/{device_name}/" file_module_lookup = { filename: modulename for modulename, data in module_json.items() - for filename in data['installed'] + for filename in data["installed"] if filename.startswith(filename_prefix) } @@ -43,24 +47,24 @@ def _replace_system_system(s: str) -> str: key = filename_prefix + filename if key in file_module_lookup: # if filename.startswith('vendor/') or filename.startswith('system_ext/'): - if filename.startswith('vendor/'): + if filename.startswith("vendor/"): needed_modules.add(file_module_lookup[key]) - if filename.startswith('vendor/lib64/'): + if filename.startswith("vendor/lib64/"): needed_modules_with_arch.add(file_module_lookup[key] + ":64") else: needed_modules_with_arch.add(file_module_lookup[key]) else: - if not filename.startswith('vendor/lib/modules/'): + if not filename.startswith("vendor/lib/modules/"): needed_files.add(filename) modules_files = set() for modulename in needed_modules: - for filename in module_json[modulename]['installed']: + for filename in module_json[modulename]["installed"]: if filename.startswith(filename_prefix): - modules_files.add(filename[len(filename_prefix):]) + modules_files.add(filename[len(filename_prefix) :]) def _is_bytecode(s: str) -> bool: - return s.endswith('.apk') or s.endswith('.jar') + return s.endswith(".apk") or s.endswith(".jar") DEP_DSOS: List[str] = [ "vendor/lib/libadsprpc.so", @@ -71,30 +75,40 @@ def _is_bytecode(s: str) -> bool: SKIP_MODULES: List[str] = [] - vendor_skip_files = set(filename[len('vendor/'):] for filename in modules_files - if filename.startswith('vendor/') - ) - vendor_skip_files.update(filename[len('vendor/'):] for filename in built_files - if filename in upstream_files and filename.startswith('vendor/') - ) + vendor_skip_files = set( + filename[len("vendor/") :] + for filename in modules_files + if filename.startswith("vendor/") + ) + vendor_skip_files.update( + filename[len("vendor/") :] + for filename in built_files + if filename in upstream_files and filename.startswith("vendor/") + ) # Manual addition. Might not be needed if we include the corresponding stuff in system_ext - vendor_skip_files.add('etc/vintf/manifest/manifest_wifi_ext.xml') + vendor_skip_files.add("etc/vintf/manifest/manifest_wifi_ext.xml") apv_config = { # 'new-modules': [], - 'dep-dso': [ - dso for dso in DEP_DSOS - if dso in needed_files - ], + "dep-dso": [dso for dso in DEP_DSOS if dso in needed_files], # 'rro-overlays': [], - 'forced-modules': sorted(set(modulename for modulename in needed_modules_with_arch - if modulename not in SKIP_MODULES)), - 'vendor-skip-files': sorted(vendor_skip_files), - 'system-bytecode': sorted( - filename for filename in needed_files - if (filename.startswith('system/') and _is_bytecode(filename) - and not ('Google/' in filename or '/Google' in filename)) + "forced-modules": sorted( + set( + modulename + for modulename in needed_modules_with_arch + if modulename not in SKIP_MODULES + ) + ), + "vendor-skip-files": sorted(vendor_skip_files), + "system-bytecode": sorted( + filename + for filename in needed_files + if ( + filename.startswith("system/") + and _is_bytecode(filename) + and not ("Google/" in filename or "/Google" in filename) + ) ), # 'system-other': sorted( # filename for filename in needed_files @@ -122,7 +136,7 @@ def _is_bytecode(s: str) -> bool: # ), } - print(json.dumps(apv_config, sort_keys=True, indent=2, separators=(',', ': '))) + print(json.dumps(apv_config, sort_keys=True, indent=2, separators=(",", ": "))) if __name__ == "__main__": diff --git a/modules/apv/default.nix b/modules/apv/default.nix index 28d7de0c..5bd96c56 100644 --- a/modules/apv/default.nix +++ b/modules/apv/default.nix @@ -1,12 +1,22 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: # Android-prepare-vendor is currently only useful for Pixel phones let - inherit (lib) mkIf mkOption mkEnableOption types; + inherit (lib) + mkIf + mkOption + mkEnableOption + types + ; cfg = config.apv; @@ -17,29 +27,39 @@ let apvConfig = builtins.fromJSON (builtins.readFile configFile); replacedApvConfig = lib.recursiveUpdate apvConfig config.apv.customConfig; - filterConfig = _config: _config // { - system-bytecode = _config.system-bytecode ++ cfg.systemBytecode; - system-other = _config.system-other ++ cfg.systemOther; - } // lib.optionalAttrs (_config ? product-other) { - product-other = _config.product-other; - }; + filterConfig = + _config: + _config + // { + system-bytecode = _config.system-bytecode ++ cfg.systemBytecode; + system-other = _config.system-other ++ cfg.systemOther; + } + // lib.optionalAttrs (_config ? product-other) { product-other = _config.product-other; }; # TODO: There's probably a better way to do this mergedConfig = lib.recursiveUpdate replacedApvConfig ( - if (config.androidVersion >= 12 || config.flavor == "grapheneos") - then filterConfig replacedApvConfig - else { "api-${apiStr}".naked = filterConfig replacedApvConfig."api-${apiStr}".naked; } + if (config.androidVersion >= 12 || config.flavor == "grapheneos") then + filterConfig replacedApvConfig + else + { "api-${apiStr}".naked = filterConfig replacedApvConfig."api-${apiStr}".naked; } ); mergedConfigFile = builtins.toFile "config.json" (builtins.toJSON mergedConfig); latestTelephonyProvider = pkgs.fetchgit { - inherit (lib.importJSON ./latest-telephony-provider.json) - url rev sha256; + inherit (lib.importJSON ./latest-telephony-provider.json) url rev sha256; }; buildVendorFiles = - { device, img, ota ? null, full ? false, timestamp ? 1, buildID ? "robotnix", configFile ? null }: - pkgs.runCommand "vendor-files-${device}" {} '' + { + device, + img, + ota ? null, + full ? false, + timestamp ? 1, + buildID ? "robotnix", + configFile ? null, + }: + pkgs.runCommand "vendor-files-${device}" { } '' # Copy source files since scripts assume that script directories are writable cp -r ${android-prepare-vendor} apv chmod -R u+w apv @@ -51,17 +71,27 @@ let --device "${device}" \ --buildID "${buildID}" \ --imgs "${img}" \ - ${lib.optionalString (config.androidVersion >= 11) "--carrier-list-folder ${latestTelephonyProvider}/assets/latest_carrier_id"} \ + ${ + lib.optionalString ( + config.androidVersion >= 11 + ) "--carrier-list-folder ${latestTelephonyProvider}/assets/latest_carrier_id" + } \ ${lib.optionalString (ota != null) "--ota ${ota}"} \ ${lib.optionalString (config.flavor == "vanilla" && config.androidVersion < 12) "--debugfs"} \ - ${lib.optionalString (config.flavor == "vanilla" && config.androidVersion < 12) "--timestamp \"${builtins.toString timestamp}\""} \ + ${ + lib.optionalString ( + config.flavor == "vanilla" && config.androidVersion < 12 + ) "--timestamp \"${builtins.toString timestamp}\"" + } \ ${lib.optionalString (configFile != null) "--conf-file ${configFile}"} mkdir -p $out cp -r ${device}/${buildID}/* $out ''; - unpackImg = img: pkgs.runCommand "unpacked-img-${config.device}-${cfg.buildID}" {} '' + unpackImg = + img: + pkgs.runCommand "unpacked-img-${config.device}-${cfg.buildID}" { } '' mkdir -p $out ${android-prepare-vendor}/scripts/extract-factory-images.sh \ --input "${img}" \ @@ -70,13 +100,15 @@ let --conf-file ${mergedConfigFile} ''; - unpackOta = ota: pkgs.runCommand "unpacked-ota-${config.device}-${cfg.buildID}" {} '' - mkdir -p $out - ${android-prepare-vendor}/scripts/extract-ota.sh \ - --input "${ota}" \ - --output $out \ - --conf-file ${mergedConfigFile} - ''; + unpackOta = + ota: + pkgs.runCommand "unpacked-ota-${config.device}-${cfg.buildID}" { } '' + mkdir -p $out + ${android-prepare-vendor}/scripts/extract-ota.sh \ + --input "${ota}" \ + --output $out \ + --conf-file ${mergedConfigFile} + ''; in { options.apv = { @@ -96,13 +128,13 @@ in systemBytecode = mkOption { type = types.listOf types.str; - default = []; + default = [ ]; internal = true; }; systemOther = mkOption { type = types.listOf types.str; - default = []; + default = [ ]; internal = true; }; @@ -113,7 +145,7 @@ in customConfig = mkOption { type = types.attrs; - default = {}; + default = { }; internal = true; description = "Replacement apv JSON to use instead of upstream"; }; @@ -121,12 +153,11 @@ in config = { build.apv = { - files = - buildVendorFiles { - inherit (config) device; - inherit (cfg) img ota; - configFile = mergedConfigFile; - }; + files = buildVendorFiles { + inherit (config) device; + inherit (cfg) img ota; + configFile = mergedConfigFile; + }; unpackedImg = pkgs.robotnix.unpackImg cfg.img; }; diff --git a/modules/apv/update-carrierlist.sh b/modules/apv/update-carrierlist.sh index 79048dd0..4756187e 100755 --- a/modules/apv/update-carrierlist.sh +++ b/modules/apv/update-carrierlist.sh @@ -6,4 +6,4 @@ set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")" -nix-prefetch-git https://android.googlesource.com/platform/packages/providers/TelephonyProvider refs/heads/master > latest-telephony-provider.json +nix-prefetch-git https://android.googlesource.com/platform/packages/providers/TelephonyProvider refs/heads/master >latest-telephony-provider.json diff --git a/modules/assertions.nix b/modules/assertions.nix index bc7f91a1..5f8284a4 100644 --- a/modules/assertions.nix +++ b/modules/assertions.nix @@ -13,8 +13,13 @@ in assertions = mkOption { type = types.listOf types.unspecified; internal = true; - default = []; - example = [ { assertion = false; message = "you can't enable this for that reason"; } ]; + default = [ ]; + example = [ + { + assertion = false; + message = "you can't enable this for that reason"; + } + ]; description = '' This option allows modules to express conditions that must hold for the evaluation of the system configuration to @@ -24,7 +29,7 @@ in warnings = mkOption { internal = true; - default = []; + default = [ ]; type = types.listOf types.str; example = [ "The `foo' service is deprecated and will go away soon!" ]; description = '' diff --git a/modules/base.nix b/modules/base.nix index 53cd244c..90034303 100644 --- a/modules/base.nix +++ b/modules/base.nix @@ -1,17 +1,30 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) - mkIf mkMerge mkOption mkOptionDefault mkEnableOption mkDefault types; + mkIf + mkMerge + mkOption + mkOptionDefault + mkEnableOption + mkDefault + types + ; - fakeuser = pkgs.callPackage ./fakeuser {}; + fakeuser = pkgs.callPackage ./fakeuser { }; # Taken from https://github.com/edolstra/flake-compat/ # Format number of seconds in the Unix epoch as %Y%m%d%H - formatSecondsSinceEpoch = t: + formatSecondsSinceEpoch = + t: let rem = x: y: x - x / y * y; days = t / 86400; @@ -33,7 +46,8 @@ let y' = y + (if m <= 2 then 1 else 0); pad = s: if builtins.stringLength s < 2 then "0" + s else s; - in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}"; + in + "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}"; in { options = { @@ -69,13 +83,22 @@ in arch = mkOption { default = "arm64"; - type = types.enum [ "arm64" "arm" "x86_64" "x86" ]; + type = types.enum [ + "arm64" + "arm" + "x86_64" + "x86" + ]; description = "Architecture of phone, usually set automatically by device"; }; variant = mkOption { default = "user"; - type = types.enum [ "user" "userdebug" "eng" ]; + type = types.enum [ + "user" + "userdebug" + "eng" + ]; description = '' `user` has limited access and is suited for production. `userdebug` is like user but with root access and debug capability. @@ -98,7 +121,10 @@ in buildType = mkOption { default = "release"; - type = types.enum [ "release" "debug" ]; + type = types.enum [ + "release" + "debug" + ]; description = "one of \"release\", \"debug\""; }; @@ -118,9 +144,11 @@ in Unix time (seconds since the epoch) that this build is taking place. Needs to be monotonically increasing for each build if you use the over-the-air (OTA) update mechanism. e.g. output of `date +%s` - ''; + ''; example = 1565645583; - default = with lib; foldl' max 1 (mapAttrsToList (n: v: if v.enable then v.dateTime else 1) config.source.dirs); + default = + with lib; + foldl' max 1 (mapAttrsToList (n: v: if v.enable then v.dateTime else 1) config.source.dirs); defaultText = "*maximum of source.dirs..dateTime*"; }; @@ -144,25 +172,25 @@ in # TODO: extract system/product/vendor options into a submodule system.additionalProductPackages = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; description = "`PRODUCT_PACKAGES` to add under `system` partition."; }; product.additionalProductPackages = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; description = "`PRODUCT_PACKAGES` to add under `product` partition."; }; vendor.additionalProductPackages = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; description = "`PRODUCT_PACKAGES` to add under `vendor` partition."; }; removedProductPackages = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; description = "`PRODUCT_PACKAGES` to remove from build"; }; @@ -193,13 +221,13 @@ in envPackages = mkOption { type = types.listOf types.package; internal = true; - default = []; + default = [ ]; }; envVars = mkOption { type = types.attrsOf types.str; internal = true; - default = {}; + default = { }; }; useReproducibilityFixes = mkOption { @@ -211,326 +239,410 @@ in # Random attrset to throw build products into build = mkOption { internal = true; - default = {}; + default = { }; type = types.attrs; }; }; config = mkMerge [ - (mkIf (lib.elem config.device ["arm64" "arm" "x86" "x86_64"]) { - # If this is a generic build for an arch, just set the arch as well - arch = mkDefault config.device; - deviceFamily = mkDefault "generic"; - }) - { - apiLevel = { - # TODO: If we start building older androids and need the distinction - # between 7 and 7.1, we should probably switch to a string androidVersion - "7" = 25; # Assuming 7.1 - "8" = 27; # Assuming 8.1 - "9" = 28; - "10" = 29; - "11" = 30; - "12" = 32; - "13" = 33; - }.${builtins.toString config.androidVersion} or 32; - - buildNumber = mkOptionDefault (formatSecondsSinceEpoch config.buildDateTime); - - productName = mkIf (config.device != null) (mkOptionDefault "${config.productNamePrefix}${config.device}"); - - system.extraConfig = lib.concatMapStringsSep "\n" (name: "PRODUCT_PACKAGES += ${name}") config.system.additionalProductPackages; - product.extraConfig = lib.concatMapStringsSep "\n" (name: "PRODUCT_PACKAGES += ${name}") config.product.additionalProductPackages; - vendor.extraConfig = lib.concatMapStringsSep "\n" (name: "PRODUCT_PACKAGES += ${name}") config.vendor.additionalProductPackages; - - # TODO: The " \\" in the below sed is a bit flaky, and would require the line to end in " \\" - # come up with something more robust. - source.dirs."build/make".postPatch = '' - ${lib.concatMapStringsSep "\n" (name: "sed -i '/${name} \\\\/d' target/product/*.mk") config.removedProductPackages} - '' + (if (config.androidVersion >= 10) then '' - echo "\$(call inherit-product-if-exists, robotnix/config/system.mk)" >> target/product/handheld_system.mk - echo "\$(call inherit-product-if-exists, robotnix/config/product.mk)" >> target/product/handheld_product.mk - echo "\$(call inherit-product-if-exists, robotnix/config/vendor.mk)" >> target/product/handheld_vendor.mk - '' else if (config.androidVersion >= 8) /* FIXME Unclear if android 8 has these... */ then '' - echo "\$(call inherit-product-if-exists, robotnix/config/system.mk)" >> target/product/core.mk - echo "\$(call inherit-product-if-exists, robotnix/config/product.mk)" >> target/product/core.mk - echo "\$(call inherit-product-if-exists, robotnix/config/vendor.mk)" >> target/product/core.mk - '' else '' - # no-op as it's not present in android 7 and under? - ''); - - source.dirs."robotnix/config".src = let - systemMk = pkgs.writeTextFile { name = "system.mk"; text = config.system.extraConfig; }; - productMk = pkgs.writeTextFile { name = "product.mk"; text = config.product.extraConfig; }; - vendorMk = pkgs.writeTextFile { name = "vendor.mk"; text = config.vendor.extraConfig; }; - in - pkgs.runCommand "robotnix-config" {} '' - mkdir -p $out - cp ${systemMk} $out/system.mk - cp ${productMk} $out/product.mk - cp ${vendorMk} $out/vendor.mk - ''; - - envVars = mkMerge [ + (mkIf + (lib.elem config.device [ + "arm64" + "arm" + "x86" + "x86_64" + ]) { - BUILD_NUMBER = config.buildNumber; - BUILD_DATETIME = builtins.toString config.buildDateTime; - DISPLAY_BUILD_NUMBER="true"; # Enabling this shows the BUILD_ID concatenated with the BUILD_NUMBER in the settings menu + # If this is a generic build for an arch, just set the arch as well + arch = mkDefault config.device; + deviceFamily = mkDefault "generic"; } - (mkIf config.ccache.enable { - CCACHE_EXEC = pkgs.ccache + /bin/ccache; - USE_CCACHE = "true"; - CCACHE_DIR = "/var/cache/ccache"; # Make configurable? - CCACHE_UMASK = "007"; # CCACHE_DIR should be user root, group nixbld - CCACHE_COMPILERCHECK = "content"; # Default is a mtime+size check. We can't fully rely on that. - }) - (mkIf (config.androidVersion >= 11) { - # Android 11 ninja filters env vars for more correct incrementalism. - # However, env vars like LD_LIBRARY_PATH must be set for nixpkgs build-userenv-fhs to work - ALLOW_NINJA_ENV = "true"; - }) - ]; - - build = rec { - mkAndroid = - { name, makeTargets, installPhase, outputs ? [ "out" ], ninjaArgs ? "" }: - # Use NoCC here so we don't get extra environment variables that might conflict with AOSP build stuff. Like CC, NM, etc. - pkgs.stdenvNoCC.mkDerivation ({ - inherit name; - srcs = []; - - # TODO: update in the future, might not be required. - # gets permissed denied if not set, in some of our deps - dontUpdateAutotoolsGnuConfigScripts = true; - - # TODO: Clean this stuff up. unshare / robotnix-build could probably be combined into a single utility. - builder = pkgs.writeShellScript "builder.sh" '' - export SAVED_UID=$(${pkgs.coreutils}/bin/id -u) - export SAVED_GID=$(${pkgs.coreutils}/bin/id -g) - - # Become a fake "root" in a new namespace so we can bind mount sources - ${pkgs.toybox}/bin/cat << 'EOF' | ${pkgs.util-linux}/bin/unshare -m -r ${pkgs.runtimeShell} - set -euo pipefail - source $stdenv/setup - genericBuild - EOF - ''; + ) + { + apiLevel = + { + # TODO: If we start building older androids and need the distinction + # between 7 and 7.1, we should probably switch to a string androidVersion + "7" = 25; # Assuming 7.1 + "8" = 27; # Assuming 8.1 + "9" = 28; + "10" = 29; + "11" = 30; + "12" = 32; + "13" = 33; + } + .${builtins.toString config.androidVersion} or 32; + + buildNumber = mkOptionDefault (formatSecondsSinceEpoch config.buildDateTime); + + productName = mkIf (config.device != null) ( + mkOptionDefault "${config.productNamePrefix}${config.device}" + ); + + system.extraConfig = lib.concatMapStringsSep "\n" ( + name: "PRODUCT_PACKAGES += ${name}" + ) config.system.additionalProductPackages; + product.extraConfig = lib.concatMapStringsSep "\n" ( + name: "PRODUCT_PACKAGES += ${name}" + ) config.product.additionalProductPackages; + vendor.extraConfig = lib.concatMapStringsSep "\n" ( + name: "PRODUCT_PACKAGES += ${name}" + ) config.vendor.additionalProductPackages; + + # TODO: The " \\" in the below sed is a bit flaky, and would require the line to end in " \\" + # come up with something more robust. + source.dirs."build/make".postPatch = + '' + ${lib.concatMapStringsSep "\n" ( + name: "sed -i '/${name} \\\\/d' target/product/*.mk" + ) config.removedProductPackages} + '' + + ( + if (config.androidVersion >= 10) then + '' + echo "\$(call inherit-product-if-exists, robotnix/config/system.mk)" >> target/product/handheld_system.mk + echo "\$(call inherit-product-if-exists, robotnix/config/product.mk)" >> target/product/handheld_product.mk + echo "\$(call inherit-product-if-exists, robotnix/config/vendor.mk)" >> target/product/handheld_vendor.mk + '' + else if + (config.androidVersion >= 8) # FIXME Unclear if android 8 has these... + then + '' + echo "\$(call inherit-product-if-exists, robotnix/config/system.mk)" >> target/product/core.mk + echo "\$(call inherit-product-if-exists, robotnix/config/product.mk)" >> target/product/core.mk + echo "\$(call inherit-product-if-exists, robotnix/config/vendor.mk)" >> target/product/core.mk + '' + else + '' + # no-op as it's not present in android 7 and under? + '' + ); + + source.dirs."robotnix/config".src = + let + systemMk = pkgs.writeTextFile { + name = "system.mk"; + text = config.system.extraConfig; + }; + productMk = pkgs.writeTextFile { + name = "product.mk"; + text = config.product.extraConfig; + }; + vendorMk = pkgs.writeTextFile { + name = "vendor.mk"; + text = config.vendor.extraConfig; + }; + in + pkgs.runCommand "robotnix-config" { } '' + mkdir -p $out + cp ${systemMk} $out/system.mk + cp ${productMk} $out/product.mk + cp ${vendorMk} $out/vendor.mk + ''; - inherit outputs; + envVars = mkMerge [ + { + BUILD_NUMBER = config.buildNumber; + BUILD_DATETIME = builtins.toString config.buildDateTime; + DISPLAY_BUILD_NUMBER = "true"; # Enabling this shows the BUILD_ID concatenated with the BUILD_NUMBER in the settings menu + } + (mkIf config.ccache.enable { + CCACHE_EXEC = pkgs.ccache + /bin/ccache; + USE_CCACHE = "true"; + CCACHE_DIR = "/var/cache/ccache"; # Make configurable? + CCACHE_UMASK = "007"; # CCACHE_DIR should be user root, group nixbld + CCACHE_COMPILERCHECK = "content"; # Default is a mtime+size check. We can't fully rely on that. + }) + (mkIf (config.androidVersion >= 11) { + # Android 11 ninja filters env vars for more correct incrementalism. + # However, env vars like LD_LIBRARY_PATH must be set for nixpkgs build-userenv-fhs to work + ALLOW_NINJA_ENV = "true"; + }) + ]; + + build = rec { + mkAndroid = + { + name, + makeTargets, + installPhase, + outputs ? [ "out" ], + ninjaArgs ? "", + }: + # Use NoCC here so we don't get extra environment variables that might conflict with AOSP build stuff. Like CC, NM, etc. + pkgs.stdenvNoCC.mkDerivation ( + { + inherit name; + srcs = [ ]; + + # TODO: update in the future, might not be required. + # gets permissed denied if not set, in some of our deps + dontUpdateAutotoolsGnuConfigScripts = true; + + # TODO: Clean this stuff up. unshare / robotnix-build could probably be combined into a single utility. + builder = pkgs.writeShellScript "builder.sh" '' + export SAVED_UID=$(${pkgs.coreutils}/bin/id -u) + export SAVED_GID=$(${pkgs.coreutils}/bin/id -g) + + # Become a fake "root" in a new namespace so we can bind mount sources + ${pkgs.toybox}/bin/cat << 'EOF' | ${pkgs.util-linux}/bin/unshare -m -r ${pkgs.runtimeShell} + set -euo pipefail + source $stdenv/setup + genericBuild + EOF + ''; - requiredSystemFeatures = [ "big-parallel" ]; + inherit outputs; - nativeBuildInputs = [ config.build.env fakeuser ]; + requiredSystemFeatures = [ "big-parallel" ]; - unpackPhase = '' - export rootDir=$PWD - source ${config.build.unpackScript} - ''; + nativeBuildInputs = [ + config.build.env + fakeuser + ]; - dontConfigure = true; - - # This was originally in the buildPhase, but building the sdk / atree would complain for unknown reasons when it was set - # export OUT_DIR=$rootDir/out - buildPhase = '' - # Become the original user--not fake root. - ${pkgs.toybox}/bin/cat << 'EOF2' | fakeuser $SAVED_UID $SAVED_GID robotnix-build - set -e -o pipefail + unpackPhase = '' + export rootDir=$PWD + source ${config.build.unpackScript} + ''; - ${lib.optionalString (config.androidVersion >= 6 && config.androidVersion <= 8) '' - # Needed for the jack compilation server - # https://source.android.com/setup/build/jack - mkdir -p $HOME - export USER=foo - ''} - source build/envsetup.sh - choosecombo ${config.buildType} ${config.productName} ${config.variant} + dontConfigure = true; - # Fail early if the product was not selected properly - test -n "$TARGET_PRODUCT" || exit 1 + # This was originally in the buildPhase, but building the sdk / atree would complain for unknown reasons when it was set + # export OUT_DIR=$rootDir/out + buildPhase = '' + # Become the original user--not fake root. + ${pkgs.toybox}/bin/cat << 'EOF2' | fakeuser $SAVED_UID $SAVED_GID robotnix-build + set -e -o pipefail - export NINJA_ARGS="-j$NIX_BUILD_CORES ${toString ninjaArgs}" - m ${toString makeTargets} | cat - echo $ANDROID_PRODUCT_OUT > ANDROID_PRODUCT_OUT + ${lib.optionalString (config.androidVersion >= 6 && config.androidVersion <= 8) '' + # Needed for the jack compilation server + # https://source.android.com/setup/build/jack + mkdir -p $HOME + export USER=foo + ''} + source build/envsetup.sh + choosecombo ${config.buildType} ${config.productName} ${config.variant} - EOF2 - ''; + # Fail early if the product was not selected properly + test -n "$TARGET_PRODUCT" || exit 1 - installPhase = '' - export ANDROID_PRODUCT_OUT=$(cat ANDROID_PRODUCT_OUT) - '' + installPhase; - - dontFixup = true; - dontMoveLib64 = true; - } // config.envVars); - - android = mkAndroid { - name = "robotnix-${config.productName}-${config.buildNumber}"; - makeTargets = [ "target-files-package" "otatools-package" ]; - # Note that $ANDROID_PRODUCT_OUT is set by choosecombo above - installPhase = '' - mkdir -p $out - cp --reflink=auto $ANDROID_PRODUCT_OUT/otatools.zip $out/ - cp --reflink=auto $ANDROID_PRODUCT_OUT/obj/PACKAGING/target_files_intermediates/${config.productName}-target_files-${config.buildNumber}.zip $out/ - ''; - }; + export NINJA_ARGS="-j$NIX_BUILD_CORES ${toString ninjaArgs}" + m ${toString makeTargets} | cat + echo $ANDROID_PRODUCT_OUT > ANDROID_PRODUCT_OUT - checkAndroid = mkAndroid { - name = "robotnix-check-${config.device}-${config.buildNumber}"; - makeTargets = [ "target-files-package" "otatools-package" ]; - ninjaArgs = "-n"; # Pretend to run the actual build steps - # Just copy some things that are useful for debugging - installPhase = '' - mkdir -p $out - cp -r out/*.{log,gz} $out/ - cp -r out/.module_paths $out/ - ''; - }; + EOF2 + ''; - moduleInfo = mkAndroid { - name = "robotnix-module-info-${config.device}-${config.buildNumber}.json"; - # Can't use absolute path from $ANDROID_PRODUCT_OUT here since make needs a relative path - makeTargets = [ "$(get_build_var PRODUCT_OUT)/module-info.json" ]; - installPhase = '' - cp $ANDROID_PRODUCT_OUT/module-info.json $out - ''; - }; + installPhase = + '' + export ANDROID_PRODUCT_OUT=$(cat ANDROID_PRODUCT_OUT) + '' + + installPhase; + + dontFixup = true; + dontMoveLib64 = true; + } + // config.envVars + ); + + android = mkAndroid { + name = "robotnix-${config.productName}-${config.buildNumber}"; + makeTargets = [ + "target-files-package" + "otatools-package" + ]; + # Note that $ANDROID_PRODUCT_OUT is set by choosecombo above + installPhase = '' + mkdir -p $out + cp --reflink=auto $ANDROID_PRODUCT_OUT/otatools.zip $out/ + cp --reflink=auto $ANDROID_PRODUCT_OUT/obj/PACKAGING/target_files_intermediates/${config.productName}-target_files-${config.buildNumber}.zip $out/ + ''; + }; + + checkAndroid = mkAndroid { + name = "robotnix-check-${config.device}-${config.buildNumber}"; + makeTargets = [ + "target-files-package" + "otatools-package" + ]; + ninjaArgs = "-n"; # Pretend to run the actual build steps + # Just copy some things that are useful for debugging + installPhase = '' + mkdir -p $out + cp -r out/*.{log,gz} $out/ + cp -r out/.module_paths $out/ + ''; + }; - # Save significant build time by building components simultaneously. - mkAndroidComponents = targets: mkAndroid { - name = "robotnix-android-components"; - makeTargets = targets ++ [ "$(get_build_var PRODUCT_OUT)/module-info.json" ]; - installPhase = '' - ${pkgs.python3.interpreter} - "$out" "$ANDROID_PRODUCT_OUT/module-info.json" ${lib.escapeShellArgs targets} << EOF - import json - import os - import shutil - import sys - outdir = sys.argv[1] - module_info = json.load(open(sys.argv[2])) - targets = sys.argv[3:] - for target in targets: - if target in module_info: - for item in module_info[target]['installed']: - if item.startswith('out/'): - output = outdir + item[3:] - else: - output = outdir + '/' + item - os.makedirs(os.path.dirname(output), exist_ok=True) - shutil.copyfile(item, output) - EOF - ''; - }; + moduleInfo = mkAndroid { + name = "robotnix-module-info-${config.device}-${config.buildNumber}.json"; + # Can't use absolute path from $ANDROID_PRODUCT_OUT here since make needs a relative path + makeTargets = [ "$(get_build_var PRODUCT_OUT)/module-info.json" ]; + installPhase = '' + cp $ANDROID_PRODUCT_OUT/module-info.json $out + ''; + }; + + # Save significant build time by building components simultaneously. + mkAndroidComponents = + targets: + mkAndroid { + name = "robotnix-android-components"; + makeTargets = targets ++ [ "$(get_build_var PRODUCT_OUT)/module-info.json" ]; + installPhase = '' + ${pkgs.python3.interpreter} - "$out" "$ANDROID_PRODUCT_OUT/module-info.json" ${lib.escapeShellArgs targets} << EOF + import json + import os + import shutil + import sys + outdir = sys.argv[1] + module_info = json.load(open(sys.argv[2])) + targets = sys.argv[3:] + for target in targets: + if target in module_info: + for item in module_info[target]['installed']: + if item.startswith('out/'): + output = outdir + item[3:] + else: + output = outdir + '/' + item + os.makedirs(os.path.dirname(output), exist_ok=True) + shutil.copyfile(item, output) + EOF + ''; + }; + + mkAndroidComponent = + target: + (mkAndroidComponents [ target ]).overrideAttrs (_: { + name = target; + }); - mkAndroidComponent = target: (mkAndroidComponents [ target ]).overrideAttrs (_: { name=target; }); + otaTools = fixOtaTools "${config.build.android}/otatools.zip"; - otaTools = fixOtaTools "${config.build.android}/otatools.zip"; + # Also make a version without building all of target-files-package. This + # is just for debugging. We save significant time for a full build by + # normally building target-files-package and otatools-package + # simultaneously + otaToolsQuick = fixOtaTools (mkAndroid { + name = "otatools.zip"; + makeTargets = [ "otatools-package" ]; + installPhase = '' + cp --reflink=auto $ANDROID_PRODUCT_OUT/otatools.zip $out + ''; + }); + + fixOtaTools = + src: + pkgs.stdenv.mkDerivation { + name = "ota-tools"; + inherit src; + sourceRoot = "."; + nativeBuildInputs = with pkgs; [ + unzip + python3Packages.pytest + ]; + buildInputs = [ (pkgs.python3.withPackages (p: [ p.protobuf ])) ]; + postPatch = + lib.optionalString (config.androidVersion == 11) '' + cp bin/debugfs_static bin/debugfs + '' + + lib.optionalString (config.androidVersion <= 10) '' + substituteInPlace releasetools/common.py \ + --replace 'self.search_path = platform_search_path.get(sys.platform)' "self.search_path = \"$out\"" \ + ''; - # Also make a version without building all of target-files-package. This - # is just for debugging. We save significant time for a full build by - # normally building target-files-package and otatools-package - # simultaneously - otaToolsQuick = fixOtaTools (mkAndroid { - name = "otatools.zip"; - makeTargets = [ "otatools-package" ]; - installPhase = '' - cp --reflink=auto $ANDROID_PRODUCT_OUT/otatools.zip $out - ''; - }); - - fixOtaTools = src: pkgs.stdenv.mkDerivation { - name = "ota-tools"; - inherit src; - sourceRoot = "."; - nativeBuildInputs = with pkgs; [ unzip python3Packages.pytest ]; - buildInputs = [ (pkgs.python3.withPackages (p: [ p.protobuf ])) ]; - postPatch = lib.optionalString (config.androidVersion == 11) '' - cp bin/debugfs_static bin/debugfs - '' + lib.optionalString (config.androidVersion <= 10) '' - substituteInPlace releasetools/common.py \ - --replace 'self.search_path = platform_search_path.get(sys.platform)' "self.search_path = \"$out\"" \ - ''; + dontBuild = true; + + installPhase = + '' + for file in bin/*; do + isELF "$file" || continue + bash ${../scripts/patchelf-prefix.sh} "$file" "${pkgs.stdenv.cc.bintools.dynamicLinker}" || continue + done + '' + + '' + mkdir -p $out + cp --reflink=auto -r * $out/ + '' + + lib.optionalString (config.androidVersion <= 10) '' + ln -s $out/releasetools/sign_target_files_apks.py $out/bin/sign_target_files_apks + ln -s $out/releasetools/img_from_target_files.py $out/bin/img_from_target_files + ln -s $out/releasetools/ota_from_target_files.py $out/bin/ota_from_target_files + ''; - dontBuild = true; + # Since we copy everything from build dir into $out, we don't want + # env-vars file which contains a bunch of references we don't need + noDumpEnvVars = true; + + # This breaks the executables with embedded python interpreters + dontStrip = true; + }; + + # Just included for convenience when building outside of nix. + # TODO: Better way than creating all these scripts and feeding with init-file? + # debugUnpackScript = config.build.debugUnpackScript; + # debugPatchScript = config.build.debugPatchScript; + debugEnterEnv = pkgs.writeShellScript "debug-enter-env.sh" '' + export SAVED_UID=$(${pkgs.coreutils}/bin/id -u) + export SAVED_GID=$(${pkgs.coreutils}/bin/id -g) + ${pkgs.util-linux}/bin/unshare -m -r ${pkgs.writeShellScript "debug-enter-env2.sh" '' + export rootDir=$PWD + source ${config.build.unpackScript} + ${lib.concatStringsSep "\n" ( + lib.mapAttrsToList (name: value: "export ${name}=${value}") config.envVars + )} - installPhase = '' - for file in bin/*; do - isELF "$file" || continue - bash ${../scripts/patchelf-prefix.sh} "$file" "${pkgs.stdenv.cc.bintools.dynamicLinker}" || continue - done - '' + '' - mkdir -p $out - cp --reflink=auto -r * $out/ - '' + lib.optionalString (config.androidVersion <= 10) '' - ln -s $out/releasetools/sign_target_files_apks.py $out/bin/sign_target_files_apks - ln -s $out/releasetools/img_from_target_files.py $out/bin/img_from_target_files - ln -s $out/releasetools/ota_from_target_files.py $out/bin/ota_from_target_files + # Become the original user--not fake root. Enter an FHS user namespace + ${fakeuser}/bin/fakeuser $SAVED_UID $SAVED_GID ${config.build.env}/bin/robotnix-build + ''} ''; - # Since we copy everything from build dir into $out, we don't want - # env-vars file which contains a bunch of references we don't need - noDumpEnvVars = true; - - # This breaks the executables with embedded python interpreters - dontStrip = true; + env = + let + # Ugly workaround needed in Android >= 12 + patchedPkgs = pkgs.extend ( + self: super: { + bashInteractive = super.bashInteractive.overrideAttrs (attrs: { + # Removed: + # -DDEFAULT_PATH_VALUE="/no-such-path" + # -DSTANDARD_UTILS_PATH="/no-such-path" + # This creates a bash closer to a normal FHS distro bash. + # Somewhere in the android build system >= android 12, bash starts + # inside an environment with PATH unset, and it gets "/no-such-path" + # Command: env -i bash -c 'echo $PATH' + # On NixOS/nixpkgs it outputs: /no-such-path + # On normal distros it outputs: /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:. + NIX_CFLAGS_COMPILE = '' + -DSYS_BASHRC="/etc/bashrc" + -DSYS_BASH_LOGOUT="/etc/bash_logout" + -DNON_INTERACTIVE_LOGIN_SHELLS + -DSSH_SOURCE_BASHRC + ''; + }); + } + ); + buildFHSUserEnv = + if (config.androidVersion >= 12) then patchedPkgs.buildFHSUserEnv else pkgs.buildFHSUserEnv; + in + buildFHSUserEnv { + name = "robotnix-build"; + targetPkgs = pkgs: config.envPackages; + multiPkgs = pkgs: with pkgs; [ zlib ]; + + # TODO might not be needed in the future, required now because + # Android works in mysterious ways. Wasn't needed in the past + # because these paths were already a part of LD_LIBRARY_PATH + # when using FHS. + # + # See here for issue when it was introduced https://github.com/NixOS/nixpkgs/issues/262775 + # Inspiration taken from here https://github.com/NixOS/nixpkgs/pull/278361 + # More information here as well https://github.com/NixOS/nixpkgs/issues/103648 + profile = '' + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/lib32 + ''; + }; }; - - # Just included for convenience when building outside of nix. - # TODO: Better way than creating all these scripts and feeding with init-file? -# debugUnpackScript = config.build.debugUnpackScript; -# debugPatchScript = config.build.debugPatchScript; - debugEnterEnv = pkgs.writeShellScript "debug-enter-env.sh" '' - export SAVED_UID=$(${pkgs.coreutils}/bin/id -u) - export SAVED_GID=$(${pkgs.coreutils}/bin/id -g) - ${pkgs.util-linux}/bin/unshare -m -r ${pkgs.writeShellScript "debug-enter-env2.sh" '' - export rootDir=$PWD - source ${config.build.unpackScript} - ${lib.concatStringsSep "\n" (lib.mapAttrsToList (name: value: "export ${name}=${value}") config.envVars)} - - # Become the original user--not fake root. Enter an FHS user namespace - ${fakeuser}/bin/fakeuser $SAVED_UID $SAVED_GID ${config.build.env}/bin/robotnix-build - ''} - ''; - - env = let - # Ugly workaround needed in Android >= 12 - patchedPkgs = pkgs.extend - (self: super: { - bashInteractive = super.bashInteractive.overrideAttrs (attrs: { - # Removed: - # -DDEFAULT_PATH_VALUE="/no-such-path" - # -DSTANDARD_UTILS_PATH="/no-such-path" - # This creates a bash closer to a normal FHS distro bash. - # Somewhere in the android build system >= android 12, bash starts - # inside an environment with PATH unset, and it gets "/no-such-path" - # Command: env -i bash -c 'echo $PATH' - # On NixOS/nixpkgs it outputs: /no-such-path - # On normal distros it outputs: /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:. - NIX_CFLAGS_COMPILE = '' - -DSYS_BASHRC="/etc/bashrc" - -DSYS_BASH_LOGOUT="/etc/bash_logout" - -DNON_INTERACTIVE_LOGIN_SHELLS - -DSSH_SOURCE_BASHRC - ''; - }); - }); - buildFHSUserEnv = if (config.androidVersion >= 12) then patchedPkgs.buildFHSUserEnv else pkgs.buildFHSUserEnv; - in buildFHSUserEnv { - name = "robotnix-build"; - targetPkgs = pkgs: config.envPackages; - multiPkgs = pkgs: with pkgs; [ zlib ]; - - # TODO might not be needed in the future, required now because - # Android works in mysterious ways. Wasn't needed in the past - # because these paths were already a part of LD_LIBRARY_PATH - # when using FHS. - # - # See here for issue when it was introduced https://github.com/NixOS/nixpkgs/issues/262775 - # Inspiration taken from here https://github.com/NixOS/nixpkgs/pull/278361 - # More information here as well https://github.com/NixOS/nixpkgs/issues/103648 - profile = '' - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/lib32 - ''; - }; - }; - }]; + } + ]; } diff --git a/modules/emulator.nix b/modules/emulator.nix index dc68940f..09fee968 100644 --- a/modules/emulator.nix +++ b/modules/emulator.nix @@ -1,7 +1,12 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: { config.build = { @@ -14,7 +19,9 @@ mkdir -p $out cp --reflink=auto $ANDROID_PRODUCT_OUT/vendor-qemu.img $out/vendor.img || true cp --reflink=auto $ANDROID_PRODUCT_OUT/system-qemu.img $out/system.img || true - cp --reflink=auto $ANDROID_PRODUCT_OUT/ramdisk${lib.optionalString (config.androidVersion >= 11) "-qemu"}.img $out/ramdisk.img || true + cp --reflink=auto $ANDROID_PRODUCT_OUT/ramdisk${ + lib.optionalString (config.androidVersion >= 11) "-qemu" + }.img $out/ramdisk.img || true cp --reflink=auto $ANDROID_PRODUCT_OUT/userdata.img $out/userdata.img || true cp --reflink=auto $ANDROID_PRODUCT_OUT/vbmeta.img $out/vbmeta.img || true cp --reflink=auto -r $ANDROID_PRODUCT_OUT/data $out/ || true diff --git a/modules/envpackages.nix b/modules/envpackages.nix index 23c09c1e..b8dd7fbf 100644 --- a/modules/envpackages.nix +++ b/modules/envpackages.nix @@ -1,7 +1,12 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkIf mkMerge; @@ -9,61 +14,68 @@ in { # It's convenient to have this all in one file, instead of separately in 9/default.nix, 10/default.nix, etc # Check build/soong/ui/build/paths/config.go for a list of things that are needed - envPackages = with pkgs; mkMerge ([ - [ - bc - git - gnumake - jre8_headless - lsof - m4 - ncurses5 - libxcrypt-legacy - openssl # Used in avbtool - psmisc # for "fuser", "pstree" - rsync - unzip - zip + envPackages = + with pkgs; + mkMerge ([ + [ + bc + git + gnumake + jre8_headless + lsof + m4 + ncurses5 + libxcrypt-legacy + openssl # Used in avbtool + psmisc # for "fuser", "pstree" + rsync + unzip + zip - # Things not in build/soong/ui/build/paths/config.go - nettools # Needed for "hostname" in build/soong/ui/build/sandbox_linux.go - procps # Needed for "ps" in build/envsetup.sh - ] - (mkIf (config.androidVersion >= 12) [ - freetype # Needed by jdk9 prebuilt - fontconfig + # Things not in build/soong/ui/build/paths/config.go + nettools # Needed for "hostname" in build/soong/ui/build/sandbox_linux.go + procps # Needed for "ps" in build/envsetup.sh + ] + (mkIf (config.androidVersion >= 12) [ + freetype # Needed by jdk9 prebuilt + fontconfig - # Goldfish doesn't need py2 anymore in Android 12+! - # c.f. https://android.googlesource.com/device/generic/goldfish/+/605e6a14e44c99e87d48bf52507f8aa01633fb04 - python3 - ]) - (mkIf ((config.androidVersion >= 10) && (config.androidVersion <= 11)) [ - freetype # Needed by jdk9 prebuilt - fontconfig + # Goldfish doesn't need py2 anymore in Android 12+! + # c.f. https://android.googlesource.com/device/generic/goldfish/+/605e6a14e44c99e87d48bf52507f8aa01633fb04 + python3 + ]) + (mkIf ((config.androidVersion >= 10) && (config.androidVersion <= 11)) [ + freetype # Needed by jdk9 prebuilt + fontconfig - python3 - python2 # device/generic/goldfish/tools/mk_combined_img.py still needs py2 :( - ]) - (mkIf (config.androidVersion <= 9) [ - # stuff that was in the earlier buildenv. Not entirely sure everything here is necessary - (androidPkgs.sdk (p: with p; [ cmdline-tools-latest platform-tools ])) - openssl.dev - bison - curl - flex - gcc - gitRepo - gnupg - gperf - imagemagick - libxml2 - lzip - lzop - perl - python2 - schedtool - util-linux - which - ]) - ]); + python3 + python2 # device/generic/goldfish/tools/mk_combined_img.py still needs py2 :( + ]) + (mkIf (config.androidVersion <= 9) [ + # stuff that was in the earlier buildenv. Not entirely sure everything here is necessary + (androidPkgs.sdk ( + p: with p; [ + cmdline-tools-latest + platform-tools + ] + )) + openssl.dev + bison + curl + flex + gcc + gitRepo + gnupg + gperf + imagemagick + libxml2 + lzip + lzop + perl + python2 + schedtool + util-linux + which + ]) + ]); } diff --git a/modules/etc.nix b/modules/etc.nix index 36b404e6..4246661e 100644 --- a/modules/etc.nix +++ b/modules/etc.nix @@ -1,84 +1,127 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkOption mkOptionDefault mkDefault mkMerge mkEnableOption types; + inherit (lib) + mkIf + mkOption + mkOptionDefault + mkDefault + mkMerge + mkEnableOption + types + ; - androidmk = pkgs.writeText "Android.mk" ('' - LOCAL_PATH := $(call my-dir) + androidmk = pkgs.writeText "Android.mk" ( + '' + LOCAL_PATH := $(call my-dir) - '' + (lib.concatMapStringsSep "\n" (f: '' - include $(CLEAR_VARS) + '' + + (lib.concatMapStringsSep "\n" (f: '' + include $(CLEAR_VARS) - LOCAL_MODULE := ${f.moduleName} - LOCAL_MODULE_TAGS := optional - LOCAL_MODULE_CLASS := ETC - LOCAL_MODULE_PATH := $(TARGET_OUT${lib.optionalString (f.partition == "product") "_PRODUCT"})/etc/${dirOf f.target} - LOCAL_MODULE_STEM := ${baseNameOf f.target} - LOCAL_SRC_FILES := ${f.moduleName} + LOCAL_MODULE := ${f.moduleName} + LOCAL_MODULE_TAGS := optional + LOCAL_MODULE_CLASS := ETC + LOCAL_MODULE_PATH := $(TARGET_OUT${ + lib.optionalString (f.partition == "product") "_PRODUCT" + })/etc/${dirOf f.target} + LOCAL_MODULE_STEM := ${baseNameOf f.target} + LOCAL_SRC_FILES := ${f.moduleName} - include $(BUILD_PREBUILT) - '') (lib.attrValues config.etc))); + include $(BUILD_PREBUILT) + '') (lib.attrValues config.etc)) + ); in { options = { etc = mkOption { - default = {}; + default = { }; description = "Set of files to be included under `/etc`"; - type = let - _config = config; - in types.attrsOf (types.submodule ({ name, config, ... }: { - # robotnix etc.* options correspond to the etc.* options from NixOS - options = { - target = mkOption { - type = types.str; - description = "Name of symlink (relative to `/etc`). Defaults to the attribute name."; - }; + type = + let + _config = config; + in + types.attrsOf ( + types.submodule ( + { name, config, ... }: + { + # robotnix etc.* options correspond to the etc.* options from NixOS + options = { + target = mkOption { + type = types.str; + description = "Name of symlink (relative to `/etc`). Defaults to the attribute name."; + }; - text = mkOption { - default = null; - type = types.nullOr types.str; - description = "Text of the file"; - }; + text = mkOption { + default = null; + type = types.nullOr types.str; + description = "Text of the file"; + }; - source = mkOption { - type = types.path; - description = "Path of the source file"; - }; + source = mkOption { + type = types.path; + description = "Path of the source file"; + }; - moduleName = mkOption { - type = types.str; - internal = true; - }; + moduleName = mkOption { + type = types.str; + internal = true; + }; - partition = mkOption { - type = types.enum [ "vendor" "system" "product" ]; - description = "Partition on which to place this etc file"; - }; - }; + partition = mkOption { + type = types.enum [ + "vendor" + "system" + "product" + ]; + description = "Partition on which to place this etc file"; + }; + }; - config = { - target = mkDefault name; - source = mkIf (config.text != null) ( - let name' = "etc-" + baseNameOf name; - in mkDefault (pkgs.writeText name' config.text)); - moduleName = mkDefault (lib.replaceStrings [ "/" ] [ "_" ] name); - partition = mkDefault (if (_config.androidVersion >= 10) then "product" else "system"); - }; - })); + config = { + target = mkDefault name; + source = mkIf (config.text != null) ( + let + name' = "etc-" + baseNameOf name; + in + mkDefault (pkgs.writeText name' config.text) + ); + moduleName = mkDefault (lib.replaceStrings [ "/" ] [ "_" ] name); + partition = mkDefault (if (_config.androidVersion >= 10) then "product" else "system"); + }; + } + ) + ); }; }; config = { - source.dirs."robotnix/etcfiles".src = (pkgs.runCommand "robotnix-etcfiles" {} ('' - mkdir -p $out - cp ${androidmk} $out/Android.mk - '' + (lib.concatMapStringsSep "\n" (f: "cp ${f.source} $out/${f.moduleName}") (lib.attrValues config.etc)))); + source.dirs."robotnix/etcfiles".src = ( + pkgs.runCommand "robotnix-etcfiles" { } ( + '' + mkdir -p $out + cp ${androidmk} $out/Android.mk + '' + + (lib.concatMapStringsSep "\n" (f: "cp ${f.source} $out/${f.moduleName}") ( + lib.attrValues config.etc + )) + ) + ); - system.additionalProductPackages = map (f: f.moduleName) (lib.filter (f: f.partition == "system") (lib.attrValues config.etc)); - product.additionalProductPackages = map (f: f.moduleName) (lib.filter (f: f.partition == "product") (lib.attrValues config.etc)); + system.additionalProductPackages = map (f: f.moduleName) ( + lib.filter (f: f.partition == "system") (lib.attrValues config.etc) + ); + product.additionalProductPackages = map (f: f.moduleName) ( + lib.filter (f: f.partition == "product") (lib.attrValues config.etc) + ); }; } diff --git a/modules/fakeuser/default.nix b/modules/fakeuser/default.nix index 990a04be..3503f1e3 100644 --- a/modules/fakeuser/default.nix +++ b/modules/fakeuser/default.nix @@ -1,11 +1,18 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ stdenv, meson, ninja }: +{ + stdenv, + meson, + ninja, +}: stdenv.mkDerivation { name = "fakeuser"; src = ./.; - nativeBuildInputs = [ meson ninja ]; + nativeBuildInputs = [ + meson + ninja + ]; } diff --git a/modules/framework.nix b/modules/framework.nix index 869fabc5..1fac4bb8 100644 --- a/modules/framework.nix +++ b/modules/framework.nix @@ -1,74 +1,106 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: # TODO: Unify with "etc" and/or "apps.prebuilt" options let inherit (lib) mkOption mkDefault types; - androidmk = pkgs.writeText "Android.mk" ('' - LOCAL_PATH := $(call my-dir) + androidmk = pkgs.writeText "Android.mk" ( + '' + LOCAL_PATH := $(call my-dir) - '' + (lib.concatMapStringsSep "\n" (f: '' - include $(CLEAR_VARS) + '' + + (lib.concatMapStringsSep "\n" (f: '' + include $(CLEAR_VARS) - LOCAL_MODULE := ${f.moduleName} - LOCAL_MODULE_TAGS := optional - LOCAL_MODULE_PATH := $(TARGET_OUT${lib.optionalString (f.partition == "product") "_PRODUCT"})/framework/${dirOf f.target} - LOCAL_MODULE_CLASS := JAVA_LIBRARIES - LOCAL_SRC_FILES := ${f.moduleName} + LOCAL_MODULE := ${f.moduleName} + LOCAL_MODULE_TAGS := optional + LOCAL_MODULE_PATH := $(TARGET_OUT${ + lib.optionalString (f.partition == "product") "_PRODUCT" + })/framework/${dirOf f.target} + LOCAL_MODULE_CLASS := JAVA_LIBRARIES + LOCAL_SRC_FILES := ${f.moduleName} - include $(BUILD_PREBUILT) - '') (lib.attrValues config.framework))); + include $(BUILD_PREBUILT) + '') (lib.attrValues config.framework)) + ); in { options = { framework = mkOption { - default = {}; + default = { }; internal = true; # TODO: Expose to user after cleaning up - type = let - _config = config; - in types.attrsOf (types.submodule ({ name, config, ... }: { - options = { - target = mkOption { - type = types.str; - internal = true; - }; + type = + let + _config = config; + in + types.attrsOf ( + types.submodule ( + { name, config, ... }: + { + options = { + target = mkOption { + type = types.str; + internal = true; + }; - source = mkOption { - type = types.path; - internal = true; - }; + source = mkOption { + type = types.path; + internal = true; + }; - moduleName = mkOption { - type = types.str; - internal = true; - }; + moduleName = mkOption { + type = types.str; + internal = true; + }; - partition = mkOption { - type = types.enum [ "vendor" "system" "product" ]; - internal = true; - }; - }; + partition = mkOption { + type = types.enum [ + "vendor" + "system" + "product" + ]; + internal = true; + }; + }; - config = { - target = mkDefault name; - moduleName = mkDefault (lib.replaceStrings [ "/" ] [ "_" ] name); - partition = mkDefault (if (_config.androidVersion >= 10) then "product" else "system"); - }; - })); + config = { + target = mkDefault name; + moduleName = mkDefault (lib.replaceStrings [ "/" ] [ "_" ] name); + partition = mkDefault (if (_config.androidVersion >= 10) then "product" else "system"); + }; + } + ) + ); }; }; config = { - source.dirs."robotnix/framework".src = (pkgs.runCommand "robotnix-framework" {} ('' - mkdir -p $out - cp ${androidmk} $out/Android.mk - '' + (lib.concatMapStringsSep "\n" (f: "cp ${f.source} $out/${f.moduleName}") (lib.attrValues config.framework)))); + source.dirs."robotnix/framework".src = ( + pkgs.runCommand "robotnix-framework" { } ( + '' + mkdir -p $out + cp ${androidmk} $out/Android.mk + '' + + (lib.concatMapStringsSep "\n" (f: "cp ${f.source} $out/${f.moduleName}") ( + lib.attrValues config.framework + )) + ) + ); - system.additionalProductPackages = map (f: f.moduleName) (lib.filter (f: f.partition == "system") (lib.attrValues config.framework)); - product.additionalProductPackages = map (f: f.moduleName) (lib.filter (f: f.partition == "product") (lib.attrValues config.framework)); + system.additionalProductPackages = map (f: f.moduleName) ( + lib.filter (f: f.partition == "system") (lib.attrValues config.framework) + ); + product.additionalProductPackages = map (f: f.moduleName) ( + lib.filter (f: f.partition == "product") (lib.attrValues config.framework) + ); }; } diff --git a/modules/hosts.nix b/modules/hosts.nix index 0ab7a942..96f08ea5 100644 --- a/modules/hosts.nix +++ b/modules/hosts.nix @@ -1,7 +1,12 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkIf mkOption types; diff --git a/modules/kernel.nix b/modules/kernel.nix index 37ecf9c7..f83d9920 100644 --- a/modules/kernel.nix +++ b/modules/kernel.nix @@ -3,10 +3,22 @@ # TODO: remove all the redfin exceptions -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkOption mkOptionDefault mkMerge mkEnableOption types; + inherit (lib) + mkIf + mkOption + mkOptionDefault + mkMerge + mkEnableOption + types + ; cfg = config.kernel; in @@ -33,7 +45,7 @@ in }; patches = mkOption { - default = []; + default = [ ]; type = types.listOf types.path; description = "List of patches to apply to kernel source"; }; @@ -60,10 +72,12 @@ in }; config = { - kernel.postPatch = lib.optionalString (config.signing.enable && (config.signing.avb.mode == "verity_only")) '' - rm -f verity_*.x509 - openssl x509 -outform der -in ${config.signing.avb.verityCert} -out verity_user.der.x509 - ''; + kernel.postPatch = + lib.optionalString (config.signing.enable && (config.signing.avb.mode == "verity_only")) + '' + rm -f verity_*.x509 + openssl x509 -outform der -in ${config.signing.avb.verityCert} -out verity_user.der.x509 + ''; # We have to replace files here, instead of just using the # config.build.kernel drv output in place of source.dirs.${cfg.relpath}. diff --git a/modules/microg.nix b/modules/microg.nix index 499faacc..4a23c978 100644 --- a/modules/microg.nix +++ b/modules/microg.nix @@ -1,20 +1,32 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkDefault mkEnableOption mkMerge; + inherit (lib) + mkIf + mkDefault + mkEnableOption + mkMerge + ; version = { part1 = "0.2.29"; part2 = "233013"; part3 = "058"; }; - verifyApk = apk: pkgs.robotnix.verifyApk { - inherit apk; - sha256 = "9bd06727e62796c0130eb6dab39b73157451582cbd138e86c468acc395d14165"; # O=NOGAPPS Project, C=DE - }; + verifyApk = + apk: + pkgs.robotnix.verifyApk { + inherit apk; + sha256 = "9bd06727e62796c0130eb6dab39b73157451582cbd138e86c468acc395d14165"; # O=NOGAPPS Project, C=DE + }; in { options = { @@ -27,25 +39,29 @@ in source.dirs = mkMerge [ (mkIf (config.androidVersion >= 12) { # From: https://github.com/microg/GmsCore/pull/1586 - "frameworks/base".patches = lib.optionals (config.androidVersion == 12) [ - (pkgs.fetchpatch { - name = "microg-12.patch"; - url = "https://github.com/ProtonAOSP/android_frameworks_base/commit/0deff13d05e451fbe3803f66be73853237c6729c.patch"; - sha256 = "0gcwb5811wv5fz4vjavljcbw9m5rplrd3fc7d51w3r4w4vv0yl4c"; - }) - ] ++ lib.optionals (config.androidVersion >= 13) [ - (pkgs.fetchpatch { - name = "microg-12.patch"; - url = "https://github.com/AOSP-XIII/frameworks_base/commit/fdc0204576d61b5a90838ae5b407535e5db125e6.patch"; - sha256 = "09xsw4dizjxjr8siaaw6lw6zwbcjrvxz574hz6251p4j7v4y2ddr"; - }) - ]; + "frameworks/base".patches = + lib.optionals (config.androidVersion == 12) [ + (pkgs.fetchpatch { + name = "microg-12.patch"; + url = "https://github.com/ProtonAOSP/android_frameworks_base/commit/0deff13d05e451fbe3803f66be73853237c6729c.patch"; + sha256 = "0gcwb5811wv5fz4vjavljcbw9m5rplrd3fc7d51w3r4w4vv0yl4c"; + }) + ] + ++ lib.optionals (config.androidVersion >= 13) [ + (pkgs.fetchpatch { + name = "microg-12.patch"; + url = "https://github.com/AOSP-XIII/frameworks_base/commit/fdc0204576d61b5a90838ae5b407535e5db125e6.patch"; + sha256 = "09xsw4dizjxjr8siaaw6lw6zwbcjrvxz574hz6251p4j7v4y2ddr"; + }) + ]; "packages/modules/Permission".patches = - lib.optional (config.flavor == "grapheneos") (pkgs.fetchpatch { - name = "fake-package-signature.patch"; - url = "https://github.com/ProtonAOSP/android_packages_modules_Permission/commit/de7846184379955956021b6e7b1730b24c8f4802.patch"; - sha256 = "1644nh8fnf5nxawdfqixxsf786s1fhx6jp42awjiii98nkc8pg6d"; - }) + lib.optional (config.flavor == "grapheneos") ( + pkgs.fetchpatch { + name = "fake-package-signature.patch"; + url = "https://github.com/ProtonAOSP/android_packages_modules_Permission/commit/de7846184379955956021b6e7b1730b24c8f4802.patch"; + sha256 = "1644nh8fnf5nxawdfqixxsf786s1fhx6jp42awjiii98nkc8pg6d"; + } + ) ++ lib.optional (config.flavor != "grapheneos") ./microg-android12-permission.patch; }) (mkIf (config.androidVersion == 11) { @@ -63,7 +79,9 @@ in }) ]; - resources."frameworks/base/packages/SettingsProvider".def_location_providers_allowed = mkIf (config.androidVersion == 9) (mkDefault "gps,network"); + resources."frameworks/base/packages/SettingsProvider".def_location_providers_allowed = mkIf ( + config.androidVersion == 9 + ) (mkDefault "gps,network"); # Using cloud messaging, so enabling: https://source.android.com/devices/tech/power/platform_mgmt#integrate-doze resources."frameworks/base/core/res".config_enableAutoPowerModes = mkDefault true; @@ -72,10 +90,12 @@ in # Used https://github.com/lineageos4microg/android_prebuilts_prebuiltapks as source for Android.mk options apps.prebuilt = { GmsCore = { - apk = verifyApk (pkgs.fetchurl { - url = "https://github.com/microg/GmsCore/releases/download/v${version.part1}.${version.part2}/com.google.android.gms-${version.part2}${version.part3}.apk"; - sha256 = "sha256-92VGUL7z6t14qQO3XnErmOHMmdsi5ArC9IlGanlhxNA="; - }); + apk = verifyApk ( + pkgs.fetchurl { + url = "https://github.com/microg/GmsCore/releases/download/v${version.part1}.${version.part2}/com.google.android.gms-${version.part2}${version.part3}.apk"; + sha256 = "sha256-92VGUL7z6t14qQO3XnErmOHMmdsi5ArC9IlGanlhxNA="; + } + ); packageName = "com.google.android.gms"; privileged = true; privappPermissions = [ @@ -97,24 +117,32 @@ in ]; defaultPermissions = [ "FAKE_PACKAGE_SIGNATURE" ]; usesLibraries = [ "com.android.location.provider" ]; - usesOptionalLibraries = [ "org.apache.http.legacy" "androidx.window.extensions" "androidx.window.sidecar" ]; + usesOptionalLibraries = [ + "org.apache.http.legacy" + "androidx.window.extensions" + "androidx.window.sidecar" + ]; allowInPowerSave = true; certificate = "microg"; }; GsfProxy = { - apk = verifyApk (pkgs.fetchurl { - url = "https://github.com/microg/android_packages_apps_GsfProxy/releases/download/v0.1.0/GsfProxy.apk"; - sha256 = "14ln6i1qg435x223x3vndd608mra19d58yqqhhf6mw018cbip2c6"; - }); + apk = verifyApk ( + pkgs.fetchurl { + url = "https://github.com/microg/android_packages_apps_GsfProxy/releases/download/v0.1.0/GsfProxy.apk"; + sha256 = "14ln6i1qg435x223x3vndd608mra19d58yqqhhf6mw018cbip2c6"; + } + ); certificate = "microg"; }; FakeStore = { - apk = verifyApk (pkgs.fetchurl { - url = "https://github.com/microg/FakeStore/releases/download/v0.2.1/com.android.vending-83700037.apk"; - sha256 = "sha256-qz5TlpVqgKGj68fBlT2gCNafaU8TO90MvJXg6OGezaA="; - }); + apk = verifyApk ( + pkgs.fetchurl { + url = "https://github.com/microg/FakeStore/releases/download/v0.2.1/com.android.vending-83700037.apk"; + sha256 = "sha256-qz5TlpVqgKGj68fBlT2gCNafaU8TO90MvJXg6OGezaA="; + } + ); packageName = "com.android.vending"; privileged = true; privappPermissions = [ diff --git a/modules/pixel/active-edge.nix b/modules/pixel/active-edge.nix index 5a247646..923986f0 100644 --- a/modules/pixel/active-edge.nix +++ b/modules/pixel/active-edge.nix @@ -1,10 +1,22 @@ -{ config, lib, pkgs, ... }: +{ + config, + lib, + pkgs, + ... +}: let - inherit (lib) assertMsg mkIf mkEnableOption mkMerge mkOption types; + inherit (lib) + assertMsg + mkIf + mkEnableOption + mkMerge + mkOption + types + ; cfg = config.pixel.activeEdge; -in +in { options = { @@ -19,61 +31,70 @@ in }; }; - config = let - deviceSupported = builtins.elem config.device [ - "taimen" "walleye" - "crosshatch" "blueline" - "bonito" "sargo" - "coral" "flame" - ]; - in mkIf (cfg.enable && !cfg.includedInFlavor) (mkMerge [ - { - assertions = [ - { - assertion = deviceSupported; - message = "${config.deviceDisplayName} does not include Active Edge functionality"; - } - { - assertion = builtins.elem config.androidVersion [ 11 12 ]; - message = "Active Edge support is only implemented on Android 11 and 12 in Robotnix"; - } + config = + let + deviceSupported = builtins.elem config.device [ + "taimen" + "walleye" + "crosshatch" + "blueline" + "bonito" + "sargo" + "coral" + "flame" ]; + in + mkIf (cfg.enable && !cfg.includedInFlavor) (mkMerge [ + { + assertions = [ + { + assertion = deviceSupported; + message = "${config.deviceDisplayName} does not include Active Edge functionality"; + } + { + assertion = builtins.elem config.androidVersion [ + 11 + 12 + ]; + message = "Active Edge support is only implemented on Android 11 and 12 in Robotnix"; + } + ]; - product.additionalProductPackages = [ "ElmyraService" ]; + product.additionalProductPackages = [ "ElmyraService" ]; - source.dirs."frameworks/base".patches = [ - # SystemUI: Allow privileged system apps to access screenshot service - (pkgs.fetchpatch { - name = "SystemUI-Allow-privileged-system-apps-to-access-screenshot-service.patch"; - url = "https://github.com/LineageOS/android_frameworks_base/commit/c927518f8274be804597af538f3d0e7c4da9c39a.patch"; - sha256 = "sha256-6SvTDtMemk8oN1xXc6TNIOgkXp66Ak9yfANMNX8nwuE="; - }) + source.dirs."frameworks/base".patches = [ + # SystemUI: Allow privileged system apps to access screenshot service + (pkgs.fetchpatch { + name = "SystemUI-Allow-privileged-system-apps-to-access-screenshot-service.patch"; + url = "https://github.com/LineageOS/android_frameworks_base/commit/c927518f8274be804597af538f3d0e7c4da9c39a.patch"; + sha256 = "sha256-6SvTDtMemk8oN1xXc6TNIOgkXp66Ak9yfANMNX8nwuE="; + }) - # core: Expose method to start assistant through Binder - (pkgs.fetchpatch { - name = "core-Expose-method-to-start-assistant-through-Binder.patch"; - url = "https://github.com/ProtonAOSP/android_frameworks_base/commit/2b950e103e865aa6a1fe8a917964e0069d4c4037.patch"; - sha256 = "sha256-hj2F9W6njqGs9SccPEfbnMak/FLqNTQpgkVJQE+l2V0="; - }) - ]; - } + # core: Expose method to start assistant through Binder + (pkgs.fetchpatch { + name = "core-Expose-method-to-start-assistant-through-Binder.patch"; + url = "https://github.com/ProtonAOSP/android_frameworks_base/commit/2b950e103e865aa6a1fe8a917964e0069d4c4037.patch"; + sha256 = "sha256-hj2F9W6njqGs9SccPEfbnMak/FLqNTQpgkVJQE+l2V0="; + }) + ]; + } - (mkIf (config.androidVersion == 11) { - source.dirs."packages/apps/ElmyraService".src = pkgs.fetchFromGitHub { - owner = "LineageOS"; - repo = "android_packages_apps_ElmyraService"; - rev = "4b6befa8559d63643d3218c244b7f6287197aca2"; - sha256 = "sha256-CmEmdt5rhc+cGqCJY/REPl4eAwGjS7Z8i7NkynNjGl4="; - }; - }) + (mkIf (config.androidVersion == 11) { + source.dirs."packages/apps/ElmyraService".src = pkgs.fetchFromGitHub { + owner = "LineageOS"; + repo = "android_packages_apps_ElmyraService"; + rev = "4b6befa8559d63643d3218c244b7f6287197aca2"; + sha256 = "sha256-CmEmdt5rhc+cGqCJY/REPl4eAwGjS7Z8i7NkynNjGl4="; + }; + }) - (mkIf (config.androidVersion == 12) { - source.dirs."packages/apps/ElmyraService".src = pkgs.fetchFromGitHub { - owner = "LineageOS"; - repo = "android_packages_apps_ElmyraService"; - rev = "94823b39e30bd68e30f74ef518dff8ac56d70537"; - sha256 = "sha256-MwNDLbwicDasJSxJVfzoMcVYpWn7tSd7zBKQaRSvmvw="; - }; - }) - ]); + (mkIf (config.androidVersion == 12) { + source.dirs."packages/apps/ElmyraService".src = pkgs.fetchFromGitHub { + owner = "LineageOS"; + repo = "android_packages_apps_ElmyraService"; + rev = "94823b39e30bd68e30f74ef518dff8ac56d70537"; + sha256 = "sha256-MwNDLbwicDasJSxJVfzoMcVYpWn7tSd7zBKQaRSvmvw="; + }; + }) + ]); } diff --git a/modules/pixel/default.nix b/modules/pixel/default.nix index f192383b..b88e67a8 100644 --- a/modules/pixel/default.nix +++ b/modules/pixel/default.nix @@ -1,76 +1,155 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkMerge mkDefault mkOptionDefault; + inherit (lib) + mkIf + mkMerge + mkDefault + mkOptionDefault + ; imgList = lib.importJSON ./pixel-imgs.json; otaList = lib.importJSON ./pixel-otas.json; - fetchItem = json: let - matchingItem = lib.findSingle - (v: (v.device == config.device) && (lib.hasInfix "(${config.apv.buildID}," v.version)) # Look for left paren + upstream buildNumber + "," - (throw "no items found for vendor img/ota") - (throw "multiple items found for vendor img/ota") - json; - in + fetchItem = + json: + let + matchingItem = + lib.findSingle + (v: (v.device == config.device) && (lib.hasInfix "(${config.apv.buildID}," v.version)) # Look for left paren + upstream buildNumber + "," + (throw "no items found for vendor img/ota") + (throw "multiple items found for vendor img/ota") + json; + in pkgs.fetchurl (lib.filterAttrs (n: v: (n == "url" || n == "sha256")) matchingItem); deviceMap = { - marlin = { family = "marlin"; name = "Pixel XL"; }; - sailfish = { family = "marlin"; name = "Pixel"; }; - taimen = { family = "taimen"; name = "Pixel 2 XL"; }; - walleye = { family = "muskie"; name = "Pixel 2"; }; - crosshatch = { family = "crosshatch"; name = "Pixel 3 XL"; }; - blueline = { family = "crosshatch"; name = "Pixel 3"; }; - bonito = { family = "bonito"; name = "Pixel 3a XL"; }; - sargo = { family = "bonito"; name = "Pixel 3a"; }; - coral = { family = "coral"; name = "Pixel 4 XL"; }; - flame = { family = "coral"; name = "Pixel 4"; }; - sunfish = { family = "sunfish"; name = "Pixel 4a"; }; - bramble = { family = "redfin"; name = "Pixel 4a (5G)"; }; - redfin = { family = "redfin"; name = "Pixel 5"; }; - barbet = { family = "barbet"; name = "Pixel 5a (5G)"; }; - raven = { family = "raviole"; name = "Pixel 6 Pro"; }; - oriole = { family = "raviole"; name = "Pixel 6"; }; + marlin = { + family = "marlin"; + name = "Pixel XL"; + }; + sailfish = { + family = "marlin"; + name = "Pixel"; + }; + taimen = { + family = "taimen"; + name = "Pixel 2 XL"; + }; + walleye = { + family = "muskie"; + name = "Pixel 2"; + }; + crosshatch = { + family = "crosshatch"; + name = "Pixel 3 XL"; + }; + blueline = { + family = "crosshatch"; + name = "Pixel 3"; + }; + bonito = { + family = "bonito"; + name = "Pixel 3a XL"; + }; + sargo = { + family = "bonito"; + name = "Pixel 3a"; + }; + coral = { + family = "coral"; + name = "Pixel 4 XL"; + }; + flame = { + family = "coral"; + name = "Pixel 4"; + }; + sunfish = { + family = "sunfish"; + name = "Pixel 4a"; + }; + bramble = { + family = "redfin"; + name = "Pixel 4a (5G)"; + }; + redfin = { + family = "redfin"; + name = "Pixel 5"; + }; + barbet = { + family = "barbet"; + name = "Pixel 5a (5G)"; + }; + raven = { + family = "raviole"; + name = "Pixel 6 Pro"; + }; + oriole = { + family = "raviole"; + name = "Pixel 6"; + }; }; # Make a uuid based on some string data - uuidgen = str: let - hash = builtins.hashString "sha256" str; - s = i: len: lib.substring i len hash; - in lib.toLower "${s 0 8}-${s 8 4}-${s 12 4}-${s 16 4}-${s 20 12}"; + uuidgen = + str: + let + hash = builtins.hashString "sha256" str; + s = i: len: lib.substring i len hash; + in + lib.toLower "${s 0 8}-${s 8 4}-${s 12 4}-${s 16 4}-${s 20 12}"; # UUID for persist.img uuid = uuidgen "persist-${config.buildNumber}-${builtins.toString config.buildDateTime}"; hashSeed = uuidgen "persist-hash-${config.buildNumber}-${builtins.toString config.buildDateTime}"; in mkMerge [ - (mkIf ((lib.elem config.flavor [ "vanilla" "grapheneos" ]) && (config.device != null) && (lib.hasAttr config.device deviceMap)) { # Default settings that apply to all devices unless overridden. TODO: Make conditional - deviceFamily = mkDefault (deviceMap.${config.device}.family or config.device); - deviceDisplayName = mkDefault (deviceMap.${config.device}.name or config.device); - arch = mkDefault "arm64"; + (mkIf + ( + (lib.elem config.flavor [ + "vanilla" + "grapheneos" + ]) + && (config.device != null) + && (lib.hasAttr config.device deviceMap) + ) + { + # Default settings that apply to all devices unless overridden. TODO: Make conditional + deviceFamily = mkDefault (deviceMap.${config.device}.family or config.device); + deviceDisplayName = mkDefault (deviceMap.${config.device}.name or config.device); + arch = mkDefault "arm64"; - apv.img = mkDefault (fetchItem imgList); - apv.ota = mkDefault (fetchItem otaList); + apv.img = mkDefault (fetchItem imgList); + apv.ota = mkDefault (fetchItem otaList); - # Exclude all devices by default - source.excludeGroups = mkDefault (lib.attrNames deviceMap); - # But include names related to our device - source.includeGroups = mkDefault [ config.device config.deviceFamily ]; + # Exclude all devices by default + source.excludeGroups = mkDefault (lib.attrNames deviceMap); + # But include names related to our device + source.includeGroups = mkDefault [ + config.device + config.deviceFamily + ]; - signing.avb.enable = mkDefault true; - }) + signing.avb.enable = mkDefault true; + } + ) # Device-specific overrides (mkIf (config.deviceFamily == "marlin") { signing.avb.mode = "verity_only"; signing.apex.enable = false; # Upstream forces "TARGET_FLATTEN_APEX := false" anyway }) - (mkIf (lib.elem config.deviceFamily [ "taimen" "muskie" ]) { - signing.avb.mode = "vbmeta_simple"; - }) + (mkIf (lib.elem config.deviceFamily [ + "taimen" + "muskie" + ]) { signing.avb.mode = "vbmeta_simple"; }) (mkIf (config.deviceFamily == "crosshatch") { signing.avb.mode = "vbmeta_chained"; retrofit = mkIf (config.androidVersion >= 10) (mkDefault true); @@ -99,13 +178,22 @@ mkMerge [ }) ]; }) - (mkIf (lib.elem config.deviceFamily [ "coral" "sunfish" "redfin" "barbet" ]) { - signing.avb.mode = "vbmeta_chained_v2"; - }) + (mkIf (lib.elem config.deviceFamily [ + "coral" + "sunfish" + "redfin" + "barbet" + ]) { signing.avb.mode = "vbmeta_chained_v2"; }) (mkIf (config.deviceFamily == "sunfish" && config.androidVersion >= 12) { signing.apex.packageNames = [ "com.android.vibrator.sunfish" ]; }) - (mkIf (lib.elem config.deviceFamily [ "bonito" "sunfish" "redfin" "barbet" ] && config.androidVersion >= 12) { - signing.apex.packageNames = [ "com.android.vibrator.drv2624" ]; - }) + (mkIf ( + lib.elem config.deviceFamily [ + "bonito" + "sunfish" + "redfin" + "barbet" + ] + && config.androidVersion >= 12 + ) { signing.apex.packageNames = [ "com.android.vibrator.drv2624" ]; }) ] diff --git a/modules/pixel/driver-binaries.nix b/modules/pixel/driver-binaries.nix index 734dec2a..f43c28b3 100644 --- a/modules/pixel/driver-binaries.nix +++ b/modules/pixel/driver-binaries.nix @@ -1,25 +1,40 @@ -{ config, lib, pkgs, ... }: +{ + config, + lib, + pkgs, + ... +}: let inherit (lib) - mkIf mkOption mkMerge types optionalAttrs optionalString; + mkIf + mkOption + mkMerge + types + optionalAttrs + optionalString + ; driversList = lib.importJSON ./pixel-drivers.json; - fetchItem = type: device: buildID: let - matchingItem = lib.findSingle - (v: lib.hasInfix "/${type}-${device}-${lib.toLower buildID}-" v.url) - (throw "no items found for ${type} ${device} drivers") - (throw "multiple items found for ${type} ${device} drivers") - driversList; - in + fetchItem = + type: device: buildID: + let + matchingItem = + lib.findSingle (v: lib.hasInfix "/${type}-${device}-${lib.toLower buildID}-" v.url) + (throw "no items found for ${type} ${device} drivers") + (throw "multiple items found for ${type} ${device} drivers") + driversList; + in pkgs.fetchurl matchingItem; - unpackDrivers = tarball: pkgs.runCommand "unpacked-${lib.strings.sanitizeDerivationName tarball.name}" {} '' - tar xvf ${tarball} + unpackDrivers = + tarball: + pkgs.runCommand "unpacked-${lib.strings.sanitizeDerivationName tarball.name}" { } '' + tar xvf ${tarball} - mkdir -p $out - tail -n +315 ./extract-*.sh | tar zxv -C $out - ''; + mkdir -p $out + tail -n +315 ./extract-*.sh | tar zxv -C $out + ''; usesQcomDrivers = config.deviceFamily != "raviole"; in @@ -35,39 +50,53 @@ in config = mkMerge [ (mkIf config.pixel.useUpstreamDriverBinaries { assertions = [ - { assertion = !config.apv.enable; + { + assertion = !config.apv.enable; message = "pixel.useUpstreamDriverBinaries and apv.enable must not both be set to true"; } ]; # Merge qcom and google drivers - source.dirs = { - "build/make".patches = mkIf (config.androidVersion >= 12) [ ../12/build_make/0003-Add-option-to-include-prebuilt-images-when-signing-t.patch ]; + source.dirs = + { + "build/make".patches = mkIf (config.androidVersion >= 12) [ + ../12/build_make/0003-Add-option-to-include-prebuilt-images-when-signing-t.patch + ]; - "vendor/google_devices/${config.device}".src = pkgs.runCommand "${config.device}-vendor" {} ('' - mkdir extracted + "vendor/google_devices/${config.device}".src = pkgs.runCommand "${config.device}-vendor" { } ( + '' + mkdir extracted - cp -r ${config.build.driversGoogle}/vendor/google_devices/${config.device}/. extracted - chmod +w -R extracted - '' + optionalString usesQcomDrivers '' - cp -r ${config.build.driversQcom}/vendor/google_devices/${config.device}/. extracted - '' + optionalString (config.deviceFamily == "raviole") '' - patch extracted/proprietary/Android.mk ${./raviole-ims-presigned.patch} - '' + '' + cp -r ${config.build.driversGoogle}/vendor/google_devices/${config.device}/. extracted + chmod +w -R extracted + '' + + optionalString usesQcomDrivers '' + cp -r ${config.build.driversQcom}/vendor/google_devices/${config.device}/. extracted + '' + + optionalString (config.deviceFamily == "raviole") '' + patch extracted/proprietary/Android.mk ${./raviole-ims-presigned.patch} + '' + + '' - mv extracted $out - ''); - } // optionalAttrs usesQcomDrivers { - "vendor/qcom/${config.device}".src = "${config.build.driversQcom}/vendor/qcom/${config.device}"; - }; + mv extracted $out + '' + ); + } + // optionalAttrs usesQcomDrivers { + "vendor/qcom/${config.device}".src = "${config.build.driversQcom}/vendor/qcom/${config.device}"; + }; }) (mkIf (config.pixel.useUpstreamDriverBinaries && config.deviceFamily == "raviole") { - signing.prebuiltImages = let - prebuilt = partition: "${config.source.dirs."vendor/google_devices/${config.device}".src}/proprietary/${partition}.img"; - in [ - (prebuilt "vendor") - (prebuilt "vendor_dlkm") - ]; + signing.prebuiltImages = + let + prebuilt = + partition: + "${config.source.dirs."vendor/google_devices/${config.device}".src}/proprietary/${partition}.img"; + in + [ + (prebuilt "vendor") + (prebuilt "vendor_dlkm") + ]; }) ({ diff --git a/modules/pixel/update.sh b/modules/pixel/update.sh index 392a32e8..35559b88 100755 --- a/modules/pixel/update.sh +++ b/modules/pixel/update.sh @@ -6,9 +6,9 @@ set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")" -curl --fail -s --cookie "devsite_wall_acks=nexus-image-tos" https://developers.google.com/android/images \ - | pup "div table tbody tr json{}" \ - | jq '.[].children +curl --fail -s --cookie "devsite_wall_acks=nexus-image-tos" https://developers.google.com/android/images | + pup "div table tbody tr json{}" | + jq '.[].children | if (length>3) then { device: (.[2].children|.[0].href|capture("https://dl.google.com/dl/android/aosp/(?[a-z]*)-.*\\.zip")|.device), @@ -21,32 +21,32 @@ curl --fail -s --cookie "devsite_wall_acks=nexus-image-tos" https://developers.g url: (.[1].children|.[0].href), sha256: .[2].text, } - end' | jq -s > pixel-imgs.json + end' | jq -s >pixel-imgs.json -curl --fail -s --cookie "devsite_wall_acks=nexus-ota-tos" https://developers.google.com/android/ota \ - | pup "div table tbody tr json{}" \ - | jq '.[].children +curl --fail -s --cookie "devsite_wall_acks=nexus-ota-tos" https://developers.google.com/android/ota | + pup "div table tbody tr json{}" | + jq '.[].children | { device: (.[1].children|.[0].href|capture("https://dl.google.com/dl/android/aosp/(?[a-z]*)-ota-.*\\.zip")|.device), version: .[0].text, url: (.[1].children|.[0].href), sha256: .[2].text, - }' | jq -s > pixel-otas.json + }' | jq -s >pixel-otas.json -curl --fail -s --cookie "devsite_wall_acks=nexus-ota-tos" https://developers.google.com/android/drivers \ - | pup "div table tbody tr json{}" \ - | jq '.[].children +curl --fail -s --cookie "devsite_wall_acks=nexus-ota-tos" https://developers.google.com/android/drivers | + pup "div table tbody tr json{}" | + jq '.[].children | { url: (.[2].children|.[0].href), sha256: .[3].text, } - | select(.url != null)' | jq -s > pixel-drivers.json + | select(.url != null)' | jq -s >pixel-drivers.json -curl --fail -s --cookie "devsite_wall_acks=nexus-ota-tos" https://developer.android.com/about/versions/12/download \ - | pup "div table tbody tr json{}" \ - | jq '.[].children +curl --fail -s --cookie "devsite_wall_acks=nexus-ota-tos" https://developer.android.com/about/versions/12/download | + pup "div table tbody tr json{}" | + jq '.[].children | { url: ("https://dl.google.com/developers/android/sc/images/factory/" + (.[1].children|.[0].text)), sha256: .[2].children|.[0].text, } - | select(.sha256 != null)' | jq -s > pixel-beta-imgs.json + | select(.sha256 != null)' | jq -s >pixel-beta-imgs.json diff --git a/modules/release.nix b/modules/release.nix index 782677cb..70b8012a 100644 --- a/modules/release.nix +++ b/modules/release.nix @@ -1,67 +1,107 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkDefault mkOption types optional optionalString; + inherit (lib) + mkIf + mkDefault + mkOption + types + optional + optionalString + ; otaTools = config.build.otaTools; - wrapScript = { commands, keysDir }: let - jre = if (config.androidVersion >= 11) then pkgs.jdk11_headless else pkgs.jre8_headless; - deps = with pkgs; - [ otaTools openssl jre zip unzip pkgs.getopt which toybox vboot_reference util-linux + wrapScript = + { commands, keysDir }: + let + jre = if (config.androidVersion >= 11) then pkgs.jdk11_headless else pkgs.jre8_headless; + deps = with pkgs; [ + otaTools + openssl + jre + zip + unzip + pkgs.getopt + which + toybox + vboot_reference + util-linux # ota_from_target_files invokes, brillo_update_payload which has "truncate_file" which invokes python # c.f. https://android.googlesource.com/platform/system/update_engine/+/refs/heads/main/scripts/brillo_update_payload#338 python3 ]; - in '' - export PATH=${lib.makeBinPath deps}:$PATH - export EXT2FS_NO_MTAB_OK=yes - - # build-tools releasetools/common.py hilariously tries to modify the - # permissions of the source file in ZipWrite. Since signing uses this - # function with a key, we need to make a temporary copy of our keys so the - # sandbox doesn't complain if it doesn't have permissions to do so. - export KEYSDIR=${keysDir} - if [[ "$KEYSDIR" ]]; then - if [[ ! -d "$KEYSDIR" ]]; then - echo 'Missing KEYSDIR directory, did you use "--option extra-sandbox-paths /keys=..." ?' - exit 1 + in + '' + export PATH=${lib.makeBinPath deps}:$PATH + export EXT2FS_NO_MTAB_OK=yes + + # build-tools releasetools/common.py hilariously tries to modify the + # permissions of the source file in ZipWrite. Since signing uses this + # function with a key, we need to make a temporary copy of our keys so the + # sandbox doesn't complain if it doesn't have permissions to do so. + export KEYSDIR=${keysDir} + if [[ "$KEYSDIR" ]]; then + if [[ ! -d "$KEYSDIR" ]]; then + echo 'Missing KEYSDIR directory, did you use "--option extra-sandbox-paths /keys=..." ?' + exit 1 + fi + ${lib.optionalString config.signing.enable "${config.build.verifyKeysScript} \"$KEYSDIR\" || exit 1"} + NEW_KEYSDIR=$(mktemp -d /dev/shm/robotnix_keys.XXXXXXXXXX) + trap "rm -rf \"$NEW_KEYSDIR\"" EXIT + cp -r "$KEYSDIR"/* "$NEW_KEYSDIR" + chmod u+w -R "$NEW_KEYSDIR" + KEYSDIR=$NEW_KEYSDIR fi - ${lib.optionalString config.signing.enable "${config.build.verifyKeysScript} \"$KEYSDIR\" || exit 1"} - NEW_KEYSDIR=$(mktemp -d /dev/shm/robotnix_keys.XXXXXXXXXX) - trap "rm -rf \"$NEW_KEYSDIR\"" EXIT - cp -r "$KEYSDIR"/* "$NEW_KEYSDIR" - chmod u+w -R "$NEW_KEYSDIR" - KEYSDIR=$NEW_KEYSDIR - fi - - ${commands} - ''; - - runWrappedCommand = name: script: args: pkgs.runCommand "${config.device}-${name}-${config.buildNumber}.zip" {} (wrapScript { - commands = script (args // {out="$out";}); - keysDir = config.signing.buildTimeKeyStorePath; - }); - - signedTargetFilesScript = { targetFiles, out }: '' - ( OUT=$(realpath ${out}) - cd ${otaTools}; # Enter otaTools dir so relative paths are correct for finding original keys - sign_target_files_apks \ - -o ${toString config.signing.signTargetFilesArgs} \ - ${targetFiles} $OUT - ) - ''; - otaScript = { targetFiles, prevTargetFiles ? null, out }: '' - ota_from_target_files \ - ${toString config.otaArgs} \ - ${lib.optionalString (prevTargetFiles != null) "-i ${prevTargetFiles}"} \ - ${targetFiles} ${out} - ''; + + ${commands} + ''; + + runWrappedCommand = + name: script: args: + pkgs.runCommand "${config.device}-${name}-${config.buildNumber}.zip" { } (wrapScript { + commands = script (args // { out = "$out"; }); + keysDir = config.signing.buildTimeKeyStorePath; + }); + + signedTargetFilesScript = + { targetFiles, out }: + '' + ( OUT=$(realpath ${out}) + cd ${otaTools}; # Enter otaTools dir so relative paths are correct for finding original keys + sign_target_files_apks \ + -o ${toString config.signing.signTargetFilesArgs} \ + ${targetFiles} $OUT + ) + ''; + otaScript = + { + targetFiles, + prevTargetFiles ? null, + out, + }: + '' + ota_from_target_files \ + ${toString config.otaArgs} \ + ${lib.optionalString (prevTargetFiles != null) "-i ${prevTargetFiles}"} \ + ${targetFiles} ${out} + ''; imgScript = { targetFiles, out }: ''img_from_target_files ${targetFiles} ${out}''; - factoryImgScript = { targetFiles, img, out }: '' + factoryImgScript = + { + targetFiles, + img, + out, + }: + '' ln -s ${targetFiles} ${config.device}-target_files-${config.buildNumber}.zip || true ln -s ${img} ${config.device}-img-${config.buildNumber}.zip || true @@ -80,13 +120,16 @@ let export PATH=${lib.getBin pkgs.zip}/bin:${lib.getBin pkgs.unzip}/bin:$PATH ${pkgs.runtimeShell} ${config.source.dirs."device/common".src}/generate-factory-images-common.sh mv *-factory-*.zip ${out} - ''; + ''; in { options = { channel = mkOption { default = "stable"; - type = types.enum [ "stable" "beta" ]; + type = types.enum [ + "stable" + "beta" + ]; description = "Default channel to use for updates (can be modified in app)"; }; @@ -106,116 +149,177 @@ in }; otaArgs = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; internal = true; }; # Build products. Put here for convenience--but it's not a great interface - prevBuildDir = mkOption { type = types.str; internal = true; }; - prevBuildNumber = mkOption { type = types.str; internal = true; }; - prevTargetFiles = mkOption { type = types.path; internal = true; }; + prevBuildDir = mkOption { + type = types.str; + internal = true; + }; + prevBuildNumber = mkOption { + type = types.str; + internal = true; + }; + prevTargetFiles = mkOption { + type = types.path; + internal = true; + }; }; config = { - prevBuildNumber = let + prevBuildNumber = + let metadata = builtins.readFile (config.prevBuildDir + "/${config.device}-${config.channel}"); - in mkDefault (lib.head (lib.splitString " " metadata)); - prevTargetFiles = mkDefault (config.prevBuildDir + "/${config.device}-target_files-${config.prevBuildNumber}.zip"); + in + mkDefault (lib.head (lib.splitString " " metadata)); + prevTargetFiles = mkDefault ( + config.prevBuildDir + "/${config.device}-target_files-${config.prevBuildNumber}.zip" + ); - otaArgs = - [ "--block" ] - ++ lib.optional config.retrofit "--retrofit_dynamic_partitions"; + otaArgs = [ "--block" ] ++ lib.optional config.retrofit "--retrofit_dynamic_partitions"; }; config.build = rec { # These can be used to build these products inside nix. Requires putting the secret keys under /keys in the sandbox - unsignedTargetFiles = config.build.android + "/${config.productName}-target_files-${config.buildNumber}.zip"; - signedTargetFiles = runWrappedCommand "signed_target_files" signedTargetFilesScript { targetFiles=unsignedTargetFiles;}; + unsignedTargetFiles = + config.build.android + "/${config.productName}-target_files-${config.buildNumber}.zip"; + signedTargetFiles = runWrappedCommand "signed_target_files" signedTargetFilesScript { + targetFiles = unsignedTargetFiles; + }; targetFiles = if config.signing.enable then signedTargetFiles else unsignedTargetFiles; ota = runWrappedCommand "ota_update" otaScript { inherit targetFiles; }; - incrementalOta = runWrappedCommand "incremental-${config.prevBuildNumber}" otaScript { inherit targetFiles; inherit (config) prevTargetFiles; }; + incrementalOta = runWrappedCommand "incremental-${config.prevBuildNumber}" otaScript { + inherit targetFiles; + inherit (config) prevTargetFiles; + }; img = runWrappedCommand "img" imgScript { inherit targetFiles; }; factoryImg = runWrappedCommand "factory" factoryImgScript { inherit targetFiles img; }; unpackedImg = pkgs.robotnix.unpackImg config.build.img; # Pull this out of target files, because (at least) verity key gets put into boot ramdisk - bootImg = pkgs.runCommand "boot.img" {} "${pkgs.unzip}/bin/unzip -p ${targetFiles} IMAGES/boot.img > $out"; - recoveryImg = pkgs.runCommand "recovery.img" {} "${pkgs.unzip}/bin/unzip -p ${targetFiles} IMAGES/recovery.img > $out"; + bootImg = + pkgs.runCommand "boot.img" { } + "${pkgs.unzip}/bin/unzip -p ${targetFiles} IMAGES/boot.img > $out"; + recoveryImg = + pkgs.runCommand "recovery.img" { } + "${pkgs.unzip}/bin/unzip -p ${targetFiles} IMAGES/recovery.img > $out"; # BUILDID_PLACEHOLDER below was originally config.apv.buildID, but we don't want to have to depend on setting a buildID generally. - otaMetadata = (rec { - grapheneos = pkgs.writeText "${config.device}-${config.channel}" '' - ${config.buildNumber} ${toString config.buildDateTime} BUILDID_PLACEHOLDER ${config.channel} - ''; - lineageos = pkgs.writeText "lineageos-${config.device}.json" ( - # https://github.com/LineageOS/android_packages_apps_Updater#server-requirements - builtins.toJSON { - response = [ - { - "datetime" = config.buildDateTime; - "filename" = ota.name; - "id" = config.buildNumber; - "romtype" = config.envVars.RELEASE_TYPE; - "size" = "ROM_SIZE"; - "url" = "${config.apps.updater.url}${ota.name}"; - "version" = config.flavorVersion; - } - ]; - } - ); - }).${config.apps.updater.flavor}; - - writeOtaMetadata = { otaFile, path }: { - grapheneos = '' - cat ${otaMetadata} > ${path}/${config.device}-${config.channel} - ''; - lineageos = '' - sed -e "s:\"ROM_SIZE\":$(du -b ${otaFile} | cut -f1):" ${otaMetadata} > ${path}/lineageos-${config.device}.json - ''; - }.${config.apps.updater.flavor}; + otaMetadata = + (rec { + grapheneos = pkgs.writeText "${config.device}-${config.channel}" '' + ${config.buildNumber} ${toString config.buildDateTime} BUILDID_PLACEHOLDER ${config.channel} + ''; + lineageos = pkgs.writeText "lineageos-${config.device}.json" ( + # https://github.com/LineageOS/android_packages_apps_Updater#server-requirements + builtins.toJSON { + response = [ + { + "datetime" = config.buildDateTime; + "filename" = ota.name; + "id" = config.buildNumber; + "romtype" = config.envVars.RELEASE_TYPE; + "size" = "ROM_SIZE"; + "url" = "${config.apps.updater.url}${ota.name}"; + "version" = config.flavorVersion; + } + ]; + } + ); + }).${config.apps.updater.flavor}; + + writeOtaMetadata = + { otaFile, path }: + { + grapheneos = '' + cat ${otaMetadata} > ${path}/${config.device}-${config.channel} + ''; + lineageos = '' + sed -e "s:\"ROM_SIZE\":$(du -b ${otaFile} | cut -f1):" ${otaMetadata} > ${path}/lineageos-${config.device}.json + ''; + } + .${config.apps.updater.flavor}; # TODO: target-files aren't necessary to publish--but are useful to include if prevBuildDir is set to otaDir output - otaDir = pkgs.runCommand "${config.device}-otaDir" {} '' + otaDir = pkgs.runCommand "${config.device}-otaDir" { } '' mkdir -p $out ln -s "${ota}" "$out/${ota.name}" ln -s "${targetFiles}" "$out/${config.device}-target_files-${config.buildNumber}.zip" ${lib.optionalString config.incremental ''ln -s ${incrementalOta} "$out/${incrementalOta.name}"''} - ${writeOtaMetadata { otaFile = ota; path = placeholder "out"; }} + ${writeOtaMetadata { + otaFile = ota; + path = placeholder "out"; + }} ''; # TODO: Do this in a temporary directory. It's ugly to make build dir and ./tmp/* dir gets cleared in these scripts too. releaseScript = - (if (!config.signing.enable) then lib.warn "releaseScript should be used only if signing.enable = true; Otherwise, the build might be using incorrect keys / certificate metadata" else lib.id) - pkgs.writeShellScript "release.sh" ('' - set -euo pipefail - - if [[ $# -ge 2 ]]; then - PREV_BUILDNUMBER="$2" - else - PREV_BUILDNUMBER="" - fi - '' + (wrapScript { keysDir="$1"; commands='' - echo Signing target files - ${signedTargetFilesScript { targetFiles=unsignedTargetFiles; out=signedTargetFiles.name; }} - echo Building OTA zip - ${otaScript { targetFiles=signedTargetFiles.name; out=ota.name; }} - if [[ ! -z "$PREV_BUILDNUMBER" ]]; then - echo Building incremental OTA zip - ${otaScript { - targetFiles=signedTargetFiles.name; - prevTargetFiles="${config.device}-target_files-$PREV_BUILDNUMBER.zip"; - out="${config.device}-incremental-$PREV_BUILDNUMBER-${config.buildNumber}.zip"; - }} - fi - echo Building .img file - ${imgScript { targetFiles=signedTargetFiles.name; out=img.name; }} - echo Building factory image - ${factoryImgScript { targetFiles=signedTargetFiles.name; img=img.name; out=factoryImg.name; }} - '' + lib.optionalString config.apps.updater.enable '' - echo Writing updater metadata - ${writeOtaMetadata { otaFile=ota.name; path = "."; }} - ''; })); + ( + if (!config.signing.enable) then + lib.warn "releaseScript should be used only if signing.enable = true; Otherwise, the build might be using incorrect keys / certificate metadata" + else + lib.id + ) + pkgs.writeShellScript + "release.sh" + ( + '' + set -euo pipefail + + if [[ $# -ge 2 ]]; then + PREV_BUILDNUMBER="$2" + else + PREV_BUILDNUMBER="" + fi + '' + + (wrapScript { + keysDir = "$1"; + commands = + '' + echo Signing target files + ${signedTargetFilesScript { + targetFiles = unsignedTargetFiles; + out = signedTargetFiles.name; + }} + echo Building OTA zip + ${otaScript { + targetFiles = signedTargetFiles.name; + out = ota.name; + }} + if [[ ! -z "$PREV_BUILDNUMBER" ]]; then + echo Building incremental OTA zip + ${ + otaScript { + targetFiles = signedTargetFiles.name; + prevTargetFiles = "${config.device}-target_files-$PREV_BUILDNUMBER.zip"; + out = "${config.device}-incremental-$PREV_BUILDNUMBER-${config.buildNumber}.zip"; + } + } + fi + echo Building .img file + ${imgScript { + targetFiles = signedTargetFiles.name; + out = img.name; + }} + echo Building factory image + ${factoryImgScript { + targetFiles = signedTargetFiles.name; + img = img.name; + out = factoryImg.name; + }} + '' + + lib.optionalString config.apps.updater.enable '' + echo Writing updater metadata + ${writeOtaMetadata { + otaFile = ota.name; + path = "."; + }} + ''; + }) + ); }; } diff --git a/modules/repo2nix.nix b/modules/repo2nix.nix index 7ebda0f0..9eccac78 100644 --- a/modules/repo2nix.nix +++ b/modules/repo2nix.nix @@ -1,14 +1,16 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT { - pkgs ? import ../pkgs {}, - manifest, rev, sha256 -# Optional parameters: -, repoRepoURL ? "https://github.com/danielfullmer/tools_repo" -, repoRepoRev ? "master" -, referenceDir ? "" -, extraFlags ? "--no-repo-verify" -, localManifests ? [] + pkgs ? import ../pkgs { }, + manifest, + rev, + sha256, + # Optional parameters: + repoRepoURL ? "https://github.com/danielfullmer/tools_repo", + repoRepoRev ? "master", + referenceDir ? "", + extraFlags ? "--no-repo-verify", + localManifests ? [ ], }: assert repoRepoRev != "" -> repoRepoURL != ""; @@ -30,8 +32,9 @@ let "--manifest-branch=${rev}" "--depth=1" ] ++ extraRepoInitFlags; -in stdenvNoCC.mkDerivation { - name = "repo2json-${replaceStrings ["/"] ["="] rev}"; +in +stdenvNoCC.mkDerivation { + name = "repo2json-${replaceStrings [ "/" ] [ "=" ] rev}"; outputHashAlgo = "sha256"; outputHash = sha256; @@ -40,31 +43,37 @@ in stdenvNoCC.mkDerivation { enableParallelBuilding = true; impureEnvVars = fetchers.proxyImpureEnvVars ++ [ - "GIT_PROXY_COMMAND" "SOCKS_SERVER" + "GIT_PROXY_COMMAND" + "SOCKS_SERVER" ]; - nativeBuildInputs = [ gitRepo cacert ]; + nativeBuildInputs = [ + gitRepo + cacert + ]; GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt"; - buildCommand = '' - # Path must be absolute (e.g. for GnuPG: ~/.repoconfig/gnupg/pubring.kbx) - export HOME="$(pwd)" + buildCommand = + '' + # Path must be absolute (e.g. for GnuPG: ~/.repoconfig/gnupg/pubring.kbx) + export HOME="$(pwd)" - mkdir -p .repo/local_manifests + mkdir -p .repo/local_manifests - '' + - (concatMapStringsSep "\n" - (localManifest: "cp ${localManifest} .repo/local_manifests/$(stripHash ${localManifest}; echo $strippedName)") - localManifests) - + '' + '' + + (concatMapStringsSep "\n" ( + localManifest: + "cp ${localManifest} .repo/local_manifests/$(stripHash ${localManifest}; echo $strippedName)" + ) localManifests) + + '' - # XXX: Hack since android.googlesource.com and recent curl version don't play nicely. - ${pkgs.git}/bin/git config --global http.version HTTP/1.1 + # XXX: Hack since android.googlesource.com and recent curl version don't play nicely. + ${pkgs.git}/bin/git config --global http.version HTTP/1.1 - repo init ${concatStringsSep " " repoInitFlags} - repo dumpjson > "$out" + repo init ${concatStringsSep " " repoInitFlags} + repo dumpjson > "$out" - rm -rf .repo* - ''; + rm -rf .repo* + ''; } diff --git a/modules/resources.nix b/modules/resources.nix index 433f5a33..b9f475f0 100644 --- a/modules/resources.nix +++ b/modules/resources.nix @@ -1,7 +1,13 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, robotnixlib, ... }: +{ + config, + pkgs, + lib, + robotnixlib, + ... +}: # https://developer.android.com/guide/topics/resources/providing-resources # https://developer.android.com/guide/topics/resources/more-resources.html @@ -11,28 +17,44 @@ let # TODO: # "oneOf [ (listOf int) (listOf str) ]" doesn't work. Fails with str looking for int # Using "listOf (either str int)" instead - resourceTypeGeneric = with types; oneOf [ bool int str (listOf (either str int)) ]; - resourceTypeModule = types.submodule ({ name, config, ... }: { - options = { - type = mkOption { - type = types.enum [ "bool" "integer" "dimen" "color" "string" "integer-array" "string-array" ]; - description = "Set to override auto-detected resource type"; - }; + resourceTypeGeneric = + with types; + oneOf [ + bool + int + str + (listOf (either str int)) + ]; + resourceTypeModule = types.submodule ( + { name, config, ... }: + { + options = { + type = mkOption { + type = types.enum [ + "bool" + "integer" + "dimen" + "color" + "string" + "integer-array" + "string-array" + ]; + description = "Set to override auto-detected resource type"; + }; - value = mkOption { - type = resourceTypeGeneric; + value = mkOption { type = resourceTypeGeneric; }; }; - }; - config = { - type = mkOptionDefault (robotnixlib.resourceTypeName config.value); - }; - }); + config = { + type = mkOptionDefault (robotnixlib.resourceTypeName config.value); + }; + } + ); in { options = { resources = mkOption { - default = {}; + default = { }; type = with types; attrsOf (attrsOf (either resourceTypeGeneric resourceTypeModule)); description = "Additional package resources to include. The first key refers to the relative path for the package, and the second key refers to the resource name"; example = lib.literalExample "{ \"frameworks/base/core/res\".config_enableAutoPowerModes = true; }"; @@ -43,13 +65,18 @@ in # TODO: Should some of these be in system? product.extraConfig = "PRODUCT_PACKAGE_OVERLAYS += robotnix/overlay"; - source.dirs."robotnix/overlay".src = (pkgs.symlinkJoin { - name = "robotnix-overlay"; - paths = lib.mapAttrsToList (relativePath: packageResources: (pkgs.writeTextFile { - name = "${lib.replaceStrings ["/"] ["="] relativePath}-resources"; - text = robotnixlib.configXML packageResources; - destination = "/${relativePath}/res/values/default.xml"; # I think it's ok that the name doesn't match the original--since they all get merged anyway - })) config.resources; - }); + source.dirs."robotnix/overlay".src = ( + pkgs.symlinkJoin { + name = "robotnix-overlay"; + paths = lib.mapAttrsToList ( + relativePath: packageResources: + (pkgs.writeTextFile { + name = "${lib.replaceStrings [ "/" ] [ "=" ] relativePath}-resources"; + text = robotnixlib.configXML packageResources; + destination = "/${relativePath}/res/values/default.xml"; # I think it's ok that the name doesn't match the original--since they all get merged anyway + }) + ) config.resources; + } + ); }; } diff --git a/modules/security-pki.nix b/modules/security-pki.nix index bbd43072..8da4156f 100644 --- a/modules/security-pki.nix +++ b/modules/security-pki.nix @@ -1,7 +1,12 @@ # SPDX-FileCopyrightText: 2022 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let inherit (lib) mkIf mkOption types; @@ -9,13 +14,13 @@ in { options = { security.pki.certificateFiles = mkOption { - default = []; + default = [ ]; type = types.listOf types.path; description = "A list of files containing trusted root certificates in PEM format. These are added as system-level trust anchors."; }; }; - config = mkIf (config.security.pki.certificateFiles != []) { + config = mkIf (config.security.pki.certificateFiles != [ ]) { source.dirs."system/ca-certificates".postPatch = lib.concatMapStringsSep "\n" (certFile: '' cp -v ${lib.escapeShellArg "${certFile}"} $out/files/$(${pkgs.openssl}/bin/openssl x509 -inform PEM -subject_hash_old -in ${lib.escapeShellArg "${certFile}"} -noout).0 '') config.security.pki.certificateFiles; diff --git a/modules/signing.nix b/modules/signing.nix index 150a7bbc..02085e2d 100644 --- a/modules/signing.nix +++ b/modules/signing.nix @@ -1,27 +1,53 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkMerge mkOption mkEnableOption mkDefault mkOptionDefault mkRenamedOptionModule types; + inherit (lib) + mkIf + mkMerge + mkOption + mkEnableOption + mkDefault + mkOptionDefault + mkRenamedOptionModule + types + ; cfg = config.signing; # TODO: Find a better way to do this? putInStore = path: if (lib.hasPrefix builtins.storeDir path) then path else (/. + path); - keysToGenerate = lib.unique (lib.flatten ( - map (key: "${config.device}/${key}") [ "releasekey" "platform" "shared" "media" ] - ++ (lib.optional (config.signing.avb.mode == "verity_only") "${config.device}/verity") - ++ (lib.optionals (config.androidVersion >= 10) [ "${config.device}/networkstack" ]) - ++ (lib.optionals (config.androidVersion >= 11) [ "com.android.hotspot2.osulogin" "com.android.wifi.resources" ]) - ++ (lib.optionals (config.androidVersion >= 12) [ "com.android.connectivity.resources" ]) - ++ (lib.optional config.signing.apex.enable config.signing.apex.packageNames) - ++ (lib.mapAttrsToList - (name: prebuilt: prebuilt.certificate) - (lib.filterAttrs (name: prebuilt: prebuilt.enable && prebuilt.certificate != "PRESIGNED") config.apps.prebuilt)) - )); + keysToGenerate = lib.unique ( + lib.flatten ( + map (key: "${config.device}/${key}") [ + "releasekey" + "platform" + "shared" + "media" + ] + ++ (lib.optional (config.signing.avb.mode == "verity_only") "${config.device}/verity") + ++ (lib.optionals (config.androidVersion >= 10) [ "${config.device}/networkstack" ]) + ++ (lib.optionals (config.androidVersion >= 11) [ + "com.android.hotspot2.osulogin" + "com.android.wifi.resources" + ]) + ++ (lib.optionals (config.androidVersion >= 12) [ "com.android.connectivity.resources" ]) + ++ (lib.optional config.signing.apex.enable config.signing.apex.packageNames) + ++ (lib.mapAttrsToList (name: prebuilt: prebuilt.certificate) ( + lib.filterAttrs ( + name: prebuilt: prebuilt.enable && prebuilt.certificate != "PRESIGNED" + ) config.apps.prebuilt + )) + ) + ); in { options = { @@ -33,13 +59,13 @@ in }; signTargetFilesArgs = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; internal = true; }; prebuiltImages = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; internal = true; description = '' @@ -52,8 +78,13 @@ in # TODO: Refactor mode = mkOption { - type = types.enum [ "verity_only" "vbmeta_simple" "vbmeta_chained" "vbmeta_chained_v2" ]; - default = "vbmeta_chained"; + type = types.enum [ + "verity_only" + "vbmeta_simple" + "vbmeta_chained" + "vbmeta_chained_v2" + ]; + default = "vbmeta_chained"; description = "Mode of AVB signing to use."; }; @@ -73,7 +104,7 @@ in enable = mkEnableOption "signing APEX packages"; packageNames = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; description = "APEX packages which need to be signed"; }; @@ -97,239 +128,306 @@ in }; }; - config = let - testKeysStorePath = config.source.dirs."build/make".src + /target/product/security; - in { - assertions = [ - { - assertion = (builtins.length cfg.prebuiltImages) != 0 -> config.androidVersion == 12; - message = "The --prebuilt-image patch is only applied to Android 12"; - } - ]; - - signing.keyStorePath = mkIf (!config.signing.enable) (mkDefault testKeysStorePath); - signing.buildTimeKeyStorePath = mkMerge [ - (mkIf config.signing.enable (mkDefault "/keys")) - (mkIf (!config.signing.enable) (mkDefault testKeysStorePath)) - ]; - signing.avb.fingerprint = mkIf config.signing.enable (mkOptionDefault - (pkgs.robotnix.sha256Fingerprint (putInStore "${config.signing.keyStorePath}/${config.device}/avb_pkmd.bin")) - ); - signing.avb.verityCert = mkIf config.signing.enable (mkOptionDefault (putInStore "${config.signing.keyStorePath}/${config.device}/verity.x509.pem")); - - signing.apex.enable = mkIf (config.androidVersion >= 10) (mkDefault true); - # TODO: Some of these apex packages share the same underlying keys. We should try to match that. See META/apexkeys.txt from target-files - signing.apex.packageNames = map (s: "com.android.${s}") ( - lib.optionals (config.androidVersion == 10) [ - "runtime.release" - ] ++ lib.optionals (config.androidVersion >= 10) [ - "conscrypt" "media" "media.swcodec" "resolv" "tzdata" - ] ++ lib.optionals (config.androidVersion == 11) [ - "art.release" "vndk.v27" - ] ++ lib.optionals (config.androidVersion >= 11) [ - "adbd" "cellbroadcast" "extservices" "i18n" "ipsec" "mediaprovider" - "neuralnetworks" "os.statsd" "permission" "runtime" "sdkext" - "telephony" "tethering" "wifi" "vndk.current" "vndk.v28" "vndk.v29" - ] ++ lib.optionals (config.androidVersion >= 12) [ - "appsearch" "art" "art.debug" "art.host" "art.testing" "compos" "geotz" - "scheduling" "support.apexer" "tethering.inprocess" "virt" - "vndk.current.on_vendor" "vndk.v30" - ] - ); - - signing.signTargetFilesArgs = let - avbFlags = { - verity_only = [ - "--replace_verity_public_key $KEYSDIR/${config.device}/verity_key.pub" - "--replace_verity_private_key $KEYSDIR/${config.device}/verity" - "--replace_verity_keyid $KEYSDIR/${config.device}/verity.x509.pem" - ]; - vbmeta_simple = [ - "--avb_vbmeta_key $KEYSDIR/${config.device}/avb.pem" "--avb_vbmeta_algorithm SHA256_RSA2048" - ]; - vbmeta_chained = [ - "--avb_vbmeta_key $KEYSDIR/${config.device}/avb.pem" "--avb_vbmeta_algorithm SHA256_RSA2048" - "--avb_system_key $KEYSDIR/${config.device}/avb.pem" "--avb_system_algorithm SHA256_RSA2048" - ]; - vbmeta_chained_v2 = [ - "--avb_vbmeta_key $KEYSDIR/${config.device}/avb.pem" "--avb_vbmeta_algorithm SHA256_RSA2048" - "--avb_system_key $KEYSDIR/${config.device}/avb.pem" "--avb_system_algorithm SHA256_RSA2048" - "--avb_vbmeta_system_key $KEYSDIR/${config.device}/avb.pem" "--avb_vbmeta_system_algorithm SHA256_RSA2048" - ]; - }.${cfg.avb.mode} - ++ lib.optionals ((config.androidVersion >= 10) && (cfg.avb.mode != "verity_only")) [ - "--avb_system_other_key $KEYSDIR/${config.device}/avb.pem" - "--avb_system_other_algorithm SHA256_RSA2048" - ]; - keyMappings = { - # Default key mappings from sign_target_files_apks.py - "build/make/target/product/security/devkey" = "${config.device}/releasekey"; - "build/make/target/product/security/testkey" = "${config.device}/releasekey"; - "build/make/target/product/security/media" = "${config.device}/media"; - "build/make/target/product/security/shared" = "${config.device}/shared"; - "build/make/target/product/security/platform" = "${config.device}/platform"; - } - // lib.optionalAttrs (config.androidVersion >= 10) { - "build/make/target/product/security/networkstack" = "${config.device}/networkstack"; - } - // lib.optionalAttrs (config.androidVersion == 11) { - "frameworks/base/packages/OsuLogin/certs/com.android.hotspot2.osulogin" = "com.android.hotspot2.osulogin"; - "frameworks/opt/net/wifi/service/resources-certs/com.android.wifi.resources" = "com.android.wifi.resources"; - } - // lib.optionalAttrs (config.androidVersion >= 12) { - # Paths to OsuLogin and com.android.wifi have changed - "packages/modules/Wifi/OsuLogin/certs/com.android.hotspot2.osulogin" = "com.android.hotspot2.osulogin"; - "packages/modules/Wifi/service/ServiceWifiResources/resources-certs/com.android.wifi.resources" = "com.android.wifi.resources"; - "packages/modules/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources" = "com.android.connectivity.resources"; - } - # App-specific keys - // lib.mapAttrs' - (name: prebuilt: lib.nameValuePair "robotnix/prebuilt/${prebuilt.name}/${prebuilt.certificate}" prebuilt.certificate) - config.apps.prebuilt; + config = + let + testKeysStorePath = config.source.dirs."build/make".src + /target/product/security; in - lib.mapAttrsToList (from: to: "--key_mapping ${from}=$KEYSDIR/${to}") keyMappings - ++ lib.optionals cfg.avb.enable avbFlags - ++ lib.optionals cfg.apex.enable (map (k: "--extra_apks ${k}.apex=$KEYSDIR/${k} --extra_apex_payload_key ${k}.apex=$KEYSDIR/${k}.pem") cfg.apex.packageNames) - ++ lib.optionals (builtins.length cfg.prebuiltImages != 0) (map (image: "--prebuilt_image ${image}") cfg.prebuiltImages); - - otaArgs = - if config.signing.enable - then [ "-k $KEYSDIR/${config.device}/releasekey" ] - else [ "-k ${config.source.dirs."build/make".src}/target/product/security/testkey" ]; - - build.generateKeysScript = let - # Get a bunch of utilities to generate keys - keyTools = pkgs.runCommandCC "android-key-tools" { buildInputs = [ (if config.androidVersion >= 12 then pkgs.python3 else pkgs.python2) ]; } '' - mkdir -p $out/bin - - cp ${config.source.dirs."development".src}/tools/make_key $out/bin/make_key - substituteInPlace $out/bin/make_key --replace openssl ${lib.getBin pkgs.openssl}/bin/openssl - - cc -o $out/bin/generate_verity_key \ - ${config.source.dirs."system/extras".src}/verity/generate_verity_key.c \ - ${config.source.dirs."system/core".src}/libcrypto_utils/android_pubkey.c${lib.optionalString (config.androidVersion >= 12) "pp"} \ - -I ${config.source.dirs."system/core".src}/libcrypto_utils/include/ \ - -I ${pkgs.boringssl}/include ${pkgs.boringssl}/lib/libssl.a ${pkgs.boringssl}/lib/libcrypto.a -lpthread - - cp ${config.source.dirs."external/avb".src}/avbtool $out/bin/avbtool - - patchShebangs $out/bin - ''; - # TODO: avbkey is not encrypted. Can it be? Need to get passphrase into avbtool - # Generate either verity or avb--not recommended to use same keys across devices. e.g. attestation relies on device-specific keys - in pkgs.writeShellScript "generate_keys.sh" '' - set -euo pipefail - - if [[ "$#" -ne 1 ]]; then - echo "Usage: $0 " - echo "$#" - exit 1 - fi - - mkdir -p "$1" - cd "$1" - - export PATH=${lib.getBin pkgs.openssl}/bin:${keyTools}/bin:$PATH + { + assertions = [ + { + assertion = (builtins.length cfg.prebuiltImages) != 0 -> config.androidVersion == 12; + message = "The --prebuilt-image patch is only applied to Android 12"; + } + ]; - KEYS=( ${toString keysToGenerate} ) - APEX_KEYS=( ${lib.optionalString config.signing.apex.enable (toString config.signing.apex.packageNames)} ) + signing.keyStorePath = mkIf (!config.signing.enable) (mkDefault testKeysStorePath); + signing.buildTimeKeyStorePath = mkMerge [ + (mkIf config.signing.enable (mkDefault "/keys")) + (mkIf (!config.signing.enable) (mkDefault testKeysStorePath)) + ]; + signing.avb.fingerprint = mkIf config.signing.enable ( + mkOptionDefault ( + pkgs.robotnix.sha256Fingerprint ( + putInStore "${config.signing.keyStorePath}/${config.device}/avb_pkmd.bin" + ) + ) + ); + signing.avb.verityCert = mkIf config.signing.enable ( + mkOptionDefault (putInStore "${config.signing.keyStorePath}/${config.device}/verity.x509.pem") + ); - mkdir -p "${config.device}" + signing.apex.enable = mkIf (config.androidVersion >= 10) (mkDefault true); + # TODO: Some of these apex packages share the same underlying keys. We should try to match that. See META/apexkeys.txt from target-files + signing.apex.packageNames = map (s: "com.android.${s}") ( + lib.optionals (config.androidVersion == 10) [ "runtime.release" ] + ++ lib.optionals (config.androidVersion >= 10) [ + "conscrypt" + "media" + "media.swcodec" + "resolv" + "tzdata" + ] + ++ lib.optionals (config.androidVersion == 11) [ + "art.release" + "vndk.v27" + ] + ++ lib.optionals (config.androidVersion >= 11) [ + "adbd" + "cellbroadcast" + "extservices" + "i18n" + "ipsec" + "mediaprovider" + "neuralnetworks" + "os.statsd" + "permission" + "runtime" + "sdkext" + "telephony" + "tethering" + "wifi" + "vndk.current" + "vndk.v28" + "vndk.v29" + ] + ++ lib.optionals (config.androidVersion >= 12) [ + "appsearch" + "art" + "art.debug" + "art.host" + "art.testing" + "compos" + "geotz" + "scheduling" + "support.apexer" + "tethering.inprocess" + "virt" + "vndk.current.on_vendor" + "vndk.v30" + ] + ); - for key in "''${KEYS[@]}"; do - if [[ ! -e "$key".pk8 ]]; then - echo "Generating $key key" - # make_key exits with unsuccessful code 1 instead of 0 - make_key "$key" "/CN=Robotnix ''${key/\// }/" && exit 1 + signing.signTargetFilesArgs = + let + avbFlags = + { + verity_only = [ + "--replace_verity_public_key $KEYSDIR/${config.device}/verity_key.pub" + "--replace_verity_private_key $KEYSDIR/${config.device}/verity" + "--replace_verity_keyid $KEYSDIR/${config.device}/verity.x509.pem" + ]; + vbmeta_simple = [ + "--avb_vbmeta_key $KEYSDIR/${config.device}/avb.pem" + "--avb_vbmeta_algorithm SHA256_RSA2048" + ]; + vbmeta_chained = [ + "--avb_vbmeta_key $KEYSDIR/${config.device}/avb.pem" + "--avb_vbmeta_algorithm SHA256_RSA2048" + "--avb_system_key $KEYSDIR/${config.device}/avb.pem" + "--avb_system_algorithm SHA256_RSA2048" + ]; + vbmeta_chained_v2 = [ + "--avb_vbmeta_key $KEYSDIR/${config.device}/avb.pem" + "--avb_vbmeta_algorithm SHA256_RSA2048" + "--avb_system_key $KEYSDIR/${config.device}/avb.pem" + "--avb_system_algorithm SHA256_RSA2048" + "--avb_vbmeta_system_key $KEYSDIR/${config.device}/avb.pem" + "--avb_vbmeta_system_algorithm SHA256_RSA2048" + ]; + } + .${cfg.avb.mode} + ++ lib.optionals ((config.androidVersion >= 10) && (cfg.avb.mode != "verity_only")) [ + "--avb_system_other_key $KEYSDIR/${config.device}/avb.pem" + "--avb_system_other_algorithm SHA256_RSA2048" + ]; + keyMappings = + { + # Default key mappings from sign_target_files_apks.py + "build/make/target/product/security/devkey" = "${config.device}/releasekey"; + "build/make/target/product/security/testkey" = "${config.device}/releasekey"; + "build/make/target/product/security/media" = "${config.device}/media"; + "build/make/target/product/security/shared" = "${config.device}/shared"; + "build/make/target/product/security/platform" = "${config.device}/platform"; + } + // lib.optionalAttrs (config.androidVersion >= 10) { + "build/make/target/product/security/networkstack" = "${config.device}/networkstack"; + } + // lib.optionalAttrs (config.androidVersion == 11) { + "frameworks/base/packages/OsuLogin/certs/com.android.hotspot2.osulogin" = "com.android.hotspot2.osulogin"; + "frameworks/opt/net/wifi/service/resources-certs/com.android.wifi.resources" = "com.android.wifi.resources"; + } + // lib.optionalAttrs (config.androidVersion >= 12) { + # Paths to OsuLogin and com.android.wifi have changed + "packages/modules/Wifi/OsuLogin/certs/com.android.hotspot2.osulogin" = "com.android.hotspot2.osulogin"; + "packages/modules/Wifi/service/ServiceWifiResources/resources-certs/com.android.wifi.resources" = "com.android.wifi.resources"; + "packages/modules/Connectivity/service/ServiceConnectivityResources/resources-certs/com.android.connectivity.resources" = "com.android.connectivity.resources"; + } + # App-specific keys + // lib.mapAttrs' ( + name: prebuilt: + lib.nameValuePair "robotnix/prebuilt/${prebuilt.name}/${prebuilt.certificate}" prebuilt.certificate + ) config.apps.prebuilt; + in + lib.mapAttrsToList (from: to: "--key_mapping ${from}=$KEYSDIR/${to}") keyMappings + ++ lib.optionals cfg.avb.enable avbFlags + ++ lib.optionals cfg.apex.enable ( + map ( + k: "--extra_apks ${k}.apex=$KEYSDIR/${k} --extra_apex_payload_key ${k}.apex=$KEYSDIR/${k}.pem" + ) cfg.apex.packageNames + ) + ++ lib.optionals (builtins.length cfg.prebuiltImages != 0) ( + map (image: "--prebuilt_image ${image}") cfg.prebuiltImages + ); + + otaArgs = + if config.signing.enable then + [ "-k $KEYSDIR/${config.device}/releasekey" ] else - echo "Skipping generating $key key since it is already exists" - fi - done + [ "-k ${config.source.dirs."build/make".src}/target/product/security/testkey" ]; + + build.generateKeysScript = + let + # Get a bunch of utilities to generate keys + keyTools = + pkgs.runCommandCC "android-key-tools" + { buildInputs = [ (if config.androidVersion >= 12 then pkgs.python3 else pkgs.python2) ]; } + '' + mkdir -p $out/bin + + cp ${config.source.dirs."development".src}/tools/make_key $out/bin/make_key + substituteInPlace $out/bin/make_key --replace openssl ${lib.getBin pkgs.openssl}/bin/openssl + + cc -o $out/bin/generate_verity_key \ + ${config.source.dirs."system/extras".src}/verity/generate_verity_key.c \ + ${config.source.dirs."system/core".src}/libcrypto_utils/android_pubkey.c${ + lib.optionalString (config.androidVersion >= 12) "pp" + } \ + -I ${config.source.dirs."system/core".src}/libcrypto_utils/include/ \ + -I ${pkgs.boringssl}/include ${pkgs.boringssl}/lib/libssl.a ${pkgs.boringssl}/lib/libcrypto.a -lpthread + + cp ${config.source.dirs."external/avb".src}/avbtool $out/bin/avbtool + + patchShebangs $out/bin + ''; + in + # TODO: avbkey is not encrypted. Can it be? Need to get passphrase into avbtool + # Generate either verity or avb--not recommended to use same keys across devices. e.g. attestation relies on device-specific keys + pkgs.writeShellScript "generate_keys.sh" '' + set -euo pipefail + + if [[ "$#" -ne 1 ]]; then + echo "Usage: $0 " + echo "$#" + exit 1 + fi + + mkdir -p "$1" + cd "$1" + + export PATH=${lib.getBin pkgs.openssl}/bin:${keyTools}/bin:$PATH + + KEYS=( ${toString keysToGenerate} ) + APEX_KEYS=( ${lib.optionalString config.signing.apex.enable (toString config.signing.apex.packageNames)} ) + + mkdir -p "${config.device}" + + for key in "''${KEYS[@]}"; do + if [[ ! -e "$key".pk8 ]]; then + echo "Generating $key key" + # make_key exits with unsuccessful code 1 instead of 0 + make_key "$key" "/CN=Robotnix ''${key/\// }/" && exit 1 + else + echo "Skipping generating $key key since it is already exists" + fi + done + + for key in "''${APEX_KEYS[@]}"; do + if [[ ! -e "$key".pem ]]; then + echo "Generating $key APEX AVB key" + openssl genrsa -out "$key".pem 4096 + avbtool extract_public_key --key "$key".pem --output "$key".avbpubkey + else + echo "Skipping generating $key APEX key since it is already exists" + fi + done + + ${lib.optionalString (config.signing.avb.mode == "verity_only") '' + if [[ ! -e "${config.device}/verity_key.pub" ]]; then + generate_verity_key -convert ${config.device}/verity.x509.pem ${config.device}/verity_key + fi + ''} + + ${lib.optionalString (config.signing.avb.mode != "verity_only") '' + if [[ ! -e "${config.device}/avb.pem" ]]; then + # TODO: Maybe switch to 4096 bit avb key to match apex? Any device-specific problems with doing that? + echo "Generating Device AVB key" + openssl genrsa -out ${config.device}/avb.pem 2048 + avbtool extract_public_key --key ${config.device}/avb.pem --output ${config.device}/avb_pkmd.bin + else + echo "Skipping generating device AVB key since it is already exists" + fi + ''} + ''; - for key in "''${APEX_KEYS[@]}"; do - if [[ ! -e "$key".pem ]]; then - echo "Generating $key APEX AVB key" - openssl genrsa -out "$key".pem 4096 - avbtool extract_public_key --key "$key".pem --output "$key".avbpubkey - else - echo "Skipping generating $key APEX key since it is already exists" - fi - done - - ${lib.optionalString (config.signing.avb.mode == "verity_only") '' - if [[ ! -e "${config.device}/verity_key.pub" ]]; then - generate_verity_key -convert ${config.device}/verity.x509.pem ${config.device}/verity_key - fi - ''} - - ${lib.optionalString (config.signing.avb.mode != "verity_only") '' - if [[ ! -e "${config.device}/avb.pem" ]]; then - # TODO: Maybe switch to 4096 bit avb key to match apex? Any device-specific problems with doing that? - echo "Generating Device AVB key" - openssl genrsa -out ${config.device}/avb.pem 2048 - avbtool extract_public_key --key ${config.device}/avb.pem --output ${config.device}/avb_pkmd.bin - else - echo "Skipping generating device AVB key since it is already exists" - fi - ''} - ''; - - # Check that all needed keys are available. - # TODO: Remove code duplicated with generate_keys.sh - build.verifyKeysScript = pkgs.writeShellScript "verify_keys.sh" '' - set -euo pipefail - - if [[ "$#" -ne 1 ]]; then - echo "Usage: $0 " - exit 1 - fi - - cd "$1" - - KEYS=( ${toString keysToGenerate} ) - APEX_KEYS=( ${lib.optionalString config.signing.apex.enable (toString config.signing.apex.packageNames)} ) - - RETVAL=0 - - for key in "''${KEYS[@]}"; do - if [[ ! -e "$key".pk8 ]]; then - echo "Missing $key key" - RETVAL=1 + # Check that all needed keys are available. + # TODO: Remove code duplicated with generate_keys.sh + build.verifyKeysScript = pkgs.writeShellScript "verify_keys.sh" '' + set -euo pipefail + + if [[ "$#" -ne 1 ]]; then + echo "Usage: $0 " + exit 1 fi - done - for key in "''${APEX_KEYS[@]}"; do - if [[ ! -e "$key".pem ]]; then - echo "Missing $key APEX AVB key" - RETVAL=1 + cd "$1" + + KEYS=( ${toString keysToGenerate} ) + APEX_KEYS=( ${lib.optionalString config.signing.apex.enable (toString config.signing.apex.packageNames)} ) + + RETVAL=0 + + for key in "''${KEYS[@]}"; do + if [[ ! -e "$key".pk8 ]]; then + echo "Missing $key key" + RETVAL=1 + fi + done + + for key in "''${APEX_KEYS[@]}"; do + if [[ ! -e "$key".pem ]]; then + echo "Missing $key APEX AVB key" + RETVAL=1 + fi + done + + ${lib.optionalString (config.signing.avb.mode == "verity_only") '' + if [[ ! -e "${config.device}/verity_key.pub" ]]; then + echo "Missing verity_key.pub" + RETVAL=1 + fi + ''} + + ${lib.optionalString (config.signing.avb.mode != "verity_only") '' + if [[ ! -e "${config.device}/avb.pem" ]]; then + echo "Missing Device AVB key" + RETVAL=1 + fi + ''} + + if [[ "$RETVAL" -ne 0 ]]; then + echo Certain keys were missing from KEYSDIR. Have you run generateKeysScript? + echo Additionally, some robotnix configuration options require that you re-run + echo generateKeysScript to create additional new keys. This should not overwrite + echo existing keys. fi - done - - ${lib.optionalString (config.signing.avb.mode == "verity_only") '' - if [[ ! -e "${config.device}/verity_key.pub" ]]; then - echo "Missing verity_key.pub" - RETVAL=1 - fi - ''} - - ${lib.optionalString (config.signing.avb.mode != "verity_only") '' - if [[ ! -e "${config.device}/avb.pem" ]]; then - echo "Missing Device AVB key" - RETVAL=1 - fi - ''} - - if [[ "$RETVAL" -ne 0 ]]; then - echo Certain keys were missing from KEYSDIR. Have you run generateKeysScript? - echo Additionally, some robotnix configuration options require that you re-run - echo generateKeysScript to create additional new keys. This should not overwrite - echo existing keys. - fi - exit $RETVAL - ''; - }; + exit $RETVAL + ''; + }; imports = [ - (mkRenamedOptionModule [ "keyStorePath" ] [ "signing" "keyStorePath" ]) + (mkRenamedOptionModule [ "keyStorePath" ] [ + "signing" + "keyStorePath" + ]) ]; } diff --git a/modules/source.nix b/modules/source.nix index c1d76b96..800c03db 100644 --- a/modules/source.nix +++ b/modules/source.nix @@ -1,31 +1,50 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkDefault mkOption types; - - projectSource = p: + inherit (lib) + mkIf + mkDefault + mkOption + types + ; + + projectSource = + p: let - ref = if lib.strings.hasInfix "refs/heads" p.revisionExpr then lib.last (lib.splitString "/" p.revisionExpr) else p.revisionExpr; - name = builtins.replaceStrings ["/"] ["="] p.relpath; + ref = + if lib.strings.hasInfix "refs/heads" p.revisionExpr then + lib.last (lib.splitString "/" p.revisionExpr) + else + p.revisionExpr; + name = builtins.replaceStrings [ "/" ] [ "=" ] p.relpath; in - if config.source.evalTimeFetching - then - builtins.fetchGit { # Evaluation-time source fetching. Uses nix's git cache, but any nix-instantiate will require fetching sources. + if config.source.evalTimeFetching then + builtins.fetchGit { + # Evaluation-time source fetching. Uses nix's git cache, but any nix-instantiate will require fetching sources. inherit (p) url rev; inherit ref name; } else - pkgs.fetchgit { # Build-time source fetching. This should be preferred, but is slightly less convenient when developing. + pkgs.fetchgit { + # Build-time source fetching. This should be preferred, but is slightly less convenient when developing. inherit (p) url sha256 fetchSubmodules; # Use revisionExpr if it is a tag so we use the tag in the name of the nix derivation instead of the revision - rev = if (p.revisionExpr != null && lib.hasPrefix "refs/tags/" p.revisionExpr) then p.revisionExpr else p.rev; + rev = + if (p.revisionExpr != null && lib.hasPrefix "refs/tags/" p.revisionExpr) then + p.revisionExpr + else + p.rev; deepClone = false; }; - # A tree (attrset containing attrsets) which matches the source directories relpath filesystem structure. # e.g. # { @@ -36,182 +55,205 @@ let # } # ... # }; - dirsTree = let - listToTreeBranch = xs: - if builtins.length xs == 0 then {} - else { "${builtins.head xs}" = listToTreeBranch (builtins.tail xs); }; - combineTreeBranches = branches: - lib.foldr lib.recursiveUpdate {} branches; - enabledDirs = lib.filterAttrs (name: dir: dir.enable) config.source.dirs; - in - combineTreeBranches (lib.mapAttrsToList (name: dir: listToTreeBranch (lib.splitString "/" dir.relpath)) enabledDirs); - - fileModule = types.submodule ({ config, ... }: { - options = { - src = mkOption { - type = types.str; - internal = true; - }; - - dest = mkOption { - type = types.str; - internal = true; - }; - }; - }); - - dirModule = let - _config = config; - in types.submodule ({ name, config, ... }: { - options = { - enable = mkOption { - default = true; - type = types.bool; - description = "Whether to include this directory in the android build source tree."; - }; - - relpath = mkOption { - default = name; - type = types.str; - description = "Relative path under android source tree to place this directory. Defaults to attribute name."; - }; - - src = mkOption { - type = types.path; - description = "Source to use for this android source directory."; - default = pkgs.runCommand "empty" {} "mkdir -p $out"; - apply = src: # Maybe replace with with pkgs.applyPatches? Need patchFlags though... - if (config.patches != [] || config.postPatch != "") - then (pkgs.runCommand "${builtins.replaceStrings ["/"] ["="] config.relpath}-patched" {} '' - cp --reflink=auto --no-preserve=ownership --no-dereference --preserve=links -r ${src} $out/ - chmod u+w -R $out - ${lib.concatMapStringsSep "\n" (p: "echo Applying ${p} && patch -p1 --no-backup-if-mismatch -d $out < ${p}") config.patches} - ${lib.concatMapStringsSep "\n" (p: "echo Applying ${p} && ${pkgs.git}/bin/git apply --directory=$out --unsafe-paths ${p}") config.gitPatches} - cd $out - ${config.postPatch} - '') - else src; - }; - - patches = mkOption { - default = []; - type = types.listOf types.path; - description = "Patches to apply to source directory."; - }; - - # TODO: Ugly workaround since "git apply" doesn't handle fuzz in the hunk - # line numbers like GNU patch does. - gitPatches = mkOption { - default = []; - type = types.listOf types.path; - description = "Patches to apply to source directory using 'git apply' instead of GNU patch."; - internal = true; - }; - - postPatch = mkOption { - default = ""; - type = types.lines; - description = "Additional commands to run after patching source directory."; - }; - - unpackScript = mkOption { - type = types.str; - internal = true; - }; - - # These remaining options should be set by json output of mk-vendor-file.py - url = mkOption { - type = types.nullOr types.str; - default = null; - internal = true; - }; - - rev = mkOption { - type = types.nullOr types.str; - default = null; - internal = true; - }; - - revisionExpr = mkOption { - type = types.nullOr types.str; - default = null; - internal = true; - }; - - tree = mkOption { - type = types.nullOr types.str; - default = null; - internal = true; - }; - - groups = mkOption { - default = []; - type = types.listOf types.str; - internal = true; - }; - - dateTime = mkOption { - default = 1; - type = types.int; - internal = true; - }; - - sha256 = mkOption { - type = types.nullOr types.str; - default = null; - internal = true; - }; - - fetchSubmodules = mkOption { - type = types.bool; - default = false; - internal = true; - }; + dirsTree = + let + listToTreeBranch = + xs: + if builtins.length xs == 0 then + { } + else + { "${builtins.head xs}" = listToTreeBranch (builtins.tail xs); }; + combineTreeBranches = branches: lib.foldr lib.recursiveUpdate { } branches; + enabledDirs = lib.filterAttrs (name: dir: dir.enable) config.source.dirs; + in + combineTreeBranches ( + lib.mapAttrsToList (name: dir: listToTreeBranch (lib.splitString "/" dir.relpath)) enabledDirs + ); + + fileModule = types.submodule ( + { config, ... }: + { + options = { + src = mkOption { + type = types.str; + internal = true; + }; - linkfiles = mkOption { - default = []; - type = types.listOf fileModule; - internal = true; + dest = mkOption { + type = types.str; + internal = true; + }; }; + } + ); - copyfiles = mkOption { - default = []; - type = types.listOf fileModule; - internal = true; - }; - }; + dirModule = + let + _config = config; + in + types.submodule ( + { name, config, ... }: + { + options = { + enable = mkOption { + default = true; + type = types.bool; + description = "Whether to include this directory in the android build source tree."; + }; + + relpath = mkOption { + default = name; + type = types.str; + description = "Relative path under android source tree to place this directory. Defaults to attribute name."; + }; + + src = mkOption { + type = types.path; + description = "Source to use for this android source directory."; + default = pkgs.runCommand "empty" { } "mkdir -p $out"; + apply = + src: # Maybe replace with with pkgs.applyPatches? Need patchFlags though... + if (config.patches != [ ] || config.postPatch != "") then + (pkgs.runCommand "${builtins.replaceStrings [ "/" ] [ "=" ] config.relpath}-patched" { } '' + cp --reflink=auto --no-preserve=ownership --no-dereference --preserve=links -r ${src} $out/ + chmod u+w -R $out + ${lib.concatMapStringsSep "\n" ( + p: "echo Applying ${p} && patch -p1 --no-backup-if-mismatch -d $out < ${p}" + ) config.patches} + ${lib.concatMapStringsSep "\n" ( + p: "echo Applying ${p} && ${pkgs.git}/bin/git apply --directory=$out --unsafe-paths ${p}" + ) config.gitPatches} + cd $out + ${config.postPatch} + '') + else + src; + }; + + patches = mkOption { + default = [ ]; + type = types.listOf types.path; + description = "Patches to apply to source directory."; + }; + + # TODO: Ugly workaround since "git apply" doesn't handle fuzz in the hunk + # line numbers like GNU patch does. + gitPatches = mkOption { + default = [ ]; + type = types.listOf types.path; + description = "Patches to apply to source directory using 'git apply' instead of GNU patch."; + internal = true; + }; + + postPatch = mkOption { + default = ""; + type = types.lines; + description = "Additional commands to run after patching source directory."; + }; + + unpackScript = mkOption { + type = types.str; + internal = true; + }; + + # These remaining options should be set by json output of mk-vendor-file.py + url = mkOption { + type = types.nullOr types.str; + default = null; + internal = true; + }; + + rev = mkOption { + type = types.nullOr types.str; + default = null; + internal = true; + }; + + revisionExpr = mkOption { + type = types.nullOr types.str; + default = null; + internal = true; + }; + + tree = mkOption { + type = types.nullOr types.str; + default = null; + internal = true; + }; + + groups = mkOption { + default = [ ]; + type = types.listOf types.str; + internal = true; + }; + + dateTime = mkOption { + default = 1; + type = types.int; + internal = true; + }; + + sha256 = mkOption { + type = types.nullOr types.str; + default = null; + internal = true; + }; + + fetchSubmodules = mkOption { + type = types.bool; + default = false; + internal = true; + }; + + linkfiles = mkOption { + default = [ ]; + type = types.listOf fileModule; + internal = true; + }; + + copyfiles = mkOption { + default = [ ]; + type = types.listOf fileModule; + internal = true; + }; + }; - config = { - enable = mkDefault ( - (lib.any (g: lib.elem g config.groups) _config.source.includeGroups) - || (!(lib.any (g: lib.elem g config.groups) _config.source.excludeGroups)) - ); - - src = - mkIf ((config.url != null) && (config.rev != null) && (config.sha256 != null)) - (mkDefault (projectSource config)); - - postPatch = let - # Check if we need to make mountpoints in this directory for other repos to be mounted inside it. - relpathSplit = lib.splitString "/" config.relpath; - mountPoints = lib.attrNames (lib.attrByPath relpathSplit {} dirsTree); - in mkIf (mountPoints != []) - ((lib.concatMapStringsSep "\n" (mountPoint: "mkdir -p ${mountPoint}") mountPoints) + "\n"); - - unpackScript = (lib.optionalString config.enable '' - mkdir -p ${config.relpath} - ${pkgs.util-linux}/bin/mount --bind ${config.src} ${config.relpath} - '') - + (lib.concatMapStringsSep "\n" (c: '' - mkdir -p $(dirname ${c.dest}) - cp --reflink=auto -f ${config.relpath}/${c.src} ${c.dest} - '') config.copyfiles) - + (lib.concatMapStringsSep "\n" (c: '' - mkdir -p $(dirname ${c.dest}) - ln -sf --relative ${config.relpath}/${c.src} ${c.dest} - '') config.linkfiles); - }; - }); + config = { + enable = mkDefault ( + (lib.any (g: lib.elem g config.groups) _config.source.includeGroups) + || (!(lib.any (g: lib.elem g config.groups) _config.source.excludeGroups)) + ); + + src = mkIf ((config.url != null) && (config.rev != null) && (config.sha256 != null)) ( + mkDefault (projectSource config) + ); + + postPatch = + let + # Check if we need to make mountpoints in this directory for other repos to be mounted inside it. + relpathSplit = lib.splitString "/" config.relpath; + mountPoints = lib.attrNames (lib.attrByPath relpathSplit { } dirsTree); + in + mkIf (mountPoints != [ ]) ( + (lib.concatMapStringsSep "\n" (mountPoint: "mkdir -p ${mountPoint}") mountPoints) + "\n" + ); + + unpackScript = + (lib.optionalString config.enable '' + mkdir -p ${config.relpath} + ${pkgs.util-linux}/bin/mount --bind ${config.src} ${config.relpath} + '') + + (lib.concatMapStringsSep "\n" (c: '' + mkdir -p $(dirname ${c.dest}) + cp --reflink=auto -f ${config.relpath}/${c.src} ${c.dest} + '') config.copyfiles) + + (lib.concatMapStringsSep "\n" (c: '' + mkdir -p $(dirname ${c.dest}) + ln -sf --relative ${config.relpath}/${c.src} ${c.dest} + '') config.linkfiles); + }; + } + ); in { options = { @@ -244,7 +286,7 @@ in }; dirs = mkOption { - default = {}; + default = { }; type = types.attrsOf dirModule; description = '' Directories to include in Android build process. @@ -254,13 +296,16 @@ in }; excludeGroups = mkOption { - default = [ "darwin" "mips" ]; + default = [ + "darwin" + "mips" + ]; type = types.listOf types.str; description = "Project groups to exclude from source tree"; }; includeGroups = mkOption { - default = []; + default = [ ]; type = types.listOf types.str; description = "Project groups to include in source tree (overrides `excludeGroups`)"; }; @@ -274,10 +319,12 @@ in }; config.source = { - dirs = mkIf config.source.evalTimeFetching (import ./repo2nix.nix { - manifest = config.source.manifest.url; - inherit (config.source.manifest) rev sha256; - }); + dirs = mkIf config.source.evalTimeFetching ( + import ./repo2nix.nix { + manifest = config.source.manifest.url; + inherit (config.source.manifest) rev sha256; + } + ); unpackScript = lib.concatMapStringsSep "\n" (d: d.unpackScript) (lib.attrValues config.source.dirs); }; @@ -286,27 +333,45 @@ in unpackScript = pkgs.writeShellScript "unpack.sh" config.source.unpackScript; # Extract only files under robotnix/ (for debugging with an external AOSP build) - debugUnpackScript = pkgs.writeShellScript "debug-unpack.sh" ('' - rm -rf robotnix - '' + - (lib.concatStringsSep "" (map (d: lib.optionalString (d.enable && (lib.hasPrefix "robotnix/" d.relpath)) '' - mkdir -p $(dirname ${d.relpath}) - echo "${d.src} -> ${d.relpath}" - cp --reflink=auto --no-preserve=ownership --no-dereference --preserve=links -r ${d.src} ${d.relpath}/ - '') (lib.attrValues config.source.dirs))) + '' - chmod -R u+w robotnix/ - ''); + debugUnpackScript = pkgs.writeShellScript "debug-unpack.sh" ( + '' + rm -rf robotnix + '' + + (lib.concatStringsSep "" ( + map ( + d: + lib.optionalString (d.enable && (lib.hasPrefix "robotnix/" d.relpath)) '' + mkdir -p $(dirname ${d.relpath}) + echo "${d.src} -> ${d.relpath}" + cp --reflink=auto --no-preserve=ownership --no-dereference --preserve=links -r ${d.src} ${d.relpath}/ + '' + ) (lib.attrValues config.source.dirs) + )) + + '' + chmod -R u+w robotnix/ + '' + ); # Patch files in other sources besides robotnix/* - debugPatchScript = pkgs.writeShellScript "debug-patch.sh" - (lib.concatStringsSep "\n" (map (d: '' - ${lib.concatMapStringsSep "\n" (p: "patch -p1 --no-backup-if-mismatch -d ${d.relpath} < ${p}") d.patches} - ${lib.optionalString (d.postPatch != "") '' - pushd ${d.relpath} >/dev/null - ${d.postPatch} - popd >/dev/null - ''} - '') - (lib.filter (d: d.enable && ((d.patches != []) || (d.postPatch != ""))) (lib.attrValues config.source.dirs)))); + debugPatchScript = pkgs.writeShellScript "debug-patch.sh" ( + lib.concatStringsSep "\n" ( + map + (d: '' + ${lib.concatMapStringsSep "\n" ( + p: "patch -p1 --no-backup-if-mismatch -d ${d.relpath} < ${p}" + ) d.patches} + ${lib.optionalString (d.postPatch != "") '' + pushd ${d.relpath} >/dev/null + ${d.postPatch} + popd >/dev/null + ''} + '') + ( + lib.filter (d: d.enable && ((d.patches != [ ]) || (d.postPatch != ""))) ( + lib.attrValues config.source.dirs + ) + ) + ) + ); }; } diff --git a/modules/webview.nix b/modules/webview.nix index d77c8ae0..5cc18cda 100644 --- a/modules/webview.nix +++ b/modules/webview.nix @@ -1,10 +1,20 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkOption mkEnableOption types; + inherit (lib) + mkIf + mkOption + mkEnableOption + types + ; in { options = { @@ -12,95 +22,106 @@ in description = "Webview providers to include in Android build. Pre-specified options are `chromium`, `bromite`, and `vanadium`."; example = lib.literalExample "{ bromite.enable = true; }"; - type = types.attrsOf (types.submodule ({ name, config, ... }: { - options = { - enable = mkEnableOption "${name} webview"; + type = types.attrsOf ( + types.submodule ( + { name, config, ... }: + { + options = { + enable = mkEnableOption "${name} webview"; - packageName = mkOption { - type = types.str; - default = "com.android.webview"; - description = "The Android package name of the APK."; - }; + packageName = mkOption { + type = types.str; + default = "com.android.webview"; + description = "The Android package name of the APK."; + }; - description = mkOption { - type = types.str; - default = "Android System WebView"; - description = "The name shown to the user in the developer settings menu."; - }; + description = mkOption { + type = types.str; + default = "Android System WebView"; + description = "The name shown to the user in the developer settings menu."; + }; - availableByDefault = mkOption { - type = types.bool; - default = false; - description = '' - If `true`, this provider can be automatically selected by the - framework, if it's the first valid choice. If `false`, this - provider will only be used if the user selects it themselves from - the developer settings menu. - ''; - }; + availableByDefault = mkOption { + type = types.bool; + default = false; + description = '' + If `true`, this provider can be automatically selected by the + framework, if it's the first valid choice. If `false`, this + provider will only be used if the user selects it themselves from + the developer settings menu. + ''; + }; - isFallback = mkOption { - type = types.bool; - default = false; - description = '' - If `true`, this provider will be automatically disabled by the - framework, preventing it from being used or updated by app - stores, unless there is no other valid provider available. Only - one provider can be a fallback. - ''; - }; + isFallback = mkOption { + type = types.bool; + default = false; + description = '' + If `true`, this provider will be automatically disabled by the + framework, preventing it from being used or updated by app + stores, unless there is no other valid provider available. Only + one provider can be a fallback. + ''; + }; - apk = mkOption { - type = types.path; - description = "APK file containing webview package."; - }; - }; - })); + apk = mkOption { + type = types.path; + description = "APK file containing webview package."; + }; + }; + } + ) + ); }; }; config = mkIf (lib.any (m: m.enable) (lib.attrValues config.webview)) { assertions = [ - { assertion = lib.any (m: m.enable && m.availableByDefault) (lib.attrValues config.webview); + { + assertion = lib.any (m: m.enable && m.availableByDefault) (lib.attrValues config.webview); message = "Webview module is enabled, but no webview has availableByDefault = true"; } - { assertion = lib.length (lib.filter (m: m.enable && m.isFallback) (lib.attrValues config.webview)) <= 1; + { + assertion = + lib.length (lib.filter (m: m.enable && m.isFallback) (lib.attrValues config.webview)) <= 1; message = "Multiple webview modules have isFallback = true"; } ]; - apps.prebuilt = lib.mapAttrs' (name: m: lib.nameValuePair "${name}webview" { - inherit (m) apk; + apps.prebuilt = lib.mapAttrs' ( + name: m: + lib.nameValuePair "${name}webview" { + inherit (m) apk; - # Don't generate a cert if it's the prebuilt version from upstream - certificate = if (name != "prebuilt") then "${name}webview" else "PRESIGNED"; + # Don't generate a cert if it's the prebuilt version from upstream + certificate = if (name != "prebuilt") then "${name}webview" else "PRESIGNED"; - # Extra stuff from the Android.mk from the example webview module in AOSP. Unsure if these are needed. - extraConfig = '' - LOCAL_MULTILIB := both - LOCAL_REQUIRED_MODULES := \ - libwebviewchromium_loader \ - libwebviewchromium_plat_support - LOCAL_MODULE_TARGET_ARCH := ${config.arch} - ''; - }) (lib.filterAttrs (name: m: m.enable) config.webview); + # Extra stuff from the Android.mk from the example webview module in AOSP. Unsure if these are needed. + extraConfig = '' + LOCAL_MULTILIB := both + LOCAL_REQUIRED_MODULES := \ + libwebviewchromium_loader \ + libwebviewchromium_plat_support + LOCAL_MODULE_TARGET_ARCH := ${config.arch} + ''; + } + ) (lib.filterAttrs (name: m: m.enable) config.webview); product.extraConfig = "PRODUCT_PACKAGE_OVERLAYS += robotnix/webview-overlay"; source.dirs."robotnix/webview-overlay".src = pkgs.writeTextFile { name = "config_webview_packages.xml"; - text = '' - - - '' + - (lib.concatMapStringsSep "\n" - (m: lib.optionalString m.enable - "") - (lib.attrValues config.webview) - ) + - '' - - ''; + text = + '' + + + '' + + (lib.concatMapStringsSep "\n" ( + m: + lib.optionalString m.enable "" + ) (lib.attrValues config.webview)) + + '' + + ''; destination = "/frameworks/base/core/res/res/xml/config_webview_packages.xml"; }; }; diff --git a/nixos/attestation-server/default.nix b/nixos/attestation-server/default.nix index 7513a119..4c7e3c1c 100644 --- a/nixos/attestation-server/default.nix +++ b/nixos/attestation-server/default.nix @@ -1,21 +1,27 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ pkgs, callPackage, lib, substituteAll, makeWrapper, fetchFromGitHub, jdk17_headless, gradleGen, +{ + pkgs, + callPackage, + lib, + substituteAll, + makeWrapper, + fetchFromGitHub, + jdk17_headless, + gradleGen, listenHost ? "localhost", port ? 8080, applicationId ? "org.robotnix.auditor", domain ? "example.org", signatureFingerprint ? "", device ? "", - avbFingerprint ? "" + avbFingerprint ? "", }: let jdk = jdk17_headless; buildGradle = callPackage ./gradle-env.nix { - gradleGen = callPackage (pkgs.path + /pkgs/development/tools/build-managers/gradle) { - java = jdk; - }; + gradleGen = callPackage (pkgs.path + /pkgs/development/tools/build-managers/gradle) { java = jdk; }; }; supportedDevices = import ../../apks/auditor/supported-devices.nix; in @@ -33,11 +39,21 @@ buildGradle { }; patches = [ - (substituteAll ({ - src = ./customized-attestation-server.patch; - inherit listenHost port domain applicationId signatureFingerprint; - } - // lib.genAttrs supportedDevices (d: if (device == d) then avbFingerprint else "DISABLED_CUSTOM_${d}"))) + (substituteAll ( + { + src = ./customized-attestation-server.patch; + inherit + listenHost + port + domain + applicationId + signatureFingerprint + ; + } + // lib.genAttrs supportedDevices ( + d: if (device == d) then avbFingerprint else "DISABLED_CUSTOM_${d}" + ) + )) ]; postPatch = '' @@ -49,7 +65,10 @@ buildGradle { JAVA_TOOL_OPTIONS = "-Dfile.encoding=UTF8"; - outputs = [ "out" "static" ]; + outputs = [ + "out" + "static" + ]; nativeBuildInputs = [ makeWrapper ]; diff --git a/nixos/attestation-server/gradle-env.nix b/nixos/attestation-server/gradle-env.nix index 3469da22..a3bf7a8f 100644 --- a/nixos/attestation-server/gradle-env.nix +++ b/nixos/attestation-server/gradle-env.nix @@ -19,183 +19,232 @@ # ''; # } -{ lib -, stdenv -, buildEnv -, fetchs3 -, fetchurl -, gradleGen -, writeText -, writeTextDir +{ + lib, + stdenv, + buildEnv, + fetchs3, + fetchurl, + gradleGen, + writeText, + writeTextDir, }: { -# Path to the environment spec generated by gradle2nix (e.g. gradle-env.json). - envSpec -, pname ? null -, version ? null -, enableParallelBuilding ? true -# Arguments to Gradle used to build the project in buildPhase. -, gradleFlags ? [ "build" ] -# Gradle package to use instead of the one generated by gradle2nix. -, gradlePackage ? null -# Enable debugging for the Gradle build; this will cause Gradle to run a debug server -# and wait for a JVM debugging client to attach. -, enableDebug ? false -# Additional code to run in the Gradle init script (init.gradle). -, extraInit ? "" -# Override the default JDK used to run Gradle itself. -, buildJdk ? null -# Override functions which fetch dependency artifacts. -# Keys in this set are URL schemes such as "https" or "s3". -# Values are functions which take a dependency in the form -# `{ urls, sha256 }` and fetch into the Nix store. For example: -# -# { -# s3 = { urls, sha256 }: fetchs3 { -# s3url = builtins.head urls; -# inherit sha256; -# region = "us-west-2"; -# credentials = { -# access_key_id = "foo"; -# secret_access_key = "bar"; -# }; -# }; -# } -, fetchers ? { } -, ... } @ args: + # Path to the environment spec generated by gradle2nix (e.g. gradle-env.json). + envSpec, + pname ? null, + version ? null, + enableParallelBuilding ? true, + # Arguments to Gradle used to build the project in buildPhase. + gradleFlags ? [ "build" ], + # Gradle package to use instead of the one generated by gradle2nix. + gradlePackage ? null, + # Enable debugging for the Gradle build; this will cause Gradle to run a debug server + # and wait for a JVM debugging client to attach. + enableDebug ? false, + # Additional code to run in the Gradle init script (init.gradle). + extraInit ? "", + # Override the default JDK used to run Gradle itself. + buildJdk ? null, + # Override functions which fetch dependency artifacts. + # Keys in this set are URL schemes such as "https" or "s3". + # Values are functions which take a dependency in the form + # `{ urls, sha256 }` and fetch into the Nix store. For example: + # + # { + # s3 = { urls, sha256 }: fetchs3 { + # s3url = builtins.head urls; + # inherit sha256; + # region = "us-west-2"; + # credentials = { + # access_key_id = "foo"; + # secret_access_key = "bar"; + # }; + # }; + # } + fetchers ? { }, + ... +}@args: let inherit (builtins) - attrValues concatStringsSep filter fromJSON getAttr head match - replaceStrings sort; + attrValues + concatStringsSep + filter + fromJSON + getAttr + head + match + replaceStrings + sort + ; inherit (lib) - assertMsg concatMapStringsSep groupBy' hasSuffix hasPrefix last mapAttrs - mapAttrsToList optionalString readFile removeSuffix unique versionAtLeast - versionOlder; + assertMsg + concatMapStringsSep + groupBy' + hasSuffix + hasPrefix + last + mapAttrs + mapAttrsToList + optionalString + readFile + removeSuffix + unique + versionAtLeast + versionOlder + ; fetchers' = { http = fetchurl; https = fetchurl; - s3 = { urls, sha256 }: fetchs3 { - s3url = head urls; - inherit sha256; - }; + s3 = + { urls, sha256 }: + fetchs3 { + s3url = head urls; + inherit sha256; + }; } // fetchers; # Fetch urls using the scheme for the first entry only; there isn't a # straightforward way to tell Nix to try multiple fetchers in turn # and short-circuit on the first successful fetch. - fetch = { urls, sha256 }: + fetch = + { urls, sha256 }: let first = head urls; scheme = head (builtins.match "([a-z0-9+.-]+)://.*" first); fetch' = getAttr scheme fetchers'; urls' = filter (hasPrefix scheme) urls; in - fetch' { urls = urls'; inherit sha256; }; + fetch' { + urls = urls'; + inherit sha256; + }; - mkDep = { name, path, urls, sha256, ... }: stdenv.mkDerivation { - inherit name; + mkDep = + { + name, + path, + urls, + sha256, + ... + }: + stdenv.mkDerivation { + inherit name; - src = fetch { - inherit urls sha256; - }; + src = fetch { inherit urls sha256; }; - phases = "installPhase"; + phases = "installPhase"; - installPhase = '' - mkdir -p $out/${path} - ln -s $src $out/${path}/${name} - ''; - }; + installPhase = '' + mkdir -p $out/${path} + ln -s $src $out/${path}/${name} + ''; + }; - mkModuleMetadata = deps: + mkModuleMetadata = + deps: let - ids = filter - (id: id.type == "pom") - (map (dep: dep.id) deps); - - modules = groupBy' - (meta: id: - let - isNewer = versionOlder meta.latest id.version; - isNewerRelease = - !(hasSuffix "-SNAPSHOT" id.version) && - versionOlder meta.release id.version; - in { - groupId = id.group; - artifactId = id.name; - latest = if isNewer then id.version else meta.latest; - release = if isNewerRelease then id.version else meta.release; - versions = meta.versions ++ [id.version]; + ids = filter (id: id.type == "pom") (map (dep: dep.id) deps); + + modules = + groupBy' + ( + meta: id: + let + isNewer = versionOlder meta.latest id.version; + isNewerRelease = !(hasSuffix "-SNAPSHOT" id.version) && versionOlder meta.release id.version; + in + { + groupId = id.group; + artifactId = id.name; + latest = if isNewer then id.version else meta.latest; + release = if isNewerRelease then id.version else meta.release; + versions = meta.versions ++ [ id.version ]; + } + ) + { + latest = ""; + release = ""; + versions = [ ]; } - ) - { - latest = ""; - release = ""; - versions = []; - } - (id: "${replaceStrings ["."] ["/"] id.group}/${id.name}/maven-metadata.xml") - ids; + (id: "${replaceStrings [ "." ] [ "/" ] id.group}/${id.name}/maven-metadata.xml") + ids; in - attrValues (mapAttrs (path: meta: + attrValues ( + mapAttrs ( + path: meta: let versions' = sort versionOlder (unique meta.versions); in - with meta; writeTextDir path '' - - - ${groupId} - ${artifactId} - - ${optionalString (latest != "") "${latest}"} - ${optionalString (release != "") "${release}"} - - ${concatMapStringsSep "\n " (v: "${v}") versions'} - - - - '' - ) modules); + with meta; + writeTextDir path '' + + + ${groupId} + ${artifactId} + + ${optionalString (latest != "") "${latest}"} + ${optionalString (release != "") "${release}"} + + ${concatMapStringsSep "\n " (v: "${v}") versions'} + + + + '' + ) modules + ); - mkSnapshotMetadata = deps: + mkSnapshotMetadata = + deps: let snapshotDeps = filter (dep: dep ? build && dep ? timestamp) deps; - modules = groupBy' - (meta: dep: - let - id = dep.id; - isNewer = dep.build > meta.buildNumber; - # Timestamp values can be bogus, e.g. jitpack.io - updated = if (match "[0-9]{8}\.[0-9]{6}" dep.timestamp) != null - then replaceStrings ["."] [""] dep.timestamp - else ""; - in { - groupId = id.group; - artifactId = id.name; - version = id.version; - timestamp = if isNewer then dep.timestamp else meta.timestamp; - buildNumber = if isNewer then dep.build else meta.buildNumber; - lastUpdated = if isNewer then updated else meta.lastUpdated; - versions = meta.versions or [] ++ [{ - classifier = id.classifier or ""; - extension = id.extension; - value = "${removeSuffix "-SNAPSHOT" id.version}-${dep.timestamp}-${toString dep.build}"; - updated = updated; - }]; + modules = + groupBy' + ( + meta: dep: + let + id = dep.id; + isNewer = dep.build > meta.buildNumber; + # Timestamp values can be bogus, e.g. jitpack.io + updated = + if (match "[0-9]{8}\.[0-9]{6}" dep.timestamp) != null then + replaceStrings [ "." ] [ "" ] dep.timestamp + else + ""; + in + { + groupId = id.group; + artifactId = id.name; + version = id.version; + timestamp = if isNewer then dep.timestamp else meta.timestamp; + buildNumber = if isNewer then dep.build else meta.buildNumber; + lastUpdated = if isNewer then updated else meta.lastUpdated; + versions = meta.versions or [ ] ++ [ + { + classifier = id.classifier or ""; + extension = id.extension; + value = "${removeSuffix "-SNAPSHOT" id.version}-${dep.timestamp}-${toString dep.build}"; + updated = updated; + } + ]; + } + ) + { + timestamp = ""; + buildNumber = -1; + lastUpdated = ""; } - ) - { - timestamp = ""; - buildNumber = -1; - lastUpdated = ""; - } - (dep: "${replaceStrings ["."] ["/"] dep.id.group}/${dep.id.name}/${dep.id.version}/maven-metadata.xml") - snapshotDeps; + ( + dep: + "${replaceStrings [ "." ] [ "/" ] dep.id.group}/${dep.id.name}/${dep.id.version}/maven-metadata.xml" + ) + snapshotDeps; mkSnapshotVersion = version: '' @@ -207,8 +256,11 @@ let ''; in - attrValues (mapAttrs (path: meta: - with meta; writeTextDir path '' + attrValues ( + mapAttrs ( + path: meta: + with meta; + writeTextDir path '' ${groupId} @@ -226,85 +278,95 @@ let '' - ) modules); - - mkRepo = project: type: deps: buildEnv { - name = "${project}-gradle-${type}-env"; - paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps; - }; + ) modules + ); + + mkRepo = + project: type: deps: + buildEnv { + name = "${project}-gradle-${type}-env"; + paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps; + }; - mkInitScript = projectSpec: gradle: + mkInitScript = + projectSpec: gradle: let repos = mapAttrs (mkRepo projectSpec.name) projectSpec.dependencies; - hasDependencies = mapAttrs (type: deps: deps != []) projectSpec.dependencies; + hasDependencies = mapAttrs (type: deps: deps != [ ]) projectSpec.dependencies; - inSettings = pred: script: + inSettings = + pred: script: optionalString pred ( - if versionAtLeast gradle.version "6.0" then '' - gradle.beforeSettings { - ${script} - } - '' else '' - gradle.settingsEvaluated { - ${script} - } - '' + if versionAtLeast gradle.version "6.0" then + '' + gradle.beforeSettings { + ${script} + } + '' + else + '' + gradle.settingsEvaluated { + ${script} + } + '' ); in - assert (assertMsg (hasDependencies.settings -> versionAtLeast gradle.version "6.0") '' + assert ( + assertMsg (hasDependencies.settings -> versionAtLeast gradle.version "6.0") '' Project `${projectSpec.name}' has settings script dependencies, such as settings plugins, which are not supported by gradle2nix for Gradle versions prior to 6.0. Potential remedies: - Pass `--gradle-version=' to the gradle2nix command. - Patch the `settings.gradle[.kts]' file to remove script dependencies. - ''); - - writeText "init.gradle" '' - static def offlineRepo(RepositoryHandler repositories, String env, String path) { - repositories.clear() - repositories.maven { - name "Nix''${env.capitalize()}MavenOffline" - url path - metadataSources { - it.gradleMetadata() - it.mavenPom() - it.artifact() - } - } - repositories.ivy { - name "Nix''${env.capitalize()}IvyOffline" - url path - layout "maven" - metadataSources { - it.gradleMetadata() - it.ivyDescriptor() - it.artifact() - } - } - } + '' + ); + + writeText "init.gradle" '' + static def offlineRepo(RepositoryHandler repositories, String env, String path) { + repositories.clear() + repositories.maven { + name "Nix''${env.capitalize()}MavenOffline" + url path + metadataSources { + it.gradleMetadata() + it.mavenPom() + it.artifact() + } + } + repositories.ivy { + name "Nix''${env.capitalize()}IvyOffline" + url path + layout "maven" + metadataSources { + it.gradleMetadata() + it.ivyDescriptor() + it.artifact() + } + } + } - ${inSettings (hasDependencies.settings && (versionAtLeast gradle.version "6.0")) '' - offlineRepo(it.buildscript.repositories, "settings", "${repos.settings}") - ''} + ${inSettings (hasDependencies.settings && (versionAtLeast gradle.version "6.0")) '' + offlineRepo(it.buildscript.repositories, "settings", "${repos.settings}") + ''} - ${inSettings (hasDependencies.plugin) '' - offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}") - ''} + ${inSettings (hasDependencies.plugin) '' + offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}") + ''} - ${optionalString (hasDependencies.buildscript) '' - gradle.projectsLoaded { - allprojects { - buildscript { - offlineRepo(repositories, "buildscript", "${repos.buildscript}") - } - } - } - ''} + ${optionalString (hasDependencies.buildscript) '' + gradle.projectsLoaded { + allprojects { + buildscript { + offlineRepo(repositories, "buildscript", "${repos.buildscript}") + } + } + } + ''} - ${optionalString (hasDependencies.project) ( - if versionAtLeast gradle.version "6.8" - then '' + ${optionalString (hasDependencies.project) ( + if versionAtLeast gradle.version "6.8" then + '' gradle.beforeSettings { it.dependencyResolutionManagement { offlineRepo(repositories, "project", "${repos.project}") @@ -312,22 +374,20 @@ let } } '' - else '' + else + '' gradle.projectsLoaded { allprojects { offlineRepo(repositories, "project", "${repos.project}") } } '' - )} + )} - ${extraInit} - ''; + ${extraInit} + ''; - mkGradle = gradleSpec: - gradleGen.gradleGen { - inherit (gradleSpec) nativeVersion version sha256; - }; + mkGradle = gradleSpec: gradleGen.gradleGen { inherit (gradleSpec) nativeVersion version sha256; }; mkProjectEnv = projectSpec: rec { inherit (projectSpec) name path version; @@ -335,9 +395,7 @@ let initScript = mkInitScript projectSpec gradle; }; - gradleEnv = mapAttrs - (_: p: mkProjectEnv p) - (fromJSON (readFile envSpec)); + gradleEnv = mapAttrs (_: p: mkProjectEnv p) (fromJSON (readFile envSpec)); projectEnv = gradleEnv.""; pname = args.pname or projectEnv.name; @@ -356,36 +414,40 @@ let ${concatStringsSep " " flags} ''; - buildIncludedProjects = - concatStringsSep "\n" (mapAttrsToList - (_: env: buildProject env [ "build" ]) - (removeAttrs gradleEnv [ "" ])); + buildIncludedProjects = concatStringsSep "\n" ( + mapAttrsToList (_: env: buildProject env [ "build" ]) (removeAttrs gradleEnv [ "" ]) + ); buildRootProject = buildProject projectEnv gradleFlags; -in stdenv.mkDerivation ((builtins.removeAttrs args [ "fetchers" ]) // { +in +stdenv.mkDerivation ( + (builtins.removeAttrs args [ "fetchers" ]) + // { - inherit pname version; + inherit pname version; - nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ projectEnv.gradle ]; + nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ projectEnv.gradle ]; - buildPhase = args.buildPhase or '' - runHook preBuild + buildPhase = + args.buildPhase or '' + runHook preBuild - ( - set -eux + ( + set -eux - # Work around https://github.com/gradle/gradle/issues/1055 - TMPHOME="$(mktemp -d)" - mkdir -p "$TMPHOME/init.d" - export GRADLE_USER_HOME="$TMPHOME" + # Work around https://github.com/gradle/gradle/issues/1055 + TMPHOME="$(mktemp -d)" + mkdir -p "$TMPHOME/init.d" + export GRADLE_USER_HOME="$TMPHOME" - ${buildIncludedProjects} - ${buildRootProject} - ) + ${buildIncludedProjects} + ${buildRootProject} + ) - runHook postBuild - ''; + runHook postBuild + ''; - dontStrip = true; -}) + dontStrip = true; + } +) diff --git a/nixos/attestation-server/module.nix b/nixos/attestation-server/module.nix index 0494af9f..563babba 100644 --- a/nixos/attestation-server/module.nix +++ b/nixos/attestation-server/module.nix @@ -1,26 +1,35 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ config, pkgs, lib, ... }: +{ + config, + pkgs, + lib, + ... +}: let - inherit (lib) mkIf mkOption mkMerge mkEnableOption types; + inherit (lib) + mkIf + mkOption + mkMerge + mkEnableOption + types + ; cfg = config.services.attestation-server; supportedDevices = import ../../apks/auditor/supported-devices.nix; # Don't use nixos's nixpkgs, since gradle has changed too much in latest # nixpkgs, use a pinned version instead - pinnedPkgs = import ../../pkgs {}; - attestation-server = pinnedPkgs.callPackage ./default.nix {}; + pinnedPkgs = import ../../pkgs { }; + attestation-server = pinnedPkgs.callPackage ./default.nix { }; in { options.services.attestation-server = { enable = mkEnableOption "Hardware-based remote attestation service for monitoring the security of Android devices using the Auditor app"; - domain = mkOption { - type = types.str; - }; + domain = mkOption { type = types.str; }; listenHost = mkOption { default = "127.0.0.1"; @@ -32,9 +41,7 @@ in type = types.int; }; - signatureFingerprint = mkOption { - type = types.str; - }; + signatureFingerprint = mkOption { type = types.str; }; device = mkOption { default = ""; @@ -48,7 +55,14 @@ in package = mkOption { default = attestation-server.override { - inherit (cfg) listenHost port domain signatureFingerprint device avbFingerprint; + inherit (cfg) + listenHost + port + domain + signatureFingerprint + device + avbFingerprint + ; }; type = types.path; }; @@ -101,10 +115,12 @@ in }; config = mkIf cfg.enable { - assertions = [ { - assertion = builtins.elem cfg.device supportedDevices; - message = "Device ${cfg.device} is currently unsupported for use with attestation server."; - } ]; + assertions = [ + { + assertion = builtins.elem cfg.device supportedDevices; + message = "Device ${cfg.device} is currently unsupported for use with attestation server."; + } + ]; systemd.services.attestation-server = { description = "Attestation Server"; @@ -113,27 +129,35 @@ in serviceConfig = { ExecStart = "${cfg.package}/bin/AttestationServer"; - ExecStartPre = let - inherit (cfg.email) username passwordFile host port local; - # In SQLite readfile reads a file as a BLOB which is not very useful. - # However, we can use TRIM to convert it to a string and we have to - # truncate the trailing newline (\n = char(10)) anyway. - values = lib.concatStringsSep ", " [ - "('emailUsername', '${username}')" - "('emailPassword', TRIM(readfile('%S/attestation/emailPassword'), char(10)))" - "('emailHost', '${host}')" - "('emailPort', '${toString port}')" - "('emailLocal', '${if local then "1" else "0"}')" + ExecStartPre = + let + inherit (cfg.email) + username + passwordFile + host + port + local + ; + # In SQLite readfile reads a file as a BLOB which is not very useful. + # However, we can use TRIM to convert it to a string and we have to + # truncate the trailing newline (\n = char(10)) anyway. + values = lib.concatStringsSep ", " [ + "('emailUsername', '${username}')" + "('emailPassword', TRIM(readfile('%S/attestation/emailPassword'), char(10)))" + "('emailHost', '${host}')" + "('emailPort', '${toString port}')" + "('emailLocal', '${if local then "1" else "0"}')" + ]; + in + lib.optionals (passwordFile != null) [ + # Note the leading + on the first command. The passwordFile could be + # anywhere in the file system, so it has to be copied as root and + # permissions fixed to be accessible by the service. + "+${pkgs.coreutils}/bin/install -m 0640 -g keys ${passwordFile} %S/attestation/emailPassword" + ''${pkgs.sqlite}/bin/sqlite3 %S/attestation/attestation.db "CREATE TABLE IF NOT EXISTS Configuration (key TEXT PRIMARY KEY NOT NULL, value NOT NULL)"'' + ''${pkgs.sqlite}/bin/sqlite3 %S/attestation/attestation.db "INSERT OR REPLACE INTO Configuration VALUES ${values}"'' + "${pkgs.coreutils}/bin/rm -f %S/attestation/emailPassword" ]; - in lib.optionals (passwordFile != null) [ - # Note the leading + on the first command. The passwordFile could be - # anywhere in the file system, so it has to be copied as root and - # permissions fixed to be accessible by the service. - "+${pkgs.coreutils}/bin/install -m 0640 -g keys ${passwordFile} %S/attestation/emailPassword" - ''${pkgs.sqlite}/bin/sqlite3 %S/attestation/attestation.db "CREATE TABLE IF NOT EXISTS Configuration (key TEXT PRIMARY KEY NOT NULL, value NOT NULL)"'' - ''${pkgs.sqlite}/bin/sqlite3 %S/attestation/attestation.db "INSERT OR REPLACE INTO Configuration VALUES ${values}"'' - "${pkgs.coreutils}/bin/rm -f %S/attestation/emailPassword" - ]; SupplementaryGroups = [ "keys" ]; # When sending TERM, e.g. for restart, AttestationServer fails with @@ -178,16 +202,17 @@ in services.nginx = mkIf cfg.nginx.enable { enable = true; - virtualHosts."${config.services.attestation-server.domain}" = lib.recursiveUpdate { - locations."/".root = cfg.package.static; - locations."/api/".proxyPass = "http://${cfg.listenHost}:${toString cfg.port}/api/"; - locations."/challenge".proxyPass = "http://${cfg.listenHost}:${toString cfg.port}/challenge"; - locations."/verify".proxyPass = "http://${cfg.listenHost}:${toString cfg.port}/verify"; - forceSSL = true; - enableACME = cfg.nginx.enableACME; - } (lib.optionalAttrs cfg.disableAccountCreation { - locations."/api/create_account".return = "403"; - }); + virtualHosts."${config.services.attestation-server.domain}" = + lib.recursiveUpdate + { + locations."/".root = cfg.package.static; + locations."/api/".proxyPass = "http://${cfg.listenHost}:${toString cfg.port}/api/"; + locations."/challenge".proxyPass = "http://${cfg.listenHost}:${toString cfg.port}/challenge"; + locations."/verify".proxyPass = "http://${cfg.listenHost}:${toString cfg.port}/verify"; + forceSSL = true; + enableACME = cfg.nginx.enableACME; + } + (lib.optionalAttrs cfg.disableAccountCreation { locations."/api/create_account".return = "403"; }); }; }; } diff --git a/nixos/attestation-server/test.nix b/nixos/attestation-server/test.nix index 3c7d490a..0355e233 100644 --- a/nixos/attestation-server/test.nix +++ b/nixos/attestation-server/test.nix @@ -3,30 +3,35 @@ { pkgs }: -import "${pkgs.path}/nixos/tests/make-test-python.nix" ({ pkgs, ... }: { - name = "attestation-server"; +import "${pkgs.path}/nixos/tests/make-test-python.nix" ( + { pkgs, ... }: + { + name = "attestation-server"; - machine = { ... }: { - imports = [ ../default.nix ]; + machine = + { ... }: + { + imports = [ ../default.nix ]; - services.attestation-server = { - enable = true; - domain = "example.com"; - device = "crosshatch"; - signatureFingerprint = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - avbFingerprint = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"; - email = { - host = "example.com"; - username = "test"; - passwordFile = "${pkgs.writeText "fake-password" "testing123"}"; # NOTE: Don't use writeText like this with a real password! + services.attestation-server = { + enable = true; + domain = "example.com"; + device = "crosshatch"; + signatureFingerprint = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; + avbFingerprint = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"; + email = { + host = "example.com"; + username = "test"; + passwordFile = "${pkgs.writeText "fake-password" "testing123"}"; # NOTE: Don't use writeText like this with a real password! + }; + nginx.enable = false; + }; }; - nginx.enable = false; - }; - }; - testScript = '' - machine.wait_for_unit("attestation-server.service") - machine.wait_until_succeeds("curl http://127.0.0.1:8085/") - machine.succeed("curl -fsSL -X POST http://127.0.0.1:8085/challenge | hexdump -C") - ''; -}) + testScript = '' + machine.wait_for_unit("attestation-server.service") + machine.wait_until_succeeds("curl http://127.0.0.1:8085/") + machine.succeed("curl -fsSL -X POST http://127.0.0.1:8085/challenge | hexdump -C") + ''; + } +) diff --git a/nixos/default.nix b/nixos/default.nix index 4a0aae6a..7989f1bb 100644 --- a/nixos/default.nix +++ b/nixos/default.nix @@ -1,6 +1,4 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT # Include this file in your "imports = [];" -{ - imports = [ ./attestation-server/module.nix ]; -} +{ imports = [ ./attestation-server/module.nix ]; } diff --git a/ota.nix b/ota.nix index 124bcdd4..38e1c2c9 100644 --- a/ota.nix +++ b/ota.nix @@ -2,24 +2,35 @@ # SPDX-License-Identifier: MIT # I use this to generate my own OTA directory served by nginx -with (import ./pkgs {}); +with (import ./pkgs { }); let common = { signing.keyStorePath = "/var/secrets/android-keys"; signing.enable = true; }; -in symlinkJoin { +in +symlinkJoin { name = "robotnix-ota"; paths = [ - (import ./default.nix { configuration={ - imports = [ common ./example.nix ]; - device = "marlin"; - flavor = "vanilla"; - }; }).otaDir - (import ./default.nix { configuration={ - imports = [ common ./example.nix ]; - device = "crosshatch"; - flavor = "grapheneos"; - }; }).otaDir + (import ./default.nix { + configuration = { + imports = [ + common + ./example.nix + ]; + device = "marlin"; + flavor = "vanilla"; + }; + }).otaDir + (import ./default.nix { + configuration = { + imports = [ + common + ./example.nix + ]; + device = "crosshatch"; + flavor = "grapheneos"; + }; + }).otaDir ]; } diff --git a/pkgs/android-emulator/default.nix b/pkgs/android-emulator/default.nix index a2a1de26..98779c70 100644 --- a/pkgs/android-emulator/default.nix +++ b/pkgs/android-emulator/default.nix @@ -1,11 +1,31 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ stdenv, lib, fetchurl, runCommand, writeText, writeShellScript, - autoPatchelfHook, makeWrapper, glibc, libGL, libpulseaudio, zlib, ncurses5, - nspr, fontconfig, nss, unzip, alsa-lib, libuuid, xlibs, dbus, xkeyboard_config, +{ + stdenv, + lib, + fetchurl, + runCommand, + writeText, + writeShellScript, + autoPatchelfHook, + makeWrapper, + glibc, + libGL, + libpulseaudio, + zlib, + ncurses5, + nspr, + fontconfig, + nss, + unzip, + alsa-lib, + libuuid, + xlibs, + dbus, + xkeyboard_config, xorg, - androidPkgs + androidPkgs, }: let @@ -56,39 +76,56 @@ let }; # Turn an attrset into AVD text - toAVD = conf: builtins.concatStringsSep "\n" - (lib.collect builtins.isString - (lib.mapAttrsRecursive - (path: value: (builtins.concatStringsSep "." path) + "=" + (builtins.toString value)) - conf)); + toAVD = + conf: + builtins.concatStringsSep "\n" ( + lib.collect builtins.isString ( + lib.mapAttrsRecursive ( + path: value: (builtins.concatStringsSep "." path) + "=" + (builtins.toString value) + ) conf + ) + ); - bindImg = { img, avd ? {} }: let - fakeSdkRoot = runCommand "fake-sdk" {} '' - mkdir -p $out/system-images/android - ln -s ${img} $out/system-images/android/x86 + bindImg = + { + img, + avd ? { }, + }: + let + fakeSdkRoot = runCommand "fake-sdk" { } '' + mkdir -p $out/system-images/android + ln -s ${img} $out/system-images/android/x86 - mkdir -p $out/platforms - mkdir -p $out/platform-tools - ''; - avdAttrs = lib.recursiveUpdate defaultAVD avd; - in writeShellScript "bound-android-emulator" '' - AVD=$(pwd)/avd - mkdir -p $AVD/Pixel2.avd - cp ${writeText "config.ini" (toAVD avdAttrs)} $AVD/Pixel2.avd/config.ini - echo "avd.ini.encoding=UTF-8" > $AVD/Pixel2.ini - echo "target=android-29" >> $AVD/Pixel2.ini - echo "path=$AVD/Pixel2.avd" >> $AVD/Pixel2.ini - chmod u+w $AVD/Pixel2.ini $AVD/Pixel2.avd/config.ini + mkdir -p $out/platforms + mkdir -p $out/platform-tools + ''; + avdAttrs = lib.recursiveUpdate defaultAVD avd; + in + writeShellScript "bound-android-emulator" '' + AVD=$(pwd)/avd + mkdir -p $AVD/Pixel2.avd + cp ${writeText "config.ini" (toAVD avdAttrs)} $AVD/Pixel2.avd/config.ini + echo "avd.ini.encoding=UTF-8" > $AVD/Pixel2.ini + echo "target=android-29" >> $AVD/Pixel2.ini + echo "path=$AVD/Pixel2.avd" >> $AVD/Pixel2.ini + chmod u+w $AVD/Pixel2.ini $AVD/Pixel2.avd/config.ini - export ANDROID_SDK_ROOT=${fakeSdkRoot} - export ANDROID_AVD_HOME=$AVD + export ANDROID_SDK_ROOT=${fakeSdkRoot} + export ANDROID_AVD_HOME=$AVD - ${android-emulator}/emulator @Pixel2 -gpu swiftshader_indirect $@ - ''; + ${android-emulator}/emulator @Pixel2 -gpu swiftshader_indirect $@ + ''; - android-emulator = androidPkgs.packages.emulator.overrideAttrs ({ passthru ? {}, ...}: { - passthru = passthru // { - inherit bindImg; - }; - }); -in android-emulator + android-emulator = androidPkgs.packages.emulator.overrideAttrs ( + { + passthru ? { }, + ... + }: + { + passthru = passthru // { + inherit bindImg; + }; + } + ); +in +android-emulator diff --git a/pkgs/android-prepare-vendor/default.nix b/pkgs/android-prepare-vendor/default.nix index c7d8d1ff..bbe0bcb6 100644 --- a/pkgs/android-prepare-vendor/default.nix +++ b/pkgs/android-prepare-vendor/default.nix @@ -1,54 +1,85 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ stdenv, lib, callPackage, fetchurl, fetchpatch, fetchFromGitHub, autoPatchelfHook, makeWrapper, - simg2img, zip, unzip, e2fsprogs, jq, jdk, curl, util-linux, perl, python2, python3, libarchive, - api ? 32 +{ + stdenv, + lib, + callPackage, + fetchurl, + fetchpatch, + fetchFromGitHub, + autoPatchelfHook, + makeWrapper, + simg2img, + zip, + unzip, + e2fsprogs, + jq, + jdk, + curl, + util-linux, + perl, + python2, + python3, + libarchive, + api ? 32, }: let python = if api >= 30 then python3 else python2; - dexrepair = callPackage ./dexrepair.nix {}; + dexrepair = callPackage ./dexrepair.nix { }; apiStr = builtins.toString api; - version = { - "29" = "2020-08-26"; - "30" = "2021-09-07"; - "31" = "2021-10-21"; - "32" = "2022-03-18"; - }.${builtins.toString api}; + version = + { + "29" = "2020-08-26"; + "30" = "2021-09-07"; + "31" = "2021-10-21"; + "32" = "2022-03-18"; + } + .${builtins.toString api}; - src = { - "29" = (fetchFromGitHub { - # Android10 branch - owner = "AOSPAlliance"; - repo = "android-prepare-vendor"; - rev = "a9602ca6ef16ff10641d668dcb203f89f402d40d"; - sha256 = "0wldj8ykwh8r7m1ff6vbkbc73a80lmmxwfmk8nm0cnzpbfk4cq7w"; - }); - "30" = (fetchFromGitHub { - # Android11 branch - owner = "AOSPAlliance"; - repo = "android-prepare-vendor"; - rev = "227f5ce7cd89a3f57291fe2b84869c7a5d1e17fa"; - sha256 = "07g5dcl2x44ai5q2yfq9ybx7j7kn41s82hgpv7jff5v1vr38cia9"; - }); - "31" = (fetchFromGitHub { - # Android12 - owner = "grapheneos"; - repo = "android-prepare-vendor"; - rev = "7c09cb887d3b9a2643cfc6ecf3966db1e378be32"; - sha256 = "0j579ick4cihv3ha2gg0b88h33zfik118376g4rw1qfq0cwbwdg8"; - }); - "32" = (fetchFromGitHub { - # Android12.1 - owner = "grapheneos"; - repo = "android-prepare-vendor"; - rev = "888e116ea243a120ad47f1698515fc4cff08583a"; - sha256 = "0wiq9z8mjxa5fanzz28iq41y5hwvsz6yh3aylkj71ggzhbpgc9wd"; - }); - }.${builtins.toString api}; + src = + { + "29" = ( + fetchFromGitHub { + # Android10 branch + owner = "AOSPAlliance"; + repo = "android-prepare-vendor"; + rev = "a9602ca6ef16ff10641d668dcb203f89f402d40d"; + sha256 = "0wldj8ykwh8r7m1ff6vbkbc73a80lmmxwfmk8nm0cnzpbfk4cq7w"; + } + ); + "30" = ( + fetchFromGitHub { + # Android11 branch + owner = "AOSPAlliance"; + repo = "android-prepare-vendor"; + rev = "227f5ce7cd89a3f57291fe2b84869c7a5d1e17fa"; + sha256 = "07g5dcl2x44ai5q2yfq9ybx7j7kn41s82hgpv7jff5v1vr38cia9"; + } + ); + "31" = ( + fetchFromGitHub { + # Android12 + owner = "grapheneos"; + repo = "android-prepare-vendor"; + rev = "7c09cb887d3b9a2643cfc6ecf3966db1e378be32"; + sha256 = "0j579ick4cihv3ha2gg0b88h33zfik118376g4rw1qfq0cwbwdg8"; + } + ); + "32" = ( + fetchFromGitHub { + # Android12.1 + owner = "grapheneos"; + repo = "android-prepare-vendor"; + rev = "888e116ea243a120ad47f1698515fc4cff08583a"; + sha256 = "0wiq9z8mjxa5fanzz28iq41y5hwvsz6yh3aylkj71ggzhbpgc9wd"; + } + ); + } + .${builtins.toString api}; in (stdenv.mkDerivation { @@ -60,38 +91,54 @@ in (python.withPackages (p: [ p.protobuf ])) # Python is used by "extract_android_ota_payload" ]; - patches = { - "29" = [ - ./10/0001-Disable-oatdump-update.patch - ./10/0002-Just-write-proprietary-blobs.txt-to-current-dir.patch - ./10/0003-Allow-for-externally-set-config-file.patch - ]; - "30" = [ - ./11/0001-Disable-oatdump-update.patch - ./11/0002-Just-write-proprietary-blobs.txt-to-current-dir.patch - ./11/0003-Allow-for-externally-set-config-file.patch - ./11/0004-Add-option-to-use-externally-provided-carrier_list.p.patch - ]; - "31" = [ - ./12/0001-Just-write-proprietary-blobs.txt-to-current-dir.patch - ./12/0002-Allow-for-externally-set-config-file.patch - ./12/0003-Add-option-to-use-externally-provided-carrier_list.p.patch - ./12/0004-Add-Android-12-workaround-for-PRODUCT_COPY_FILES.patch - ]; - "32" = [ - ./12/0001-Just-write-proprietary-blobs.txt-to-current-dir.patch - ./12/0002-Allow-for-externally-set-config-file.patch - ./12/0003-Add-option-to-use-externally-provided-carrier_list.p.patch - ./12/0004-Add-Android-12-workaround-for-PRODUCT_COPY_FILES.patch - ]; - }.${builtins.toString api}; + patches = + { + "29" = [ + ./10/0001-Disable-oatdump-update.patch + ./10/0002-Just-write-proprietary-blobs.txt-to-current-dir.patch + ./10/0003-Allow-for-externally-set-config-file.patch + ]; + "30" = [ + ./11/0001-Disable-oatdump-update.patch + ./11/0002-Just-write-proprietary-blobs.txt-to-current-dir.patch + ./11/0003-Allow-for-externally-set-config-file.patch + ./11/0004-Add-option-to-use-externally-provided-carrier_list.p.patch + ]; + "31" = [ + ./12/0001-Just-write-proprietary-blobs.txt-to-current-dir.patch + ./12/0002-Allow-for-externally-set-config-file.patch + ./12/0003-Add-option-to-use-externally-provided-carrier_list.p.patch + ./12/0004-Add-Android-12-workaround-for-PRODUCT_COPY_FILES.patch + ]; + "32" = [ + ./12/0001-Just-write-proprietary-blobs.txt-to-current-dir.patch + ./12/0002-Allow-for-externally-set-config-file.patch + ./12/0003-Add-option-to-use-externally-provided-carrier_list.p.patch + ./12/0004-Add-Android-12-workaround-for-PRODUCT_COPY_FILES.patch + ]; + } + .${builtins.toString api}; postPatch = '' patchShebangs ./execute-all.sh patchShebangs ./scripts for i in ./execute-all.sh ./scripts/download-nexus-image.sh ./scripts/extract-factory-images.sh ./scripts/generate-vendor.sh ./scripts/gen-prop-blobs-list.sh ./scripts/realpath.sh ./scripts/system-img-repair.sh ./scripts/extract-ota.sh; do - sed -i '2 i export PATH=$PATH:${lib.makeBinPath [ zip unzip simg2img dexrepair e2fsprogs jq jdk util-linux perl curl libarchive ]}' $i + sed -i '2 i export PATH=$PATH:${ + lib.makeBinPath [ + zip + unzip + simg2img + dexrepair + e2fsprogs + jq + jdk + util-linux + perl + curl + libarchive + ] + }' $i done # Fix when using --input containing readonly files diff --git a/pkgs/android-prepare-vendor/dexrepair.nix b/pkgs/android-prepare-vendor/dexrepair.nix index bceb5cb8..da9d630c 100644 --- a/pkgs/android-prepare-vendor/dexrepair.nix +++ b/pkgs/android-prepare-vendor/dexrepair.nix @@ -1,7 +1,11 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ stdenv, fetchFromGitHub, zlib }: +{ + stdenv, + fetchFromGitHub, + zlib, +}: stdenv.mkDerivation { name = "dexrepair"; diff --git a/pkgs/bundletool/default.nix b/pkgs/bundletool/default.nix index 0b4e5bd6..1a76c5ec 100644 --- a/pkgs/bundletool/default.nix +++ b/pkgs/bundletool/default.nix @@ -27,7 +27,13 @@ #} # TODO: Make a wrapper script for this? -{ stdenv, makeWrapper, fetchurl, jre8_headless, androidPkgs }: +{ + stdenv, + makeWrapper, + fetchurl, + jre8_headless, + androidPkgs, +}: stdenv.mkDerivation rec { pname = "bundletool"; diff --git a/pkgs/cipd/default.nix b/pkgs/cipd/default.nix index 6bd37f0f..628575a4 100644 --- a/pkgs/cipd/default.nix +++ b/pkgs/cipd/default.nix @@ -1,7 +1,15 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ lib, stdenv, buildGoPackage, fetchgit, fetchhg, fetchbzr, fetchsvn }: +{ + lib, + stdenv, + buildGoPackage, + fetchgit, + fetchhg, + fetchbzr, + fetchsvn, +}: buildGoPackage rec { name = "cipd-${version}"; diff --git a/pkgs/cipd/fetchcipd.nix b/pkgs/cipd/fetchcipd.nix index 0c08e01a..73df1b43 100644 --- a/pkgs/cipd/fetchcipd.nix +++ b/pkgs/cipd/fetchcipd.nix @@ -1,26 +1,38 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ lib, runCommand, callPackage, cacert, cipd }: +{ + lib, + runCommand, + callPackage, + cacert, + cipd, +}: -{ name ? builtins.baseNameOf package -, package -, version -, sha256 +{ + name ? builtins.baseNameOf package, + package, + version, + sha256, }: -runCommand name { - nativeBuildInputs = [ cipd cacert ]; +runCommand name + { + nativeBuildInputs = [ + cipd + cacert + ]; - outputHashAlgo = "sha256"; - outputHashMode = "recursive"; - outputHash = sha256; + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = sha256; - preferLocalBuild = true; -} '' - mkdir -p $out - cd $out - cipd init - cipd install -- "${package}" "${version}" -'' + preferLocalBuild = true; + } + '' + mkdir -p $out + cd $out + cipd init + cipd install -- "${package}" "${version}" + '' # TODO: Remove symlinks and .cipd dirs? diff --git a/pkgs/default.nix b/pkgs/default.nix index d43ecb93..bef616c4 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ +{ system ? builtins.currentSystem, inputs ? (import ../flake/compat.nix { inherit system; }).defaultNix.inputs, ... @@ -9,7 +9,8 @@ let inherit (inputs) nixpkgs androidPkgs; -in nixpkgs.legacyPackages.x86_64-linux.appendOverlays [ +in +nixpkgs.legacyPackages.x86_64-linux.appendOverlays [ (self: super: { androidPkgs.packages = androidPkgs.packages.x86_64-linux; androidPkgs.sdk = androidPkgs.sdk.x86_64-linux; diff --git a/pkgs/fetchgerritpatchset/default.nix b/pkgs/fetchgerritpatchset/default.nix index a3f5471c..015581c6 100644 --- a/pkgs/fetchgerritpatchset/default.nix +++ b/pkgs/fetchgerritpatchset/default.nix @@ -3,15 +3,38 @@ { lib, fetchpatch }: -{ domain, repo, changeNumber, patchset ? 1, ... }@args: +{ + domain, + repo, + changeNumber, + patchset ? 1, + ... +}@args: -(fetchpatch ({ - name = "${lib.replaceStrings ["/"] ["_"] repo}-${builtins.toString changeNumber}-${builtins.toString patchset}.patch"; - url = "https://${domain}/changes/${lib.replaceStrings ["/"] ["%2F"] repo}~${builtins.toString changeNumber}/revisions/${builtins.toString patchset}/patch?download"; - } // builtins.removeAttrs args [ "domain" "repo" "changeNumber" "patchset" ]) -).overrideAttrs ({ postFetch, ... }: { - postFetch = '' - base64 -d <$out >${builtins.toString changeNumber}.patch - mv ${builtins.toString changeNumber}.patch $out - '' + postFetch; -}) +(fetchpatch ( + { + name = "${ + lib.replaceStrings [ "/" ] [ "_" ] repo + }-${builtins.toString changeNumber}-${builtins.toString patchset}.patch"; + url = "https://${domain}/changes/${ + lib.replaceStrings [ "/" ] [ "%2F" ] repo + }~${builtins.toString changeNumber}/revisions/${builtins.toString patchset}/patch?download"; + } + // builtins.removeAttrs args [ + "domain" + "repo" + "changeNumber" + "patchset" + ] +)).overrideAttrs + ( + { postFetch, ... }: + { + postFetch = + '' + base64 -d <$out >${builtins.toString changeNumber}.patch + mv ${builtins.toString changeNumber}.patch $out + '' + + postFetch; + } + ) diff --git a/pkgs/fetchgit/default.nix b/pkgs/fetchgit/default.nix index bccfbb25..b46ba520 100644 --- a/pkgs/fetchgit/default.nix +++ b/pkgs/fetchgit/default.nix @@ -1,53 +1,69 @@ -{lib, stdenvNoCC, git, git-lfs, cacert}: let - urlToName = url: rev: let - inherit (lib) removeSuffix splitString last; - base = last (splitString ":" (baseNameOf (removeSuffix "/" url))); +{ + lib, + stdenvNoCC, + git, + git-lfs, + cacert, +}: +let + urlToName = + url: rev: + let + inherit (lib) removeSuffix splitString last; + base = last (splitString ":" (baseNameOf (removeSuffix "/" url))); - matched = builtins.match "(.*)\\.git" base; + matched = builtins.match "(.*)\\.git" base; - short = builtins.substring 0 7 rev; + short = builtins.substring 0 7 rev; - appendShort = if (builtins.match "[a-f0-9]*" rev) != null - then "-${short}" - else ""; - in "${if matched == null then base else builtins.head matched}${appendShort}"; + appendShort = if (builtins.match "[a-f0-9]*" rev) != null then "-${short}" else ""; + in + "${if matched == null then base else builtins.head matched}${appendShort}"; in -{ url, rev ? "HEAD", md5 ? "", sha256 ? "", hash ? "", leaveDotGit ? deepClone -, fetchSubmodules ? true, deepClone ? false -, branchName ? null -, name ? urlToName url rev -, # Shell code executed after the file has been fetched +{ + url, + rev ? "HEAD", + md5 ? "", + sha256 ? "", + hash ? "", + leaveDotGit ? deepClone, + fetchSubmodules ? true, + deepClone ? false, + branchName ? null, + name ? urlToName url rev, + # Shell code executed after the file has been fetched # successfully. This can do things like check or transform the file. - postFetch ? "" -, preferLocalBuild ? true -, fetchLFS ? false -, # Shell code to build a netrc file for BASIC auth - netrcPhase ? null -, # Impure env vars (https://nixos.org/nix/manual/#sec-advanced-attributes) + postFetch ? "", + preferLocalBuild ? true, + fetchLFS ? false, + # Shell code to build a netrc file for BASIC auth + netrcPhase ? null, + # Impure env vars (https://nixos.org/nix/manual/#sec-advanced-attributes) # needed for netrcPhase - netrcImpureEnvVars ? [] + netrcImpureEnvVars ? [ ], }: -/* NOTE: - fetchgit has one problem: git fetch only works for refs. - This is because fetching arbitrary (maybe dangling) commits may be a security risk - and checking whether a commit belongs to a ref is expensive. This may - change in the future when some caching is added to git (?) - Usually refs are either tags (refs/tags/*) or branches (refs/heads/*) - Cloning branches will make the hash check fail when there is an update. - But not all patches we want can be accessed by tags. - - The workaround is getting the last n commits so that it's likely that they - still contain the hash we want. - - for now : increase depth iteratively (TODO) - - real fix: ask git folks to add a - git fetch $HASH contained in $BRANCH - facility because checking that $HASH is contained in $BRANCH is less - expensive than fetching --depth $N. - Even if git folks implemented this feature soon it may take years until - server admins start using the new version? +/* + NOTE: + fetchgit has one problem: git fetch only works for refs. + This is because fetching arbitrary (maybe dangling) commits may be a security risk + and checking whether a commit belongs to a ref is expensive. This may + change in the future when some caching is added to git (?) + Usually refs are either tags (refs/tags/*) or branches (refs/heads/*) + Cloning branches will make the hash check fail when there is an update. + But not all patches we want can be accessed by tags. + + The workaround is getting the last n commits so that it's likely that they + still contain the hash we want. + + for now : increase depth iteratively (TODO) + + real fix: ask git folks to add a + git fetch $HASH contained in $BRANCH + facility because checking that $HASH is contained in $BRANCH is less + expensive than fetching --depth $N. + Even if git folks implemented this feature soon it may take years until + server admins start using the new version? */ assert deepClone -> leaveDotGit; @@ -57,38 +73,56 @@ if md5 != "" then else if hash != "" && sha256 != "" then throw "Only one of sha256 or hash can be set" else -stdenvNoCC.mkDerivation { - inherit name; - builder = ./builder.sh; - fetcher = ./nix-prefetch-git; # This must be a string to ensure it's called with bash. - - nativeBuildInputs = [ git ] - ++ lib.optionals fetchLFS [ git-lfs ]; - - outputHashAlgo = if hash != "" then null else "sha256"; - outputHashMode = "recursive"; - outputHash = if hash != "" then - hash - else if sha256 != "" then - sha256 - else - lib.fakeSha256; - - inherit url rev leaveDotGit fetchLFS fetchSubmodules deepClone branchName postFetch; - - postHook = if netrcPhase == null then null else '' - ${netrcPhase} - # required that git uses the netrc file - mv {,.}netrc - export HOME=$PWD - ''; - - GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt"; - - impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ netrcImpureEnvVars ++ [ - "GIT_PROXY_COMMAND" "NIX_GIT_SSL_CAINFO" "SOCKS_SERVER" - "ROBOTNIX_GIT_MIRRORS" - ]; - - inherit preferLocalBuild; -} + stdenvNoCC.mkDerivation { + inherit name; + builder = ./builder.sh; + fetcher = ./nix-prefetch-git; # This must be a string to ensure it's called with bash. + + nativeBuildInputs = [ git ] ++ lib.optionals fetchLFS [ git-lfs ]; + + outputHashAlgo = if hash != "" then null else "sha256"; + outputHashMode = "recursive"; + outputHash = + if hash != "" then + hash + else if sha256 != "" then + sha256 + else + lib.fakeSha256; + + inherit + url + rev + leaveDotGit + fetchLFS + fetchSubmodules + deepClone + branchName + postFetch + ; + + postHook = + if netrcPhase == null then + null + else + '' + ${netrcPhase} + # required that git uses the netrc file + mv {,.}netrc + export HOME=$PWD + ''; + + GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + + impureEnvVars = + lib.fetchers.proxyImpureEnvVars + ++ netrcImpureEnvVars + ++ [ + "GIT_PROXY_COMMAND" + "NIX_GIT_SSL_CAINFO" + "SOCKS_SERVER" + "ROBOTNIX_GIT_MIRRORS" + ]; + + inherit preferLocalBuild; + } diff --git a/pkgs/fetchgit/nix-prefetch-git.nix b/pkgs/fetchgit/nix-prefetch-git.nix index 37cb2f98..992b8ef6 100644 --- a/pkgs/fetchgit/nix-prefetch-git.nix +++ b/pkgs/fetchgit/nix-prefetch-git.nix @@ -1,4 +1,14 @@ -{ lib, stdenv, makeWrapper, gnused, nix, coreutils, findutils, gawk, git }: +{ + lib, + stdenv, + makeWrapper, + gnused, + nix, + coreutils, + findutils, + gawk, + git, +}: # Originally from nixpkgs/pkgs/tools/package-management/nix-prefetch-scripts stdenv.mkDerivation { @@ -11,7 +21,16 @@ stdenv.mkDerivation { installPhase = '' install -vD ${./nix-prefetch-git} $out/bin/nix-prefetch-git wrapProgram $out/bin/nix-prefetch-git \ - --prefix PATH : ${lib.makeBinPath [ coreutils findutils gawk git gnused nix ]} \ + --prefix PATH : ${ + lib.makeBinPath [ + coreutils + findutils + gawk + git + gnused + nix + ] + } \ --set HOME /homeless-shelter ''; diff --git a/pkgs/gitRepo/default.nix b/pkgs/gitRepo/default.nix index 0b57d244..e60acb3d 100644 --- a/pkgs/gitRepo/default.nix +++ b/pkgs/gitRepo/default.nix @@ -1,70 +1,90 @@ -{ lib, inputs, fetchFromGitHub, rsync, git, gnupg, less, openssh, ... }: +{ + lib, + inputs, + fetchFromGitHub, + rsync, + git, + gnupg, + less, + openssh, + ... +}: let inherit (inputs) nixpkgs-unstable; unstablePkgs = nixpkgs-unstable.legacyPackages.x86_64-linux; in - unstablePkgs.gitRepo.overrideAttrs(oldAttrs: rec { - version = "2.45"; - - src = fetchFromGitHub { - owner = "android"; - repo = "tools_repo"; - rev = "v${ version }"; - hash = "sha256-f765TcOHL8wdPa9qSmGegofjCXx1tF/K5bRQnYQcYVc="; - }; - - nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [ rsync git ]; - - repo2nixPatches = ./patches; - - # NOTE: why `git apply` instead of relying on `patches`? For some reason when - # using `patches` the source `rsync`ed into `var/repo` is missing those changes - installPhase = '' - runHook preInstall - - mkdir -p var/repo - rsync -a $src/ var/repo/ - - ( - export GIT_CONFIG_GLOBAL=$TMPDIR/.gitconfig - export GIT_CONFIG_NOSYSTEM=true - - cd var/repo - - git config --global --add safe.directory "$PWD" - git config --global user.email "nemo@nix" - git config --global user.name "Nemo Nix" - - chmod +w -R . - - git init - git add -A - git commit -m "Upstream sources" - - git am $repo2nixPatches/*.patch - - git log -n 1 --format="%H" > ../../COMMITED_REPO_REV - ) - - mkdir -p $out/var/repo - mkdir -p $out/bin - - rsync -a var/repo/ $out/var/repo/ - - # Copying instead of symlinking to the above directory is necessary, because otherwise - # running `repo init` fails, as I assume the script gets confused by being located in - # a git repo itself - cp repo $out/bin/repo - - runHook postInstall - ''; - - # Specify the patched checkout as the default version of repo - postFixup = '' - wrapProgram "$out/bin/repo" \ - --set REPO_URL "file://$out/var/repo" \ - --set REPO_REV "$(cat ./COMMITED_REPO_REV)" \ - --prefix PATH ":" "${ lib.makeBinPath [ git gnupg less openssh ] }" - ''; - }) +unstablePkgs.gitRepo.overrideAttrs (oldAttrs: rec { + version = "2.45"; + + src = fetchFromGitHub { + owner = "android"; + repo = "tools_repo"; + rev = "v${version}"; + hash = "sha256-f765TcOHL8wdPa9qSmGegofjCXx1tF/K5bRQnYQcYVc="; + }; + + nativeBuildInputs = (oldAttrs.nativeBuildInputs or [ ]) ++ [ + rsync + git + ]; + + repo2nixPatches = ./patches; + + # NOTE: why `git apply` instead of relying on `patches`? For some reason when + # using `patches` the source `rsync`ed into `var/repo` is missing those changes + installPhase = '' + runHook preInstall + + mkdir -p var/repo + rsync -a $src/ var/repo/ + + ( + export GIT_CONFIG_GLOBAL=$TMPDIR/.gitconfig + export GIT_CONFIG_NOSYSTEM=true + + cd var/repo + + git config --global --add safe.directory "$PWD" + git config --global user.email "nemo@nix" + git config --global user.name "Nemo Nix" + + chmod +w -R . + + git init + git add -A + git commit -m "Upstream sources" + + git am $repo2nixPatches/*.patch + + git log -n 1 --format="%H" > ../../COMMITED_REPO_REV + ) + + mkdir -p $out/var/repo + mkdir -p $out/bin + + rsync -a var/repo/ $out/var/repo/ + + # Copying instead of symlinking to the above directory is necessary, because otherwise + # running `repo init` fails, as I assume the script gets confused by being located in + # a git repo itself + cp repo $out/bin/repo + + runHook postInstall + ''; + + # Specify the patched checkout as the default version of repo + postFixup = '' + wrapProgram "$out/bin/repo" \ + --set REPO_URL "file://$out/var/repo" \ + --set REPO_REV "$(cat ./COMMITED_REPO_REV)" \ + --prefix PATH ":" "${ + lib.makeBinPath [ + git + gnupg + less + openssh + ] + }" + ''; +}) diff --git a/pkgs/overlay.nix b/pkgs/overlay.nix index d7db736d..3726dbc8 100644 --- a/pkgs/overlay.nix +++ b/pkgs/overlay.nix @@ -1,43 +1,59 @@ { inputs }: +let + inherit (inputs) nixpkgs-unstable; + + unstablePkgs = nixpkgs-unstable.legacyPackages.x86_64-linux; +in self: super: { - android-emulator = super.callPackage ./android-emulator {}; - - android-prepare-vendor = super.callPackage ./android-prepare-vendor {}; - - bundletool = super.callPackage ./bundletool {}; - - diffoscope = (super.diffoscope.overrideAttrs (attrs: rec { - patches = attrs.patches ++ [ - ./diffoscope/0001-comparators-android-Support-sparse-android-images.patch - ]; - pythonPath = attrs.pythonPath ++ [ super.simg2img super.zip ]; - doCheck = false; - doInstallCheck = false; - })).override { - python3Packages = super.python3Packages.override { - overrides = pythonSelf: pythonSuper: { - guestfs = pythonSuper.guestfs.override { libguestfs = super.libguestfs-with-appliance; }; + android-emulator = super.callPackage ./android-emulator { }; + + android-prepare-vendor = super.callPackage ./android-prepare-vendor { }; + + bundletool = super.callPackage ./bundletool { }; + + diffoscope = + (super.diffoscope.overrideAttrs (attrs: rec { + patches = attrs.patches ++ [ + ./diffoscope/0001-comparators-android-Support-sparse-android-images.patch + ]; + pythonPath = attrs.pythonPath ++ [ + super.simg2img + super.zip + ]; + doCheck = false; + doInstallCheck = false; + })).override + { + python3Packages = super.python3Packages.override { + overrides = pythonSelf: pythonSuper: { + guestfs = pythonSuper.guestfs.override { libguestfs = super.libguestfs-with-appliance; }; + }; + }; + binutils-unwrapped = super.pkgsCross.aarch64-multiplatform.buildPackages.binutils-unwrapped; + enableBloat = true; }; - }; - binutils-unwrapped = super.pkgsCross.aarch64-multiplatform.buildPackages.binutils-unwrapped; - enableBloat = true; - }; - cipd = super.callPackage ./cipd {}; - fetchcipd = super.callPackage ./cipd/fetchcipd.nix {}; + cipd = super.callPackage ./cipd { }; + fetchcipd = super.callPackage ./cipd/fetchcipd.nix { }; - fetchgerritpatchset = super.callPackage ./fetchgerritpatchset {}; + fetchgerritpatchset = super.callPackage ./fetchgerritpatchset { }; # TODO cleanup once fetchgit is overridable upstream - fetchgit = args: ((super.lib.makeOverridable super.fetchgit) args).overrideAttrs (old: { - impureEnvVars = old.impureEnvVars or [ ] ++ [ "ROBOTNIX_GIT_MIRRORS" ]; - }); - nix-prefetch-git = super.callPackage ./fetchgit/nix-prefetch-git.nix {}; + fetchgit = + args: + ((super.lib.makeOverridable super.fetchgit) args).overrideAttrs (old: { + impureEnvVars = old.impureEnvVars or [ ] ++ [ "ROBOTNIX_GIT_MIRRORS" ]; + }); + nix-prefetch-git = super.callPackage ./fetchgit/nix-prefetch-git.nix { }; gitRepo = super.callPackage ./gitRepo { inherit inputs; }; + nixfmt-rfc-style = unstablePkgs.nixfmt-rfc-style; + + treefmt2 = inputs.treefmt.packages.x86_64-linux.treefmt; + ### # Robotnix helper derivations - robotnix = super.callPackage ./robotnix {}; + robotnix = super.callPackage ./robotnix { }; } diff --git a/pkgs/robotnix/default.nix b/pkgs/robotnix/default.nix index 3c38cc77..b7c3fa50 100644 --- a/pkgs/robotnix/default.nix +++ b/pkgs/robotnix/default.nix @@ -1,92 +1,148 @@ # SPDX-FileCopyrightText: 2020 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ pkgs, lib, callPackage, runCommand, androidPkgs, makeWrapper, jre8_headless, openssl }: +{ + pkgs, + lib, + callPackage, + runCommand, + androidPkgs, + makeWrapper, + jre8_headless, + openssl, +}: let - unpack-images = callPackage ./unpack-images.nix {}; + unpack-images = callPackage ./unpack-images.nix { }; # Try to avoid using the derivations below, since they rely on "import-from-derivation" - apkFingerprint = apk: (import runCommand "apk-fingerprint" { nativeBuildInputs = [ jre8_headless ]; } '' - fingerprint=$(keytool -printcert -jarfile ${apk} | grep "SHA256:" | tr --delete ':' | cut --delimiter ' ' --fields 3) - echo "\"$fingerprint\"" > $out - ''); - - certFingerprint = cert: (import (runCommand "cert-fingerprint" {} '' - ${openssl}/bin/openssl x509 -noout -fingerprint -sha256 -in ${cert} | awk -F"=" '{print "\"" $2 "\"" }' | sed 's/://g' > $out - '')); + apkFingerprint = + apk: + (import runCommand "apk-fingerprint" { nativeBuildInputs = [ jre8_headless ]; } '' + fingerprint=$(keytool -printcert -jarfile ${apk} | grep "SHA256:" | tr --delete ':' | cut --delimiter ' ' --fields 3) + echo "\"$fingerprint\"" > $out + ''); + + certFingerprint = + cert: + (import ( + runCommand "cert-fingerprint" { } '' + ${openssl}/bin/openssl x509 -noout -fingerprint -sha256 -in ${cert} | awk -F"=" '{print "\"" $2 "\"" }' | sed 's/://g' > $out + '' + )); sha256Fingerprint = file: lib.toUpper (builtins.hashFile "sha256" file); # getName snippet originally from nixpkgs/pkgs/build-support/trivial-builders.nix - getName = fname: apk: - if lib.elem (builtins.typeOf apk) [ "path" "string" ] - then lib.removeSuffix ".apk" (builtins.baseNameOf apk) - else - if builtins.isAttrs apk && builtins.hasAttr "name" apk - then lib.removeSuffix ".apk" apk.name - else throw "${fname}: please supply a `name` argument because a default name can only be computed when the `apk` is a path or is an attribute set with a `name` attribute."; + getName = + fname: apk: + if + lib.elem (builtins.typeOf apk) [ + "path" + "string" + ] + then + lib.removeSuffix ".apk" (builtins.baseNameOf apk) + else if builtins.isAttrs apk && builtins.hasAttr "name" apk then + lib.removeSuffix ".apk" apk.name + else + throw "${fname}: please supply a `name` argument because a default name can only be computed when the `apk` is a path or is an attribute set with a `name` attribute."; build-tools = - (androidPkgs.sdk (p: with p; [ cmdline-tools-latest build-tools-31-0-0 ])) + (androidPkgs.sdk ( + p: with p; [ + cmdline-tools-latest + build-tools-31-0-0 + ] + )) + "/share/android-sdk/build-tools/31.0.0"; apksigner = runCommand "apksigner" { nativeBuildInputs = [ makeWrapper ]; } '' - mkdir -p $out/bin - makeWrapper "${jre8_headless}/bin/java" "$out/bin/apksigner" \ - --add-flags "-jar ${build-tools}/lib/apksigner.jar" - ''; + mkdir -p $out/bin + makeWrapper "${jre8_headless}/bin/java" "$out/bin/apksigner" \ + --add-flags "-jar ${build-tools}/lib/apksigner.jar" + ''; - signApk = { apk, keyPath, name ? (getName "signApk" apk) + "-signed.apk" }: runCommand name {} '' + signApk = + { + apk, + keyPath, + name ? (getName "signApk" apk) + "-signed.apk", + }: + runCommand name { } '' cp ${apk} $out ${apksigner}/bin/apksigner sign --key ${keyPath}.pk8 --cert ${keyPath}.x509.pem $out ''; # Currently only supports 1 signer. - verifyApk = { apk, sha256, name ? (getName "verifyApk" apk) + ".apk" }: runCommand name {} '' - sha256=$(${apksigner}/bin/apksigner verify --print-certs ${apk} | grep "^Signer #1 certificate SHA-256 digest: " | cut -d" " -f6 || exit 1) - - if [[ "$sha256" = "${sha256}" ]]; then - echo "${name} APK certificate digest matches ${sha256}" - ln -s ${apk} $out - else - echo "${name} APK certificate digest $sha256 is not ${sha256}" - exit 1 - fi - ''; + verifyApk = + { + apk, + sha256, + name ? (getName "verifyApk" apk) + ".apk", + }: + runCommand name { } '' + sha256=$(${apksigner}/bin/apksigner verify --print-certs ${apk} | grep "^Signer #1 certificate SHA-256 digest: " | cut -d" " -f6 || exit 1) + + if [[ "$sha256" = "${sha256}" ]]; then + echo "${name} APK certificate digest matches ${sha256}" + ln -s ${apk} $out + else + echo "${name} APK certificate digest $sha256 is not ${sha256}" + exit 1 + fi + ''; # Unpack and compare two images # Excludes known differences--also all of the APKs since signatures are different. TODO: Copy/replace sigs - compareImagesQuickDiff = a: b: pkgs.runCommand "images.diff" {} '' - ln -s ${pkgs.robotnix.unpackImg a} a - ln -s ${pkgs.robotnix.unpackImg b} b - - cat >excludes < $out || true - ''; + compareImagesQuickDiff = + a: b: + pkgs.runCommand "images.diff" { } '' + ln -s ${pkgs.robotnix.unpackImg a} a + ln -s ${pkgs.robotnix.unpackImg b} b + + cat >excludes < $out || true + ''; - compareImagesDiffoscope = a: b: pkgs.runCommand "images-diffoscope" { nativeBuildInputs = with pkgs; [ diffoscope pkgsCross.aarch64-multiplatform.buildPackages.binutils-unwrapped ]; } '' - mkdir -p $out - diffoscope \ - --html-dir $out \ - --tool-prefix-binutils aarch64-unknown-linux-gnu- \ - --exclude "**/META-INF/CERT.RSA" \ - --exclude-command "^xxd" \ - ${a} ${b} || true - ''; -in { + compareImagesDiffoscope = + a: b: + pkgs.runCommand "images-diffoscope" + { + nativeBuildInputs = with pkgs; [ + diffoscope + pkgsCross.aarch64-multiplatform.buildPackages.binutils-unwrapped + ]; + } + '' + mkdir -p $out + diffoscope \ + --html-dir $out \ + --tool-prefix-binutils aarch64-unknown-linux-gnu- \ + --exclude "**/META-INF/CERT.RSA" \ + --exclude-command "^xxd" \ + ${a} ${b} || true + ''; +in +{ inherit - build-tools apksigner signApk verifyApk - apkFingerprint certFingerprint sha256Fingerprint - compareImagesQuickDiff compareImagesDiffoscope; - - inherit (unpack-images) - unpackImg unpack_bootimg avbtool; + build-tools + apksigner + signApk + verifyApk + apkFingerprint + certFingerprint + sha256Fingerprint + compareImagesQuickDiff + compareImagesDiffoscope + ; + + inherit (unpack-images) unpackImg unpack_bootimg avbtool; } diff --git a/pkgs/robotnix/unpack-images.nix b/pkgs/robotnix/unpack-images.nix index 0e843ff1..7e3f9c10 100644 --- a/pkgs/robotnix/unpack-images.nix +++ b/pkgs/robotnix/unpack-images.nix @@ -1,4 +1,15 @@ -{ stdenv, fetchgit, runCommand, python3, libarchive, file, e2fsprogs, simg2img, lz4, cpio }: +{ + stdenv, + fetchgit, + runCommand, + python3, + libarchive, + file, + e2fsprogs, + simg2img, + lz4, + cpio, +}: let unpack_bootimg = stdenv.mkDerivation { pname = "unpack-bootimg"; @@ -36,13 +47,27 @@ let ''; }; - unpackImg = img: runCommand "unpacked-img" { - nativeBuildInputs = [ libarchive file e2fsprogs simg2img lz4 cpio unpack_bootimg avbtool ]; - } '' - mkdir -p $out - bash ${./unpack-images.sh} ${img} $out - ''; -in { + unpackImg = + img: + runCommand "unpacked-img" + { + nativeBuildInputs = [ + libarchive + file + e2fsprogs + simg2img + lz4 + cpio + unpack_bootimg + avbtool + ]; + } + '' + mkdir -p $out + bash ${./unpack-images.sh} ${img} $out + ''; +in +{ inherit unpackImg; inherit unpack_bootimg avbtool; diff --git a/pkgs/robotnix/unpack-images.sh b/pkgs/robotnix/unpack-images.sh index 10b943a2..d7027a92 100755 --- a/pkgs/robotnix/unpack-images.sh +++ b/pkgs/robotnix/unpack-images.sh @@ -7,45 +7,44 @@ out=$2 cd "$(mktemp -d)" -if [[ "$img" =~ -factory- ]]; then - bsdtar xvf "$img" --strip-components 1 - bsdtar xvf image-*.zip - rm image-*.zip +if [[ $img =~ -factory- ]]; then + bsdtar xvf "$img" --strip-components 1 + bsdtar xvf image-*.zip + rm image-*.zip else - bsdtar xvf "$img" + bsdtar xvf "$img" fi - for filename in *; do - cp "$filename" "$out" - if [[ "$filename" == *.img ]]; then - filetype=$(file "$filename") - part=''${filename%.img} + cp "$filename" "$out" + if [[ $filename == *.img ]]; then + filetype=$(file "$filename") + part=''${filename%.img} - case "$filetype" in - *"Android sparse image"*) - simg2img "$filename" "$part.raw" - mkdir "$out/$part" - debugfs "$part.raw" -R "rdump / $out/$part" - ;; - *"Android bootimg"*) - mkdir "$out/$part" - unpack_bootimg.py --boot_img "$filename" --out "$out/$part" | tee "$out/$part/info" - mkdir "$out/$part/ramdisk-ext" - bsdtar xf "$out/$part/ramdisk" -C "$out/$part/ramdisk-ext" - ;; - *) - if [[ $part == vendor_boot ]]; then - mkdir "$out/$part" - unpack_bootimg.py --boot_img "$filename" --out "$out/$part" | tee "$out/$part/info" - for filepath in "$out"/"$part"/vendor_ramdisk*; do - mkdir "$filepath-ext" - bsdtar xf "$filepath" -C "$filepath-ext" - done - elif [[ $part == vbmeta* ]]; then - avbtool.py info_image --image "$filename" --out "$out/$part-info" - fi - ;; - esac - fi + case "$filetype" in + *"Android sparse image"*) + simg2img "$filename" "$part.raw" + mkdir "$out/$part" + debugfs "$part.raw" -R "rdump / $out/$part" + ;; + *"Android bootimg"*) + mkdir "$out/$part" + unpack_bootimg.py --boot_img "$filename" --out "$out/$part" | tee "$out/$part/info" + mkdir "$out/$part/ramdisk-ext" + bsdtar xf "$out/$part/ramdisk" -C "$out/$part/ramdisk-ext" + ;; + *) + if [[ $part == vendor_boot ]]; then + mkdir "$out/$part" + unpack_bootimg.py --boot_img "$filename" --out "$out/$part" | tee "$out/$part/info" + for filepath in "$out"/"$part"/vendor_ramdisk*; do + mkdir "$filepath-ext" + bsdtar xf "$filepath" -C "$filepath-ext" + done + elif [[ $part == vbmeta* ]]; then + avbtool.py info_image --image "$filename" --out "$out/$part-info" + fi + ;; + esac + fi done diff --git a/release.nix b/release.nix index 45c27ae2..3fbeee03 100644 --- a/release.nix +++ b/release.nix @@ -1,34 +1,50 @@ # SPDX-FileCopyrightText: 2021 Daniel Fullmer and robotnix contributors # SPDX-License-Identifier: MIT -{ pkgs ? (import ./pkgs {}) }: +{ + pkgs ? (import ./pkgs { }), +}: let lib = pkgs.lib; robotnix = configuration: import ./default.nix { inherit configuration pkgs; }; configs = import ./configs.nix { inherit lib; }; builtConfigs = lib.mapAttrs (name: c: robotnix c) configs; - defaultBuild = robotnix { device="arm64"; flavor="vanilla"; }; + defaultBuild = robotnix { + device = "arm64"; + flavor = "vanilla"; + }; tests = { - attestation-server = (import ./nixos/attestation-server/test.nix { inherit pkgs; }) {}; + attestation-server = (import ./nixos/attestation-server/test.nix { inherit pkgs; }) { }; - generateKeys = let - inherit ((robotnix { device="crosshatch"; flavor="vanilla"; })) - generateKeysScript verifyKeysScript; - in pkgs.runCommand "test-generate-keys" { nativeBuildInputs = [ pkgs.shellcheck ]; } '' - mkdir -p $out - cd $out - shellcheck ${generateKeysScript} - shellcheck ${verifyKeysScript} + generateKeys = + let + inherit + ( + (robotnix { + device = "crosshatch"; + flavor = "vanilla"; + }) + ) + generateKeysScript + verifyKeysScript + ; + in + pkgs.runCommand "test-generate-keys" { nativeBuildInputs = [ pkgs.shellcheck ]; } '' + mkdir -p $out + cd $out + shellcheck ${generateKeysScript} + shellcheck ${verifyKeysScript} - ${verifyKeysScript} $PWD && exit 1 || true # verifyKeysScript should fail if we haven't generated keys yet - ${generateKeysScript} $PWD - ${verifyKeysScript} $PWD - ''; + ${verifyKeysScript} $PWD && exit 1 || true # verifyKeysScript should fail if we haven't generated keys yet + ${generateKeysScript} $PWD + ${verifyKeysScript} $PWD + ''; }; -in { +in +{ inherit (pkgs) diffoscope; imgs = lib.recurseIntoAttrs (lib.mapAttrs (name: c: c.img) builtConfigs); @@ -36,41 +52,86 @@ in { # For testing instantiation vanilla-arm64 = lib.recurseIntoAttrs { inherit (defaultBuild) - ota img factoryImg bootImg otaDir - releaseScript; + ota + img + factoryImg + bootImg + otaDir + releaseScript + ; }; sdk = import ./sdk; - grapheneos-emulator = (robotnix { device="x86_64"; flavor="grapheneos"; }).emulator; - vanilla-emulator = (robotnix { device="x86_64"; flavor="vanilla"; }).emulator; - vanilla-12-emulator = (robotnix { device="x86_64"; flavor="vanilla"; productNamePrefix="sdk_phone_"; androidVersion=12; }).emulator; - danielfullmer-emulator = (robotnix { device="x86_64"; flavor="grapheneos"; imports = [ ./example.nix ]; apps.auditor.enable = lib.mkForce false; }).emulator; + grapheneos-emulator = + (robotnix { + device = "x86_64"; + flavor = "grapheneos"; + }).emulator; + vanilla-emulator = + (robotnix { + device = "x86_64"; + flavor = "vanilla"; + }).emulator; + vanilla-12-emulator = + (robotnix { + device = "x86_64"; + flavor = "vanilla"; + productNamePrefix = "sdk_phone_"; + androidVersion = 12; + }).emulator; + danielfullmer-emulator = + (robotnix { + device = "x86_64"; + flavor = "grapheneos"; + imports = [ ./example.nix ]; + apps.auditor.enable = lib.mkForce false; + }).emulator; inherit tests; # Stuff to upload to binary cache cached = lib.recurseIntoAttrs { browsers = lib.recurseIntoAttrs { - inherit ((robotnix { device = "arm64"; flavor="vanilla"; }).config.build) - chromium; - inherit ((robotnix { device = "arm64"; flavor="vanilla"; apps.bromite.enable=true; webview.bromite.enable=true; }).config.build) - bromite; - inherit ((robotnix { device = "arm64"; flavor="grapheneos"; }).config.build) - vanadium; + inherit + ((robotnix { + device = "arm64"; + flavor = "vanilla"; + }).config.build + ) + chromium + ; + inherit + ((robotnix { + device = "arm64"; + flavor = "vanilla"; + apps.bromite.enable = true; + webview.bromite.enable = true; + }).config.build + ) + bromite + ; + inherit + ((robotnix { + device = "arm64"; + flavor = "grapheneos"; + }).config.build + ) + vanadium + ; }; kernels = lib.recurseIntoAttrs ( - (lib.mapAttrs (name: c: c.config.build.kernel) - (lib.filterAttrs (name: c: c.config.kernel.enable) builtConfigs))); + (lib.mapAttrs (name: c: c.config.build.kernel) ( + lib.filterAttrs (name: c: c.config.kernel.enable) builtConfigs + )) + ); tests = lib.recurseIntoAttrs { attestation-server = tests.attestation-server.test; inherit (tests) generateKeys; }; - packages = lib.recurseIntoAttrs { - inherit (pkgs) cipd; - }; + packages = lib.recurseIntoAttrs { inherit (pkgs) cipd; }; }; } diff --git a/scripts/mk_repo_file.py b/scripts/mk_repo_file.py index 4f12b619..007557b2 100755 --- a/scripts/mk_repo_file.py +++ b/scripts/mk_repo_file.py @@ -17,7 +17,13 @@ import tempfile from datetime import datetime -from robotnix_common import save, checkout_git, ls_remote, get_mirrored_url, check_free_space +from robotnix_common import ( + save, + checkout_git, + ls_remote, + get_mirrored_url, + check_free_space, +) REPO_FLAGS = [ "--quiet", @@ -52,35 +58,44 @@ class CachedInfo(TypedDict, total=False): tree: str -revInfo: Dict[Tuple[str, bool], CachedInfo] = {} # (rev, fetch_submodules) -> CachedInfo -treeInfo: Dict[Tuple[str, bool], CachedInfo] = {} # (treeHash, fetch_submodules) -> CachedInfo +revInfo: Dict[ + Tuple[str, bool], CachedInfo +] = {} # (rev, fetch_submodules) -> CachedInfo +treeInfo: Dict[ + Tuple[str, bool], CachedInfo +] = {} # (treeHash, fetch_submodules) -> CachedInfo def add_to_cache(p: ProjectInfoDict) -> None: - revIndex = (p['rev'], p.get('fetchSubmodules', False)) + revIndex = (p["rev"], p.get("fetchSubmodules", False)) cached_info: CachedInfo = revInfo.get(revIndex, {}) revInfo[revIndex] = cached_info - cached_info.update({'sha256': p['sha256']}) - if 'dateTime' in p: - cached_info.update({'dateTime': p['dateTime']}) - if 'tree' in p: - cached_info.update({'tree': p['tree']}) - treeInfo[p['tree'], p.get('fetchSubmodules', False)] = cast(CachedInfo, dict(cached_info)) - - -def make_repo_file(url: str, ref: str, - ref_type: ManifestRefType = ManifestRefType.TAG, - prev_data: Optional[Dict[str, ProjectInfoDict]] = None, - local_manifests: Optional[List[str]] = None, - override_project_revs: Optional[Dict[str, str]] = None, - project_fetch_submodules: Optional[List[str]] = None, - override_tag: Optional[str] = None, include_prefix: Optional[List[str]] = None, - exclude_path: Optional[List[str]] = None, - callback: Optional[Callable[[Any], Any]] = None, - jobs: int = 1, - ) -> Dict[str, ProjectInfoDict]: + cached_info.update({"sha256": p["sha256"]}) + if "dateTime" in p: + cached_info.update({"dateTime": p["dateTime"]}) + if "tree" in p: + cached_info.update({"tree": p["tree"]}) + treeInfo[p["tree"], p.get("fetchSubmodules", False)] = cast( + CachedInfo, dict(cached_info) + ) + + +def make_repo_file( + url: str, + ref: str, + ref_type: ManifestRefType = ManifestRefType.TAG, + prev_data: Optional[Dict[str, ProjectInfoDict]] = None, + local_manifests: Optional[List[str]] = None, + override_project_revs: Optional[Dict[str, str]] = None, + project_fetch_submodules: Optional[List[str]] = None, + override_tag: Optional[str] = None, + include_prefix: Optional[List[str]] = None, + exclude_path: Optional[List[str]] = None, + callback: Optional[Callable[[Any], Any]] = None, + jobs: int = 1, +) -> Dict[str, ProjectInfoDict]: if local_manifests is None: local_manifests = [] if override_project_revs is None: @@ -101,19 +116,31 @@ def make_repo_file(url: str, ref: str, print("Fetching information for %s %s" % (url, ref)) with tempfile.TemporaryDirectory() as tmpdir: - subprocess.check_call([ - 'repo', 'init', f'--manifest-url={url}', f'--manifest-branch=refs/{ref_type.value}/{ref}', *REPO_FLAGS - ], cwd=tmpdir, stdin=open('/dev/null')) # repo becomes non-interactive when a file is attached to stdin + subprocess.check_call( + [ + "repo", + "init", + f"--manifest-url={url}", + f"--manifest-branch=refs/{ref_type.value}/{ref}", + *REPO_FLAGS, + ], + cwd=tmpdir, + stdin=open("/dev/null"), + ) # repo becomes non-interactive when a file is attached to stdin local_manifests_dir = os.path.join(tmpdir, ".repo/local_manifests") os.makedirs(local_manifests_dir, exist_ok=True) for local_manifest in local_manifests: - shutil.copyfile(local_manifest, os.path.join(local_manifests_dir, os.path.basename(local_manifest))) + shutil.copyfile( + local_manifest, + os.path.join(local_manifests_dir, os.path.basename(local_manifest)), + ) json_text = subprocess.check_output( - ['repo', 'dumpjson'] - + (["--local-only"] if override_project_revs else []), - cwd=tmpdir).decode() + ["repo", "dumpjson"] + + (["--local-only"] if override_project_revs else []), + cwd=tmpdir, + ).decode() data = json.loads(json_text) if callback is not None: @@ -130,7 +157,9 @@ def process_item(item: Tuple[str, ProjectInfoDict]) -> None: relpath, p = item - if len(include_prefix) > 0 and (not any(relpath.startswith(p) for p in include_prefix)): + if len(include_prefix) > 0 and ( + not any(relpath.startswith(p) for p in include_prefix) + ): return if relpath in exclude_path: @@ -140,65 +169,77 @@ def process_item(item: Tuple[str, ProjectInfoDict]) -> None: # We have to iterate over the whole output since we don't save # the project name anymore, just the relpath, which isn't # exactly the project name - if p['url'].endswith(project): - p['rev'] = rev + if p["url"].endswith(project): + p["rev"] = rev if override_tag is not None: - p['revisionExpr'] = override_tag + p["revisionExpr"] = override_tag - if 'rev' not in p: - if re.match("[0-9a-f]{40}", p['revisionExpr']): + if "rev" not in p: + if re.match("[0-9a-f]{40}", p["revisionExpr"]): # Fill out rev if we already have the information available # Use revisionExpr if it is already a SHA1 hash - p['rev'] = p['revisionExpr'] + p["rev"] = p["revisionExpr"] else: # Otherwise, fetch this information from the git remote - remote_revs = ls_remote(p['url']) - if p['revisionExpr'] in remote_revs: - resolved_rev = p['revisionExpr'] - elif ('refs/tags/' + p['revisionExpr']) in remote_revs: - resolved_rev = 'refs/tags/' + p['revisionExpr'] - elif ('refs/heads/' + p['revisionExpr']) in remote_revs: - resolved_rev = 'refs/heads/' + p['revisionExpr'] + remote_revs = ls_remote(p["url"]) + if p["revisionExpr"] in remote_revs: + resolved_rev = p["revisionExpr"] + elif ("refs/tags/" + p["revisionExpr"]) in remote_revs: + resolved_rev = "refs/tags/" + p["revisionExpr"] + elif ("refs/heads/" + p["revisionExpr"]) in remote_revs: + resolved_rev = "refs/heads/" + p["revisionExpr"] else: raise Exception(f"{p['url']} is missing {p['revisionExpr']}") - p['rev'] = remote_revs[resolved_rev] + p["rev"] = remote_revs[resolved_rev] # TODO: Incorporate "sync-s" setting from upstream manifest if it exists fetch_submodules = relpath in project_fetch_submodules if fetch_submodules: - p['fetchSubmodules'] = True + p["fetchSubmodules"] = True - if 'sha256' not in p: - print("Fetching information for %s %s" % (p['url'], p['rev'])) + if "sha256" not in p: + print("Fetching information for %s %s" % (p["url"], p["rev"])) # Used cached copies if available - if (p['rev'], fetch_submodules) in revInfo: - p.update(cast(ProjectInfoDict, revInfo.get((p['rev'], fetch_submodules), {}))) + if (p["rev"], fetch_submodules) in revInfo: + p.update( + cast(ProjectInfoDict, revInfo.get((p["rev"], fetch_submodules), {})) + ) return - p_url = get_mirrored_url(p['url']) + p_url = get_mirrored_url(p["url"]) found_treehash = False - if p['url'] != p_url and p_url.startswith('/'): + if p["url"] != p_url and p_url.startswith("/"): # Get treehash if mirror is local - p['tree'] = subprocess.check_output( - ['git', 'log', '-1', '--pretty=%T', p['rev']], - cwd=p_url+'.git').decode().strip() - if (p['tree'], fetch_submodules) in treeInfo: - p.update(cast(ProjectInfoDict, treeInfo.get((p['tree'], fetch_submodules), {}))) + p["tree"] = ( + subprocess.check_output( + ["git", "log", "-1", "--pretty=%T", p["rev"]], + cwd=p_url + ".git", + ) + .decode() + .strip() + ) + if (p["tree"], fetch_submodules) in treeInfo: + p.update( + cast( + ProjectInfoDict, + treeInfo.get((p["tree"], fetch_submodules), {}), + ) + ) found_treehash = True if found_treehash: return # Fetch information. Use revisionExpr if it is a tag so we use the # tag in the name of the nix derivation instead of the revision - if p['revisionExpr'].startswith('refs/tags/'): - git_info = checkout_git(p_url, p['revisionExpr'], fetch_submodules) + if p["revisionExpr"].startswith("refs/tags/"): + git_info = checkout_git(p_url, p["revisionExpr"], fetch_submodules) else: - git_info = checkout_git(p_url, p['rev'], fetch_submodules) + git_info = checkout_git(p_url, p["rev"], fetch_submodules) - p['dateTime'] = int(datetime.fromisoformat(git_info['date']).timestamp()) - p['sha256'] = git_info['sha256'] + p["dateTime"] = int(datetime.fromisoformat(git_info["date"]).timestamp()) + p["sha256"] = git_info["sha256"] add_to_cache(p) @@ -218,12 +259,16 @@ def process_item(item: Tuple[str, ProjectInfoDict]) -> None: def read_cached_repo_json(path: str) -> None: for root, dirs, files in os.walk(path): for filename in files: - if filename.startswith('repo-') and filename.endswith('.json') or filename == 'repo.json': + if ( + filename.startswith("repo-") + and filename.endswith(".json") + or filename == "repo.json" + ): filepath = os.path.join(root, filename) print(f"Loading cached sha256s from {filepath}") data = json.load(open(filepath)) for name, p in data.items(): - if 'sha256' in p: + if "sha256" in p: add_to_cache(p) @@ -231,24 +276,63 @@ def main() -> None: check_free_space() parser = argparse.ArgumentParser() - parser.add_argument('--out', default=None, help="path to output file, defaults to repo-{rev}.json") - parser.add_argument('--ref-type', help="the kind of ref that is to be fetched", - choices=[t.name.lower() for t in ManifestRefType], default=ManifestRefType.TAG.name.lower()) - parser.add_argument('--resume', help="resume a previous download", action='store_true') - parser.add_argument('--local-manifest', help="path or URL to a .xml file to include in local_manifests", - action='append') - parser.add_argument('--cache-search-path', nargs='*', default=[], - help="path to search for any existing repo json files to use for cached sha256s") - parser.add_argument('--repo-prop', help="repo.prop file to use as source for project git revisions") - parser.add_argument('--override-tag', help="tag to fetch for subrepos, ignoring revisions from manifest") - parser.add_argument('--project-fetch-submodules', action="append", default=[], - help="fetch submodules for the specified project path") - parser.add_argument('--include-prefix', action="append", default=[], - help="only include paths if they start with the specified prefix") - parser.add_argument('--exclude-path', action="append", default=[], help="paths to exclude from fetching") - parser.add_argument('--jobs', '-j', default=multiprocessing.cpu_count(), type=int, help="number of concurrent jobs") - parser.add_argument('url', help="manifest URL") - parser.add_argument('ref', help="manifest ref") + parser.add_argument( + "--out", default=None, help="path to output file, defaults to repo-{rev}.json" + ) + parser.add_argument( + "--ref-type", + help="the kind of ref that is to be fetched", + choices=[t.name.lower() for t in ManifestRefType], + default=ManifestRefType.TAG.name.lower(), + ) + parser.add_argument( + "--resume", help="resume a previous download", action="store_true" + ) + parser.add_argument( + "--local-manifest", + help="path or URL to a .xml file to include in local_manifests", + action="append", + ) + parser.add_argument( + "--cache-search-path", + nargs="*", + default=[], + help="path to search for any existing repo json files to use for cached sha256s", + ) + parser.add_argument( + "--repo-prop", help="repo.prop file to use as source for project git revisions" + ) + parser.add_argument( + "--override-tag", + help="tag to fetch for subrepos, ignoring revisions from manifest", + ) + parser.add_argument( + "--project-fetch-submodules", + action="append", + default=[], + help="fetch submodules for the specified project path", + ) + parser.add_argument( + "--include-prefix", + action="append", + default=[], + help="only include paths if they start with the specified prefix", + ) + parser.add_argument( + "--exclude-path", + action="append", + default=[], + help="paths to exclude from fetching", + ) + parser.add_argument( + "--jobs", + "-j", + default=multiprocessing.cpu_count(), + type=int, + help="number of concurrent jobs", + ) + parser.add_argument("url", help="manifest URL") + parser.add_argument("ref", help="manifest ref") args = parser.parse_args() ref_type = ManifestRefType[args.ref_type.upper()] @@ -256,7 +340,7 @@ def main() -> None: # Extract project revisions from repo.prop override_project_revs = {} if args.repo_prop: - lines = open(args.repo_prop, 'r').read().split('\n') + lines = open(args.repo_prop, "r").read().split("\n") for line in lines: if line: project, rev = line.split() @@ -269,23 +353,27 @@ def main() -> None: if args.out is not None: filename = args.out else: - filename = f'repo-{args.ref}.json' + filename = f"repo-{args.ref}.json" if args.resume and os.path.exists(filename): prev_data = json.load(open(filename)) else: prev_data = None - make_repo_file(args.url, args.ref, ref_type, prev_data, - local_manifests=args.local_manifest, - override_project_revs=override_project_revs, - project_fetch_submodules=args.project_fetch_submodules, - override_tag=args.override_tag, - include_prefix=args.include_prefix, - exclude_path=args.exclude_path, - callback=lambda dirs: save(filename, dirs), - jobs=args.jobs, - ) + make_repo_file( + args.url, + args.ref, + ref_type, + prev_data, + local_manifests=args.local_manifest, + override_project_revs=override_project_revs, + project_fetch_submodules=args.project_fetch_submodules, + override_tag=args.override_tag, + include_prefix=args.include_prefix, + exclude_path=args.exclude_path, + callback=lambda dirs: save(filename, dirs), + jobs=args.jobs, + ) if __name__ == "__main__": diff --git a/scripts/robotnix_common.py b/scripts/robotnix_common.py index 8f612b41..fa5db2ad 100644 --- a/scripts/robotnix_common.py +++ b/scripts/robotnix_common.py @@ -10,12 +10,12 @@ from pathlib import Path -ROBOTNIX_GIT_MIRRORS = os.environ.get('ROBOTNIX_GIT_MIRRORS', '') +ROBOTNIX_GIT_MIRRORS = os.environ.get("ROBOTNIX_GIT_MIRRORS", "") if ROBOTNIX_GIT_MIRRORS: MIRRORS: Dict[str, str] = dict( - (mirror.split("=")[0], mirror.split("=")[1]) - for mirror in ROBOTNIX_GIT_MIRRORS.split('|') - ) + (mirror.split("=")[0], mirror.split("=")[1]) + for mirror in ROBOTNIX_GIT_MIRRORS.split("|") + ) else: MIRRORS = {} @@ -28,27 +28,36 @@ def get_mirrored_url(url: str) -> str: def save(filename: str, data: Any) -> None: - open(filename, 'w').write(json.dumps(data, sort_keys=True, indent=2, separators=(',', ': '))) + open(filename, "w").write( + json.dumps(data, sort_keys=True, indent=2, separators=(",", ": ")) + ) -def get_store_path(path): + +def get_store_path(path_str: str) -> str: """Get actual path to a Nix store path; supports handling local remotes""" - prefix = os.getenv("NIX_REMOTE") + prefix_str = os.getenv("NIX_REMOTE") - if not prefix: - return path + if not prefix_str: + return path_str - prefix = Path(prefix) + prefix = Path(prefix_str) if not prefix.is_absolute(): - raise Exception(f"Must be run on a local Nix store. Current Nix store: {prefix}") + raise Exception( + f"Must be run on a local Nix store. Current Nix store: {prefix}" + ) - path = Path(path).resolve() - remote_path = prefix.resolve().joinpath(path.relative_to(f"{path.drive}{path.root}")) + path = Path(path_str).resolve() + remote_path = prefix.resolve().joinpath( + path.relative_to(f"{path.drive}{path.root}") + ) return str(remote_path) + class GitCheckoutInfoDict(TypedDict): """Container for output from nix-prefetch-git""" + url: str rev: str date: str @@ -59,7 +68,9 @@ class GitCheckoutInfoDict(TypedDict): leaveDotGit: str -def checkout_git(url: str, rev: str, fetch_submodules: bool = False) -> GitCheckoutInfoDict: +def checkout_git( + url: str, rev: str, fetch_submodules: bool = False +) -> GitCheckoutInfoDict: print("Checking out %s %s" % (url, rev)) args = ["nix-prefetch-git", "--url", url, "--rev", rev] if fetch_submodules: @@ -70,19 +81,20 @@ def checkout_git(url: str, rev: str, fetch_submodules: bool = False) -> GitCheck def check_free_space() -> None: # nix-prefetch-git will check out under $TMPDIR (if it exists), or /tmp (otherwise) - path = os.environ['TMPDIR'] if 'TMPDIR' in os.environ else '/tmp' + path = os.environ["TMPDIR"] if "TMPDIR" in os.environ else "/tmp" st = os.statvfs(path) free_bytes = st.f_bavail * st.f_bsize desired_gb = 10 if free_bytes < (desired_gb * 1024**3): - print(f"WARNING: You have less than {desired_gb} GiB free under {path}.\n" + - f"This script might fail if a checked-out repository is larger than {desired_gb} GiB.\n" + - "Either free space at this location or set the TMPDIR environment variable " + - "to a path which has enough free space.", - file=sys.stderr - ) + print( + f"WARNING: You have less than {desired_gb} GiB free under {path}.\n" + + f"This script might fail if a checked-out repository is larger than {desired_gb} GiB.\n" + + "Either free space at this location or set the TMPDIR environment variable " + + "to a path which has enough free space.", + file=sys.stderr, + ) REMOTE_REFS: Dict[str, Dict[str, str]] = {} # url: { ref: rev } @@ -97,8 +109,8 @@ def ls_remote(url: str) -> Dict[str, str]: remote_info = subprocess.check_output(["git", "ls-remote", url]).decode() REMOTE_REFS[orig_url] = {} - for line in remote_info.split('\n'): + for line in remote_info.split("\n"): if line: - ref, rev = reversed(line.split('\t')) + ref, rev = reversed(line.split("\t")) REMOTE_REFS[orig_url][ref] = rev return REMOTE_REFS[orig_url] diff --git a/scripts/test_mk_repo_file.py b/scripts/test_mk_repo_file.py index f08d9b46..7aa7c92c 100644 --- a/scripts/test_mk_repo_file.py +++ b/scripts/test_mk_repo_file.py @@ -13,13 +13,17 @@ import mk_repo_file -def git_create(directory: str, tag: Optional[str] = "release", initial_branch: str = "main") -> None: +def git_create( + directory: str, tag: Optional[str] = "release", initial_branch: str = "main" +) -> None: """Turn a directory into a git repo""" cwd = os.getcwd() os.chdir(directory) subprocess.check_call(["git", "init", f"--initial-branch={initial_branch}"]) subprocess.check_call(["git", "config", "--local", "user.name", "testenv"]) - subprocess.check_call(["git", "config", "--local", "user.email", "testenv@example.com"]) + subprocess.check_call( + ["git", "config", "--local", "user.email", "testenv@example.com"] + ) subprocess.check_call(["git", "add", "."]) subprocess.check_call(["git", "commit", "-m", "Initial Commit"]) if tag is not None: @@ -32,15 +36,14 @@ def manifest_repo(tmpdir: Any) -> Any: repo_top = tmpdir.mkdir("repo") manifest_repo = repo_top.mkdir("manifest") - MANIFEST = \ - ''' + MANIFEST = """ - ''' + """ (manifest_repo / "default.xml").write(MANIFEST) git_create(manifest_repo) @@ -59,37 +62,45 @@ def test_basic(tmpdir: Any, manifest_repo: Any) -> None: os.chdir(tmpdir.mkdir("checkout")) # TODO: Each invocation of this downloads a remote git repo to fetch the "repo" tool data = mk_repo_file.make_repo_file(manifest_repo, "release") - assert 'a' in data - assert 'rev' in data['a'] - assert 'sha256' in data['a'] - assert 'url' in data['a'] - assert 'b' in data - assert 'sha256' in data['b'] + assert "a" in data + assert "rev" in data["a"] + assert "sha256" in data["a"] + assert "url" in data["a"] + assert "b" in data + assert "sha256" in data["b"] # Removing just one sha256 and resuming - del data['b']['sha256'] - with patch('mk_repo_file.ls_remote') as ls_remote: - ls_remote.side_effect = Exception('Called ls-remote') + del data["b"]["sha256"] + with patch("mk_repo_file.ls_remote") as ls_remote: + ls_remote.side_effect = Exception("Called ls-remote") data = mk_repo_file.make_repo_file(manifest_repo, "release", prev_data=data) - assert 'sha256' in data['b'] + assert "sha256" in data["b"] def test_read_cached_repo_json(tmpdir: Any) -> None: top = tmpdir.mkdir("repo") - top.mkdir('test_subdir') - repo_test_filename = top / 'test_subdir' / 'repo-test.json' + top.mkdir("test_subdir") + repo_test_filename = top / "test_subdir" / "repo-test.json" repo_file_contents = { - 'a': { - 'rev': 'foo', - 'tree': 'foo2', - 'dateTime': 1, - 'sha256': 'bar', - 'fetchSubmodules': True, + "a": { + "rev": "foo", + "tree": "foo2", + "dateTime": 1, + "sha256": "bar", + "fetchSubmodules": True, }, } repo_test_filename.write(json.dumps(repo_file_contents)) mk_repo_file.read_cached_repo_json(top) - assert mk_repo_file.revInfo['foo', True] == {'sha256': 'bar', 'tree': 'foo2', 'dateTime': 1} - assert mk_repo_file.treeInfo['foo2', True] == {'sha256': 'bar', 'tree': 'foo2', 'dateTime': 1} + assert mk_repo_file.revInfo["foo", True] == { + "sha256": "bar", + "tree": "foo2", + "dateTime": 1, + } + assert mk_repo_file.treeInfo["foo2", True] == { + "sha256": "bar", + "tree": "foo2", + "dateTime": 1, + } diff --git a/sdk/adb.nix b/sdk/adb.nix index 46d6f43c..b90209ac 100644 --- a/sdk/adb.nix +++ b/sdk/adb.nix @@ -2,25 +2,30 @@ # SPDX-License-Identifier: MIT let - pkgs = import ../pkgs {}; - adb = (import ../default.nix { - configuration = { - productName = "sdk"; - variant = "eng"; - source.dirs = builtins.fromJSON (builtins.readFile ./repo-platform-tools-30.0.0.json); - }; - }).build.mkAndroid { - name = "adb"; - makeTargets = [ "adb" "fastboot" ]; - installPhase = '' - mkdir -p $out - cp out/host/linux-x86/bin/{adb,fastboot} $out/ - ''; - }; + pkgs = import ../pkgs { }; + adb = + (import ../default.nix { + configuration = { + productName = "sdk"; + variant = "eng"; + source.dirs = builtins.fromJSON (builtins.readFile ./repo-platform-tools-30.0.0.json); + }; + }).build.mkAndroid + { + name = "adb"; + makeTargets = [ + "adb" + "fastboot" + ]; + installPhase = '' + mkdir -p $out + cp out/host/linux-x86/bin/{adb,fastboot} $out/ + ''; + }; in - pkgs.runCommandCC "adb" { nativeBuildInputs = [ pkgs.autoPatchelfHook ]; } '' - mkdir -p $out/bin - cp ${adb}/* $out/bin/ - chmod u+w $out/bin/* - autoPatchelf $out/bin/* - '' +pkgs.runCommandCC "adb" { nativeBuildInputs = [ pkgs.autoPatchelfHook ]; } '' + mkdir -p $out/bin + cp ${adb}/* $out/bin/ + chmod u+w $out/bin/* + autoPatchelf $out/bin/* +'' diff --git a/sdk/default.nix b/sdk/default.nix index 77c952aa..b33cc71c 100644 --- a/sdk/default.nix +++ b/sdk/default.nix @@ -6,18 +6,24 @@ productName = "sdk"; # Alternatives are sdk_arm64, sdk_x86_64, sdk_x86 variant = "eng"; # TODO: Find out what tag the upstream SDK was built with - source.dirs = builtins.fromJSON (builtins.readFile ../flavors/vanilla/10/repo-android-10.0.0_r41.json); + source.dirs = builtins.fromJSON ( + builtins.readFile ../flavors/vanilla/10/repo-android-10.0.0_r41.json + ); buildNumber = "eng.10.0.0_r41"; androidVersion = 10; }; -}).config.build.mkAndroid { - name = "android-sdk"; - makeTargets = [ "sdk" "sdk_repo" ]; - installPhase = '' - mkdir -p $out - cp --reflink=auto out/host/linux-x86/sdk/sdk/*.{zip,xml} $out - ''; -} +}).config.build.mkAndroid + { + name = "android-sdk"; + makeTargets = [ + "sdk" + "sdk_repo" + ]; + installPhase = '' + mkdir -p $out + cp --reflink=auto out/host/linux-x86/sdk/sdk/*.{zip,xml} $out + ''; + } ## TODO: Unify with checkAndroid above #checkSdk = mkAndroid { diff --git a/shell.nix b/shell.nix index 80b0871c..cc38ecb6 100644 --- a/shell.nix +++ b/shell.nix @@ -1,2 +1,4 @@ -{ system ? builtins.currentSystem }: - (import ./flake/compat.nix { inherit system; }).shellNix +{ + system ? builtins.currentSystem, +}: +(import ./flake/compat.nix { inherit system; }).shellNix diff --git a/template/flake.nix b/template/flake.nix index 3009f0c0..343f969b 100644 --- a/template/flake.nix +++ b/template/flake.nix @@ -3,29 +3,34 @@ inputs.robotnix.url = "github:danielfullmer/robotnix"; - outputs = { self, robotnix }: { - # "dailydriver" is an arbitrary user-chosen name for this particular - # configuration. Change it to something meaningful for you, perhaps just - # the device name if you only have one of this kind of device. - robotnixConfigurations."dailydriver" = robotnix.lib.robotnixSystem ({ config, pkgs, ... }: { - # These two are required options - device = "crosshatch"; - flavor = "vanilla"; # "grapheneos" is another option + outputs = + { self, robotnix }: + { + # "dailydriver" is an arbitrary user-chosen name for this particular + # configuration. Change it to something meaningful for you, perhaps just + # the device name if you only have one of this kind of device. + robotnixConfigurations."dailydriver" = robotnix.lib.robotnixSystem ( + { config, pkgs, ... }: + { + # These two are required options + device = "crosshatch"; + flavor = "vanilla"; # "grapheneos" is another option - # buildDateTime is set by default by the flavor, and is updated when those flavors have new releases. - # If you make new changes to your build that you want to be pushed by the OTA updater, you should set this yourself. - # buildDateTime = 1584398664; # Use `date "+%s"` to get the current time + # buildDateTime is set by default by the flavor, and is updated when those flavors have new releases. + # If you make new changes to your build that you want to be pushed by the OTA updater, you should set this yourself. + # buildDateTime = 1584398664; # Use `date "+%s"` to get the current time - # signing.enable = true; - # signing.keyStorePath = "/var/secrets/android-keys"; # A _string_ of the path for the key store. + # signing.enable = true; + # signing.keyStorePath = "/var/secrets/android-keys"; # A _string_ of the path for the key store. - # Build with ccache - # ccache.enable = true; - }); + # Build with ccache + # ccache.enable = true; + } + ); - # This provides a convenient output which allows you to build the image by - # simply running "nix build" on this flake. - # Build other outputs with (for example): "nix build .#robotnixConfigurations.dailydriver.ota" - defaultPackage.x86_64-linux = self.robotnixConfigurations."dailydriver".img; - }; + # This provides a convenient output which allows you to build the image by + # simply running "nix build" on this flake. + # Build other outputs with (for example): "nix build .#robotnixConfigurations.dailydriver.ota" + defaultPackage.x86_64-linux = self.robotnixConfigurations."dailydriver".img; + }; } diff --git a/tests/eval.nix b/tests/eval.nix index effe2f9f..5aa7e320 100644 --- a/tests/eval.nix +++ b/tests/eval.nix @@ -3,21 +3,27 @@ # if the resulting list is empty, all tests passed let - pkgs = import ../pkgs {}; + pkgs = import ../pkgs { }; lib = pkgs.lib; robotnixSystem = configuration: import ../default.nix { inherit configuration pkgs; }; in lib.runTests { testSourceMountPoints = { - expr = let - dirs = [ "a" "a/b" "a/c" "b/d" "b/e" ]; - in - lib.filterAttrs (n: v: lib.elem n dirs) - ((lib.mapAttrs (name: dir: dir.postPatch)) - (robotnixSystem { - source.dirs = lib.genAttrs dirs (dir: {}); - }).config.source.dirs); + expr = + let + dirs = [ + "a" + "a/b" + "a/c" + "b/d" + "b/e" + ]; + in + lib.filterAttrs (n: v: lib.elem n dirs) ( + (lib.mapAttrs (name: dir: dir.postPatch)) + (robotnixSystem { source.dirs = lib.genAttrs dirs (dir: { }); }).config.source.dirs + ); expected = { "a" = '' mkdir -p b diff --git a/treefmt.nix b/treefmt.nix new file mode 100644 index 00000000..7a6f60e4 --- /dev/null +++ b/treefmt.nix @@ -0,0 +1,110 @@ +{ + config, + pkgs, + lib, + ... +}: +{ + # Additional options + options = { + # Workaround for `config.build.programs` not evaluating properly + # to get all formatter binaries into a devShell + programs.mypy.package = lib.mkPackageOption pkgs [ + "python3Packages" + "mypy" + ] { }; + + # GHA linting options + programs.actionlint = { + enable = lib.mkEnableOption "actionlint"; + package = lib.mkPackageOption pkgs "actionlint" { }; + }; + }; + + config = { + projectRootFile = "flake.nix"; + + package = pkgs.treefmt2; + + programs = { + nixpkgs-fmt.enable = true; + nixpkgs-fmt.package = pkgs.nixfmt-rfc-style; + + mypy.enable = true; + mypy.package = pkgs.python3.withPackages ( + ps: with ps; [ + mypy + pytest + ] + ); + mypy.directories = { + "." = { + # Fot whatever reason using `settings.formatter.mypy.excludes` does not work properly + options = lib.cli.toGNUCommandLine { } { + exclude = [ + "apks/chromium" + "result" + ]; + }; + # Has to be set again, because treefmt clears PYTHONPATH and running via `treefmt` fails, see: + # https://github.com/numtide/treefmt-nix/blob/main/programs/mypy.nix#L67 + extraPythonPackages = [ pkgs.python3Packages.pytest ]; + }; + }; + + # Drop–in flake8 replacement + ruff.format = true; + ruff.check = true; + + shfmt.enable = true; + + shellcheck.enable = true; + + actionlint.enable = true; + }; + + settings = { + # We don't lint those files + global.excludes = [ + "*.patch" + "*.json" + "modules/apps/updater-sepolicy/**" + "docs/**" + "LICENSES/**" + # trivial and possibly replaceable with another `unshare` call nowadays + "modules/fakeuser/fakeuser.c" + "modules/fakeuser/meson.build" + # mirror of nixpkgs upstream + "pkgs/fetchgit/nix-prefetch-git" + "flavors/lineageos/lastUpdated.epoch" + "NEWS.md" + "README.md" + ".flake8" + ".gitignore" + "mypy.ini" + "flake.lock" + "treefmt.toml" + "apks/chromium/*.py" + ]; + + formatter = { + shellcheck.includes = lib.mkForce [ + "flavors/**/*.sh" + "modules/pixel/update.sh" + "scripts/patchelf-prefix.sh" + "pkgs/robotnix/unpack-images.sh" + ]; + + # GHA linting implementation + # Needs the go implementation to work properly due to the hidden files issue + actionlint = lib.mkIf config.programs.actionlint.enable { + command = config.programs.actionlint.package; + includes = [ + ".github/workflows/*.yml" + "./github/workflows/*.yml" + ]; + }; + }; + }; + }; +}