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}${type}>'';
- in if lib.isAttrs value then
+ resourceXML =
+ name: value:
+ let
+ resourceXMLEntity =
+ name: value: type:
+ ''<${type} name="${name}">${resourceValueXML value type}${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"
+ ];
+ };
+ };
+ };
+ };
+}