summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--pkgs/development/compilers/flutter/engine-artifacts/default.nix127
-rw-r--r--pkgs/development/compilers/flutter/engine-artifacts/hashes.nix144
-rw-r--r--pkgs/development/compilers/flutter/flutter.nix99
3 files changed, 350 insertions, 20 deletions
diff --git a/pkgs/development/compilers/flutter/engine-artifacts/default.nix b/pkgs/development/compilers/flutter/engine-artifacts/default.nix
new file mode 100644
index 0000000000000..30ef16bbeca98
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine-artifacts/default.nix
@@ -0,0 +1,127 @@
+{ lib
+, stdenv
+, hostPlatform
+, engineVersion
+, fetchzip
+, autoPatchelfHook
+
+, gtk3
+}:
+
+let
+  hashes = (import ./hashes.nix).${engineVersion};
+
+  artifacts =
+    {
+      common = {
+        flutter_patched_sdk = { archive = "flutter_patched_sdk.zip"; };
+        flutter_patched_sdk_product = { archive = "flutter_patched_sdk_product.zip"; };
+      };
+      platform = {
+        android =
+          (lib.genAttrs
+            [ "arm" "arm64" "x64" ]
+            (arch:
+              {
+                base = [
+                  { archive = "artifacts.zip"; }
+                ];
+                variants = lib.genAttrs [ "profile" "release" ]
+                  (variant: [
+                    { archive = "artifacts.zip"; }
+                    { archive = "${lib.toLower hostPlatform.uname.system}-x64.zip"; }
+                  ]);
+              })) //
+          {
+            "x86" = {
+              base = [
+                { archive = "artifacts.zip"; }
+              ];
+              variants.jit-release = [
+                { archive = "artifacts.zip"; }
+              ];
+            };
+          };
+
+        linux = lib.genAttrs
+          [ "arm64" "x64" ]
+          (arch:
+            let
+              linux-flutter-gtk = {
+                archive = "linux-${arch}-flutter-gtk.zip";
+                buildInputs = [ gtk3 ];
+              };
+            in
+            {
+              base = [
+                ({ archive = "artifacts.zip"; } // lib.optionalAttrs (arch == "arm64") {
+                  # For some reason, the arm64 artifacts are missing shader code.
+                  postPatch = ''
+                    if [ -d shader_lib ]; then
+                      The shader_lib directory has been included in the artifact archive.
+                      This patch should be removed.
+                    fi
+                    ln -s ${lib.findSingle
+                      (pkg: lib.getName pkg == "flutter-artifact-linux-x64-artifacts")
+                      (throw "Could not find the x64 artifact archive.")
+                      (throw "Could not find the correct x64 artifact archive.")
+                      artifactDerivations.platform.linux.x64.base
+                    }/shader_lib .
+                  '';
+                })
+                { archive = "font-subset.zip"; }
+                linux-flutter-gtk
+              ];
+              variants = lib.genAttrs [ "debug" "profile" "release" ] (variant: [
+                linux-flutter-gtk
+              ]);
+            });
+      };
+    };
+
+  mkArtifactDerivation = { platform ? null, variant ? null, archive, ... }@args:
+    let
+      artifactDirectory = if platform == null then null else "${platform}${lib.optionalString (variant != null) "-${variant}"}";
+      archiveBasename = lib.removeSuffix ".${(lib.last (lib.splitString "." archive))}" archive;
+    in
+    stdenv.mkDerivation ({
+      pname = "flutter-artifact${lib.optionalString (platform != null) "-${artifactDirectory}"}-${archiveBasename}";
+      version = engineVersion;
+
+      src = fetchzip {
+        url = "https://storage.googleapis.com/flutter_infra_release/flutter/${engineVersion}${lib.optionalString (platform != null) "/${artifactDirectory}"}/${archive}";
+        stripRoot = false;
+        hash = (if artifactDirectory == null then hashes else hashes.${artifactDirectory}).${archive};
+      };
+
+      nativeBuildInputs = [ autoPatchelfHook ];
+
+      installPhase = "cp -r . $out";
+    } // args);
+
+  artifactDerivations = {
+    common = builtins.mapAttrs (name: mkArtifactDerivation) artifacts.common;
+    platform =
+      builtins.mapAttrs
+        (os: architectures:
+          builtins.mapAttrs
+            (architecture: variants: {
+              base = map
+                (args: mkArtifactDerivation ({
+                  platform = "${os}-${architecture}";
+                } // args))
+                variants.base;
+              variants = builtins.mapAttrs
+                (variant: variantArtifacts: map
+                  (args: mkArtifactDerivation ({
+                    platform = "${os}-${architecture}";
+                    inherit variant;
+                  } // args))
+                  variantArtifacts)
+                variants.variants;
+            })
+            architectures)
+        artifacts.platform;
+  };
+in
+artifactDerivations
diff --git a/pkgs/development/compilers/flutter/engine-artifacts/hashes.nix b/pkgs/development/compilers/flutter/engine-artifacts/hashes.nix
new file mode 100644
index 0000000000000..e3453748b0538
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine-artifacts/hashes.nix
@@ -0,0 +1,144 @@
+{
+  "1a65d409c7a1438a34d21b60bf30a6fd5db59314" = {
+    "flutter_patched_sdk.zip" = "sha256-Pvsjttm5OwpJ/pW4UQXvvEiJYCM5CoZZfVXz5jef37k=";
+    "flutter_patched_sdk_product.zip" = "sha256-fhj2uUOrLwrzHrM6RNVpPNize5Qu6mLQDcSzLT2TbRA=";
+    "android-arm" = {
+      "artifacts.zip" = "sha256-KDMiI6SQoZHfFV5LJJZ7VOGyEKC4UxzRc777j4BbXgM=";
+    };
+    "android-arm-profile" = {
+      "artifacts.zip" = "sha256-MErLoGJWXg4yJ6b6c5bqP8Nat6O7eYSfM71mMNAAQf4=";
+      "linux-x64.zip" = "sha256-0TZQ05HR7NRqHzeoHZ/sOrjKiSvCpMUH85YXXzV4URg=";
+    };
+    "android-arm-release" = {
+      "artifacts.zip" = "sha256-hU4S4FOqUGokByZ47nzOqQ4A9QFshruqrpJvJUBHUho=";
+      "linux-x64.zip" = "sha256-AqNlqjOht+c2sdW5ReoF66ZJWJl1W4vGKbQ3YyderRY=";
+    };
+    "android-arm64" = {
+      "artifacts.zip" = "sha256-ApNg3Uu9gyGNsx7sdpTCz1yADVAI5ZuNHgvgiuH9IpQ=";
+    };
+    "android-arm64-profile" = {
+      "artifacts.zip" = "sha256-D/8+WKPIkOaV3PwkCHiJROFlokm4lWWmtPQb93Yqwr0=";
+      "linux-x64.zip" = "sha256-S0RHLov6/C22VvGdvZV87Ybaxun8YBrw1gTgNklRcM0=";
+    };
+    "android-arm64-release" = {
+      "artifacts.zip" = "sha256-OoYqHtwmT+VWJ+G+sMXM5+ux3h1Fnyo9Vj2za9cm5eE=";
+      "linux-x64.zip" = "sha256-NuXclg1a+Ofw5AWJ1tajpn2jYEZw6DluWxrFVL8rPfg=";
+    };
+    "android-x86" = {
+      "artifacts.zip" = "sha256-nN66nIrcbJHq2S4oIT5e2NCv7mS5Kw+HBv3ReHs+d3Y=";
+    };
+    "android-x86-jit-release" = {
+      "artifacts.zip" = "sha256-A8F6K78Ykp1rMsUmjD7B9nFFPAubZnqAqgWSzbNCRwk=";
+    };
+    "android-x64" = {
+      "artifacts.zip" = "sha256-hrBvnzCj/24h5kat96avlgXi6WhMsos5aPlkgxOYo8Q=";
+    };
+    "android-x64-profile" = {
+      "artifacts.zip" = "sha256-xzSj/2ah9aQoosaNGkSWFP3bMNJqRSFc0+78XEBHwzM=";
+      "linux-x64.zip" = "sha256-HfBiz1JWlBQ8KEfmf8uDlVzFlDt3+VF2VeY82tsMjHs=";
+    };
+    "android-x64-release" = {
+      "artifacts.zip" = "sha256-TcfMeA+8Uf9yRrYdEIsjip0cKmSUm2Ow1tkoE9803XY=";
+      "linux-x64.zip" = "sha256-D6efb6pj9+xjPnJu3O+ZCmwfatBzasuFZEFRntAiU9U=";
+    };
+    "linux-arm64" = {
+      "artifacts.zip" = "sha256-xyKVaEFb5gVkVrPzDrOql5BmXGO0FnCSeXOoQ10ZFrw=";
+      "font-subset.zip" = "sha256-Ulwb6q2SzB4suMJhAM3zAwWOzlEImlu9Ha+w5u4QqIU=";
+      "linux-arm64-flutter-gtk.zip" = "sha256-SiYOH++py4zeoD3BkNayqy/C9Zz9OiYQ5+u+pDLIpWg=";
+    };
+    "linux-arm64-debug" = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-SiYOH++py4zeoD3BkNayqy/C9Zz9OiYQ5+u+pDLIpWg=";
+    };
+    "linux-arm64-profile" = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-xB0eqrBYD7vhOwYUgJwNaBftNZJgdwxA9AUpEfX0iFs=";
+    };
+    "linux-arm64-release" = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-aHLKV129WIRsLUG6xTMwCKB4eXD3jonqinjI8KSsOus=";
+    };
+    "linux-x64" = {
+      "artifacts.zip" = "sha256-+zIABFXUpiqn3OMoLcU4NDLxZ1y9z0r46iCTNRHAkz8=";
+      "font-subset.zip" = "sha256-W4SRPvA4rraVqN1ehbY6MFL7ZIWDHVJhjlLtxyUJJKY=";
+      "linux-x64-flutter-gtk.zip" = "sha256-boICnuJF4zqGb7kaN5haO/df9hC9KeJidt3uIK06S7M=";
+    };
+    "linux-x64-debug" = {
+      "linux-x64-flutter-gtk.zip" = "sha256-boICnuJF4zqGb7kaN5haO/df9hC9KeJidt3uIK06S7M=";
+    };
+    "linux-x64-profile" = {
+      "linux-x64-flutter-gtk.zip" = "sha256-RAsgupVF18IxLaP8tJ7XRQ8y/um46nlpA8fDITPwLqY=";
+    };
+    "linux-x64-release" = {
+      "linux-x64-flutter-gtk.zip" = "sha256-RAsgupVF18IxLaP8tJ7XRQ8y/um46nlpA8fDITPwLqY=";
+    };
+  };
+  "57d3bac3dd5cb5b0e464ab70e7bc8a0d8cf083ab" = {
+    "flutter_patched_sdk.zip" = "sha256-A/y5Y+Aw0CUhXABbdyQcGCSnSbO7Ask+71m8LZDSjH4=";
+    "flutter_patched_sdk_product.zip" = "sha256-VPxF4NrTUhFbpztyPnLEiC9Cy0kDDbYvy21kA5ES4HM=";
+    "android-arm" = {
+      "artifacts.zip" = "sha256-3igOO+rgFh0fNTIIiiucqSmqC+NKFPG5H1CnIa9bDcM=";
+    };
+    "android-arm-profile" = {
+      "artifacts.zip" = "sha256-qai254LNrQXJBsaoQgXao6mBpzzcYHh4sUESurSyxNA=";
+      "linux-x64.zip" = "sha256-hBkntf1fX5w752ly6lVUHm6wEM/4ep9guJGma3SKjxU=";
+    };
+    "android-arm-release" = {
+      "artifacts.zip" = "sha256-7yuXIJyErb1PZyk56+TtlJY0o1EOwmdAvpVfGGAteuA=";
+      "linux-x64.zip" = "sha256-v/jBnE662XOX/fOhYbve7ZiQwVu0haIMOD532Vdj9Yw=";
+    };
+    "android-arm64" = {
+      "artifacts.zip" = "sha256-Llxu8+SkYEtnoiMf01rffPpF/AjrlV+QPuAW850oMzo=";
+    };
+    "android-arm64-profile" = {
+      "artifacts.zip" = "sha256-su4U80supv8Q+2kE/5FTybiA5NFbKNMHqdB0NHCqrVI=";
+      "linux-x64.zip" = "sha256-yGt0SztNxYHDwZ1DwzLg5REE8rmMRKNn7GfCQ+GEHBw=";
+    };
+    "android-arm64-release" = {
+      "artifacts.zip" = "sha256-+p1+SXSEglR3jqWc/jKgmtR9nOGgMRGC+anoTs1kRc8=";
+      "linux-x64.zip" = "sha256-5UiG5gxOso8NO+7nkb6bjxW8e/Tr7mlvPRUagSRTCNs=";
+    };
+    "android-x86" = {
+      "artifacts.zip" = "sha256-Cbo17VYWaclyO1RLHkwjbqoFVZ283IgGdN0uDdiWvQs=";
+    };
+    "android-x86-jit-release" = {
+      "artifacts.zip" = "sha256-gSPm2tClTj2vEYtGKgobD/mebWLNlDp8nEoFX0rhEOk=";
+    };
+    "android-x64" = {
+      "artifacts.zip" = "sha256-PVb1aKMMTlDT41O2MZRAUjCq8h+m/s2h5qOnEFPd77w=";
+    };
+    "android-x64-profile" = {
+      "artifacts.zip" = "sha256-gZSSRCDy42AMLMiu/KH7YsDuFVaxRcoyXzUgV8V025Y=";
+      "linux-x64.zip" = "sha256-9+LCjeI18u/GlPDMIl6Jx6b++lc90fJ5tVBlDR+ctDs=";
+    };
+    "android-x64-release" = {
+      "artifacts.zip" = "sha256-rsS08VP86/b2S0TEYusCEJBvS4BuevsmV9REAxRgJIc=";
+      "linux-x64.zip" = "sha256-H4nFCJ+iCUzIwHogYzS+h33eDMaFnz71dcDLSQW1aPg=";
+    };
+    "linux-arm64" = {
+      "artifacts.zip" = "sha256-kCxsKQQQX6wzhD46bfoflKdz3AYYkoSyavhfyTDuHLU=";
+      "font-subset.zip" = "sha256-Yk6JsNWe7ftEQU/TsjDUZSFeLzeIbcS63lhl8fsWsdk=";
+      "linux-arm64-flutter-gtk.zip" = "sha256-girVdkXrTO5tssoi+eKwG9ykstCR/VOx8zWtcAz8AKM=";
+    };
+    "linux-arm64-debug" = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-girVdkXrTO5tssoi+eKwG9ykstCR/VOx8zWtcAz8AKM=";
+    };
+    "linux-arm64-profile" = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-VL5cwYaZ1FOJ3TwJzbgvHDQwkU9NrHGnf/tQhZ/dAGg=";
+    };
+    "linux-arm64-release" = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-27hy7mLFCLkqJbn+5p5eJdYnfBKTyfFe98iUMmKyz4g=";
+    };
+    "linux-x64" = {
+      "artifacts.zip" = "sha256-JgEX+rKxdcWBBaxyR42eC7qOAvaawF9M2+rfaD4IgeA=";
+      "font-subset.zip" = "sha256-5EoxBrxSjaLLd+rKrxVYNoUZaejk0qcQ5LVsmqtKc2g=";
+      "linux-x64-flutter-gtk.zip" = "sha256-MH5HDPoXXi/KpQLQ0U1tQzZ0sbZx1RVhZtQ7L+WhZgk=";
+    };
+    "linux-x64-debug" = {
+      "linux-x64-flutter-gtk.zip" = "sha256-MH5HDPoXXi/KpQLQ0U1tQzZ0sbZx1RVhZtQ7L+WhZgk=";
+    };
+    "linux-x64-profile" = {
+      "linux-x64-flutter-gtk.zip" = "sha256-r2hB/AKrB5vNga2fve4tTM4j+Zp9KDqNlTjKQhQvbaI=";
+    };
+    "linux-x64-release" = {
+      "linux-x64-flutter-gtk.zip" = "sha256-muREs2iUiHCZM+SGN5q3HRRGnejJapKN582Aeog49MI=";
+    };
+  };
+}
diff --git a/pkgs/development/compilers/flutter/flutter.nix b/pkgs/development/compilers/flutter/flutter.nix
index e332af2e35602..5a4b3ee018d23 100644
--- a/pkgs/development/compilers/flutter/flutter.nix
+++ b/pkgs/development/compilers/flutter/flutter.nix
@@ -2,27 +2,75 @@
 , patches
 , dart
 , src
