summary refs log tree commit diff
path: root/pkgs/development/compilers/flutter
diff options
context:
space:
mode:
authorhacker1024 <hacker1024@users.sourceforge.net>2023-04-15 01:59:31 +1000
committerhacker1024 <hacker1024@users.sourceforge.net>2023-04-15 02:09:28 +1000
commit62e50080f39560183c57aa184bf03e47a341444c (patch)
tree3fcbc9d42969f176192a5a8a1cd35b8444264bf7 /pkgs/development/compilers/flutter
parentc3797393b70ce507aa47abb2f742bbb355e2c398 (diff)
flutter: Download engine artifacts individually
This brings the following benefits:
- Artifacts missing in the SDK tarball (such as prebuilts for linux-aarch64) can be obtained
- Artifacts can be patched more granularly (e.g. libflutter_linux_gtk is patchelf-ed for GTK3, and the linux-aarch64 assets have a postPatch to add some missing files)
- Minimal Flutter packages can be generated (e.g. mkFlutterApp only needs prebuilts for desktop Linux, and developers that don't care for desktop Linux can exclude the artifacts and dependencies)

It also paves the way for including manually built engine facts.
Diffstat (limited to 'pkgs/development/compilers/flutter')
-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