+, includedEngineArtifacts ? {
+    common = [
+      "flutter_patched_sdk"
+      "flutter_patched_sdk_product"
+    ];
+    platform = {
+      android = lib.optionalAttrs stdenv.hostPlatform.isx86_64
+        ((lib.genAttrs [ "arm" "arm64" "x64" ] (architecture: [ "profile" "release" ])) // { x86 = [ "jit-release" ]; });
+      linux = lib.optionals stdenv.hostPlatform.isLinux
+        (lib.genAttrs ((lib.optional stdenv.hostPlatform.isx86_64 "x64") ++ (lib.optional stdenv.hostPlatform.isAarch64 "arm64"))
+          (architecture: [ "debug" "profile" "release" ]));
+    };
+  }
 
 , lib
 , callPackage
 , stdenv
-, autoPatchelfHook
+, runCommandLocal
+, symlinkJoin
+, lndir
 , git
 , which
-, atk
-, glib
-, gtk3
-, libepoxy
-}:
+}@args:
 
 let
-  # Libraries that Flutter artifacts depend on at runtime.
-  artifactRuntimeDeps = [
-    atk
-    glib
-    gtk3
-    libepoxy
-  ];
+  engineArtifactDirectory =
+    let
+      engineArtifacts = callPackage ./engine-artifacts {
+        engineVersion = lib.removeSuffix "\n" (builtins.readFile (src + /bin/internal/engine.version));
+      };
+    in
+    runCommandLocal "flutter-engine-artifacts-${version}" { }
+      (
+        let
+          mkCommonArtifactLinkCommand = { artifact }:
+            ''
+              mkdir -p $out/common
+              ${lndir}/bin/lndir -silent ${artifact} $out/common
+            '';
+          mkPlatformArtifactLinkCommand = { artifact, os, architecture, variant ? null }:
+            let
+              artifactDirectory = "${os}-${architecture}${lib.optionalString (variant != null) "-${variant}"}";
+            in
+            ''
+              mkdir -p $out/${artifactDirectory}
+                ${lndir}/bin/lndir -silent ${artifact} $out/${artifactDirectory}
+            '';
+        in
+        ''
+          ${
+            builtins.concatStringsSep "\n"
+              ((map (name: mkCommonArtifactLinkCommand {
+                artifact = engineArtifacts.common.${name};
+              }) (if includedEngineArtifacts ? common then includedEngineArtifacts.common else [ ])) ++
+              (builtins.foldl' (commands: os: commands ++
+                (builtins.foldl' (commands: architecture: commands ++
+                  (builtins.foldl' (commands: variant: commands ++
+                    (map (artifact: mkPlatformArtifactLinkCommand {
+                      inherit artifact os architecture variant;
+                    }) engineArtifacts.platform.${os}.${architecture}.variants.${variant}))
+                  (map (artifact: mkPlatformArtifactLinkCommand {
+                    inherit artifact os architecture;
+                  }) engineArtifacts.platform.${os}.${architecture}.base)
+                  includedEngineArtifacts.platform.${os}.${architecture}))
+                [] (builtins.attrNames includedEngineArtifacts.platform.${os})))
+              [] (builtins.attrNames (if includedEngineArtifacts ? platform then includedEngineArtifacts.platform else { }))))
+          }
+        ''
+      );
 
   unwrapped =
     stdenv.mkDerivation {
@@ -31,8 +79,7 @@ let
 
       outputs = [ "out" "cache" ];
 
-      nativeBuildInputs = [ autoPatchelfHook ];
-      buildInputs = [ git ] ++ artifactRuntimeDeps;
+      buildInputs = [ git ];
 
       postPatch = ''
         patchShebangs --build ./bin/
@@ -75,7 +122,10 @@ let
         echo "$revision" > "$STAMP_PATH"
         echo -n "${version}" > version
 
-        rm -r bin/cache/dart-sdk
+        # Certain prebuilts should be replaced with Nix-built (or at least Nix-patched) equivalents.
+        rm -r \
+          bin/cache/dart-sdk \
+          bin/cache/artifacts/engine
       '';
 
       installPhase = ''
@@ -83,8 +133,8 @@ let
 
         mkdir -p $out
         cp -r . $out
-        mkdir -p $out/bin/cache/
         ln -sf ${dart} $out/bin/cache/dart-sdk
+        ln -sf ${engineArtifactDirectory} $out/bin/cache/artifacts/engine
 
         runHook postInstall
       '';
@@ -110,7 +160,17 @@ let
         # found here should be included as-is, for tooling compatibility.
         sdk = unwrapped;
         mkFlutterApp = callPackage ../../../build-support/flutter {
-          flutter = callPackage ./wrapper.nix { flutter = unwrapped; };
+          # Package a minimal version of Flutter that only uses Linux desktop release artifacts.
+          flutter = callPackage ./wrapper.nix {
+            flutter = callPackage ./flutter.nix (args // {
+              includedEngineArtifacts = {
+                common = [ "flutter_patched_sdk_product" ];
+                platform.linux = lib.optionals stdenv.hostPlatform.isLinux
+                  (lib.genAttrs ((lib.optional stdenv.hostPlatform.isx86_64 "x64") ++ (lib.optional stdenv.hostPlatform.isAarch64 "arm64"))
+                    (architecture: [ "release" ]));
+              };
+            });
+          };
         };
       };
 
@@ -125,7 +185,6 @@ let
         platforms = [ "x86_64-linux" "aarch64-linux" ];
         maintainers = with maintainers; [ babariviere ericdallo FlafyDev gilice hacker1024 ];
       };
-    }
-  ;
+    };
 in
 unwrapped