about summary refs log tree commit diff
path: root/pkgs/development/compilers
diff options
context:
space:
mode:
authorhacker1024 <hacker1024@users.sourceforge.net>2022-11-14 13:11:49 +1100
committerhacker1024 <hacker1024@users.sourceforge.net>2022-11-14 13:11:49 +1100
commitea48c7c9b68add8b1b7f8a8926d9fec3df12301f (patch)
treee79b14a5d93f5f05ba92198dba75cec9e86ff48a /pkgs/development/compilers
parentc6b044c101523efbe699373fdf449fdd60390cf4 (diff)
flutter: Modularize unwrapped, wrapped, and FHS components
Diffstat (limited to 'pkgs/development/compilers')
-rw-r--r--pkgs/development/compilers/flutter/default.nix10
-rw-r--r--pkgs/development/compilers/flutter/fhs.nix71
-rw-r--r--pkgs/development/compilers/flutter/flutter.nix257
-rw-r--r--pkgs/development/compilers/flutter/wrapper.nix89
4 files changed, 213 insertions, 214 deletions
diff --git a/pkgs/development/compilers/flutter/default.nix b/pkgs/development/compilers/flutter/default.nix
index 676ef78e3b349..50752b01ec7b7 100644
--- a/pkgs/development/compilers/flutter/default.nix
+++ b/pkgs/development/compilers/flutter/default.nix
@@ -1,11 +1,13 @@
 { callPackage, fetchurl, dart }:
 let
   mkFlutter = opts: callPackage (import ./flutter.nix opts) { };
+  wrapFlutter = flutter: callPackage (import ./wrapper.nix) { flutter = flutter; };
+  mkFlutterFHS = flutter: callPackage (import ./fhs.nix) { flutter = flutter; };
   getPatches = dir:
     let files = builtins.attrNames (builtins.readDir dir);
     in map (f: dir + ("/" + f)) files;
-  flutterDrv = { version, pname, dartVersion, hash, dartHash, patches }: mkFlutter {
-    inherit version pname patches;
+  flutterDrv = { version, dartVersion, hash, dartHash, patches }: mkFlutter {
+    inherit version patches;
     dart = dart.override {
       version = dartVersion;
       sources = {
@@ -26,9 +28,8 @@ let
   };
 in
 {
-  inherit mkFlutter;
+  inherit mkFlutter wrapFlutter mkFlutterFHS flutterDrv;
   stable = flutterDrv {
-    pname = "flutter";
     version = "3.3.3";
     dartVersion = "2.18.2";
     hash = "sha256-MTZeWQUp4/TcPzYIT6eqIKSPUPvn2Mp/thOQzNgpTXg=";
@@ -40,7 +41,6 @@ in
   };
 
   v2 = flutterDrv {
-    pname = "flutter";
     version = "2.10.5";
     dartVersion = "2.16.2";
     hash = "sha256-DTZwxlMUYk8NS1SaWUJolXjD+JnRW73Ps5CdRHDGnt0=";
diff --git a/pkgs/development/compilers/flutter/fhs.nix b/pkgs/development/compilers/flutter/fhs.nix
new file mode 100644
index 0000000000000..025d94665b5ad
--- /dev/null
+++ b/pkgs/development/compilers/flutter/fhs.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, flutter
+, buildFHSUserEnv
+, runCommandLocal
+, supportsAndroidEmulator ? stdenv.isLinux
+}:
+
+# Wrap flutter inside an fhs user env to allow execution of binary,
+# like adb from $ANDROID_HOME or java from android-studio.
+buildFHSUserEnv {
+  name = flutter.name;
+
+  multiPkgs = pkgs: with pkgs; ([
+    # Flutter only use these certificates
+    (runCommandLocal "fedoracert" { } ''
+      mkdir -p $out/etc/pki/tls/
+      ln -s ${cacert}/etc/ssl/certs $out/etc/pki/tls/certs
+    '')
+    zlib
+  ]);
+
+  targetPkgs = pkgs: with pkgs; ([
+    flutter
+
+    # General ecosystem dependencies
+    bash
+    curl
+    git
+    unzip
+    which
+    xz
+
+    # flutter test requires this lib
+    libGLU
+  ] ++ lib.optional supportsAndroidEmulator [
+    # for android emulator
+    alsa-lib
+    dbus
+    expat
+    libpulseaudio
+    libuuid
+    xorg.libX11
+    xorg.libxcb
+    xorg.libXcomposite
+    xorg.libXcursor
+    xorg.libXdamage
+    xorg.libXext
+    xorg.libXfixes
+    xorg.libXi
+    xorg.libXrender
+    xorg.libXtst
+    libGL
+    nspr
+    nss
+    systemd
+  ]);
+
+  runScript = "flutter";
+
+  passthru = {
+    inherit flutter;
+  };
+
+  meta = flutter.meta // {
+    longDescription = ''
+      ${flutter.meta.longDescription}
+      Wrapped in a FHS environment to improve compatibility with internal tools and tools in the ecosystem.
+    '';
+  };
+}
diff --git a/pkgs/development/compilers/flutter/flutter.nix b/pkgs/development/compilers/flutter/flutter.nix
index c8fc23492bacf..1cbbe66509eb5 100644
--- a/pkgs/development/compilers/flutter/flutter.nix
+++ b/pkgs/development/compilers/flutter/flutter.nix
@@ -1,202 +1,80 @@
-{ pname
-, version
+{ version
 , patches
 , dart
 , src
-, supportsLinuxDesktop ? true
 }:
 
-{ bash
-, buildFHSUserEnv
-, cacert
+{ lib
 , git
-, runCommandLocal
-, writeShellScript
-, makeWrapper
 , stdenv
-, lib
-, alsa-lib
-, atk
-, cairo
-, clang
-, cmake
-, dbus
-, expat
-, gdk-pixbuf
-, glib
-, gtk3
-, harfbuzz
-, libepoxy
-, libGL
-, libpulseaudio
-, libuuid
-, libX11
-, libxcb
-, libXcomposite
-, libXcursor
-, libXdamage
-, libXext
-, libXfixes
-, libXi
-, libXrender
-, libXtst
-, ninja
-, nspr
-, nss
-, pango
-, pkg-config
-, systemd
 , which
-, xorgproto
-, callPackage
 }:
-let
-  drvName = "flutter-${version}";
-  flutter = stdenv.mkDerivation {
-    name = "${drvName}-unwrapped";
 
-    buildInputs = [ git ];
+stdenv.mkDerivation {
+  name = "$flutter-${version}-unwrapped";
 
-    inherit src patches version;
+  buildInputs = [ git ];
 
-    postPatch = ''
-      patchShebangs --build ./bin/
-    '';
+  inherit src patches version;
 
-    buildPhase = ''
-      export FLUTTER_ROOT="$(pwd)"
-      export FLUTTER_TOOLS_DIR="$FLUTTER_ROOT/packages/flutter_tools"
-      export SCRIPT_PATH="$FLUTTER_TOOLS_DIR/bin/flutter_tools.dart"
+  postPatch = ''
+    patchShebangs --build ./bin/
+  '';
 
-      export SNAPSHOT_PATH="$FLUTTER_ROOT/bin/cache/flutter_tools.snapshot"
-      export STAMP_PATH="$FLUTTER_ROOT/bin/cache/flutter_tools.stamp"
+  buildPhase = ''
+    export FLUTTER_ROOT="$(pwd)"
+    export FLUTTER_TOOLS_DIR="$FLUTTER_ROOT/packages/flutter_tools"
+    export SCRIPT_PATH="$FLUTTER_TOOLS_DIR/bin/flutter_tools.dart"
 
-      export DART_SDK_PATH="${dart}"
+    export SNAPSHOT_PATH="$FLUTTER_ROOT/bin/cache/flutter_tools.snapshot"
+    export STAMP_PATH="$FLUTTER_ROOT/bin/cache/flutter_tools.stamp"
 
-      HOME=../.. # required for pub upgrade --offline, ~/.pub-cache
-                 # path is relative otherwise it's replaced by /build/flutter
+    export DART_SDK_PATH="${dart}"
 
-      pushd "$FLUTTER_TOOLS_DIR"
-      ${dart}/bin/dart pub get --offline
-      popd
+    HOME=../.. # required for pub upgrade --offline, ~/.pub-cache
+               # path is relative otherwise it's replaced by /build/flutter
 
-      local revision="$(cd "$FLUTTER_ROOT"; git rev-parse HEAD)"
-      ${dart}/bin/dart --snapshot="$SNAPSHOT_PATH" --packages="$FLUTTER_TOOLS_DIR/.dart_tool/package_config.json" "$SCRIPT_PATH"
-      echo "$revision" > "$STAMP_PATH"
-      echo -n "${version}" > version
+    pushd "$FLUTTER_TOOLS_DIR"
+    ${dart}/bin/dart pub get --offline
+    popd
 
-      rm -r bin/cache/{artifacts,dart-sdk,downloads}
-      rm bin/cache/*.stamp
-    '';
+    local revision="$(cd "$FLUTTER_ROOT"; git rev-parse HEAD)"
+    ${dart}/bin/dart --snapshot="$SNAPSHOT_PATH" --packages="$FLUTTER_TOOLS_DIR/.dart_tool/package_config.json" "$SCRIPT_PATH"
+    echo "$revision" > "$STAMP_PATH"
+    echo -n "${version}" > version
 
-    installPhase = ''
-      runHook preInstall
+    rm -r bin/cache/{artifacts,dart-sdk,downloads}
+    rm bin/cache/*.stamp
+  '';
 
-      mkdir -p $out
-      cp -r . $out
-      mkdir -p $out/bin/cache/
-      ln -sf ${dart} $out/bin/cache/dart-sdk
+  installPhase = ''
+    runHook preInstall
 
-      runHook postInstall
-    '';
-
-    doInstallCheck = true;
-    installCheckInputs = [ which ];
-    installCheckPhase = ''
-      runHook preInstallCheck
+    mkdir -p $out
+    cp -r . $out
+    mkdir -p $out/bin/cache/
+    ln -sf ${dart} $out/bin/cache/dart-sdk
 
-      export HOME="$(mktemp -d)"
-      $out/bin/flutter config --android-studio-dir $HOME
-      $out/bin/flutter config --android-sdk $HOME
-      $out/bin/flutter --version | fgrep -q '${version}'
+    runHook postInstall
+  '';
 
-      runHook postInstallCheck
-    '';
-  };
+  doInstallCheck = true;
+  installCheckInputs = [ which ];
+  installCheckPhase = ''
+    runHook preInstallCheck
 
-  # Wrap flutter inside an fhs user env to allow execution of binary,
-  # like adb from $ANDROID_HOME or java from android-studio.
-  fhsEnv = buildFHSUserEnv {
-    name = "${drvName}-fhs-env";
-    multiPkgs = pkgs:
-      with pkgs; ([
-        # Flutter only use these certificates
-        (runCommandLocal "fedoracert" { } ''
-          mkdir -p $out/etc/pki/tls/
-          ln -s ${cacert}/etc/ssl/certs $out/etc/pki/tls/certs
-        '')
-        zlib
-      ]);
-    targetPkgs = pkgs:
-      with pkgs; ([
-        bash
-        curl
-        dart
-        git
-        unzip
-        which
-        xz
-
-        # flutter test requires this lib
-        libGLU
-
-        # for android emulator
-        alsa-lib
-        dbus
-        expat
-        libpulseaudio
-        libuuid
-        libX11
-        libxcb
-        libXcomposite
-        libXcursor
-        libXdamage
-        libXext
-        libXfixes
-        libXi
-        libXrender
-        libXtst
-        libGL
-        nspr
-        nss
-        systemd
-      ]);
-  };
+    export HOME="$(mktemp -d)"
+    $out/bin/flutter config --android-studio-dir $HOME
+    $out/bin/flutter config --android-sdk $HOME
+    $out/bin/flutter --version | fgrep -q '${version}'
 
-in
-let
-self = (self:
-runCommandLocal drvName
-{
-  flutterWithCorrectedCache = writeShellScript "flutter_corrected_cache" ''
-    export PUB_CACHE=''${PUB_CACHE:-"$HOME/.pub-cache"}
-    ${flutter}/bin/flutter "$@"
+    runHook postInstallCheck
   '';
-  buildInputs = [
-      makeWrapper
-      pkg-config
-  ] ++ lib.lists.optionals supportsLinuxDesktop (let
-    # https://discourse.nixos.org/t/handling-transitive-c-dependencies/5942/3
-    deps = pkg: (pkg.buildInputs or []) ++ (pkg.propagatedBuildInputs or []);
-    collect = pkg: lib.unique ([ pkg ] ++ deps pkg ++ lib.concatMap collect (deps pkg));
-  in
-    collect atk.dev ++
-    collect cairo.dev ++
-    collect gdk-pixbuf.dev ++
-    collect glib.dev ++
-    collect gtk3.dev ++
-    collect harfbuzz.dev ++
-    collect libepoxy.dev ++
-    collect pango.dev ++
-    collect libX11.dev ++
-    collect xorgproto);
+
   passthru = {
-    unwrapped = flutter;
     inherit dart;
-    mkFlutterApp = callPackage ../../../build-support/flutter {
-      flutter = self;
-    };
   };
+
   meta = with lib; {
     description = "Flutter is Google's SDK for building mobile, web and desktop with Dart";
     longDescription = ''
@@ -208,43 +86,4 @@ runCommandLocal drvName
     platforms = [ "x86_64-linux" "aarch64-linux" ];
     maintainers = with maintainers; [ babariviere ericdallo ];
   };
-} ''
-    mkdir -p $out/bin
-
-    mkdir -p $out/bin/cache/
-    ln -sf ${dart} $out/bin/cache/dart-sdk
-
-    mkdir -p $out/libexec
-    makeWrapper "$flutterWithCorrectedCache" $out/libexec/flutter_launcher \
-        --set-default ANDROID_EMULATOR_USE_SYSTEM_LIBS 1 \
-        --prefix PATH : ${lib.makeBinPath (lib.lists.optionals supportsLinuxDesktop [
-            pkg-config
-            cmake
-            ninja
-            clang
-          ])} \
-        --prefix PKG_CONFIG_PATH : "$PKG_CONFIG_PATH_FOR_TARGET" \
-        --prefix CXXFLAGS "''\t" '${lib.optionalString supportsLinuxDesktop "-isystem ${libX11.dev}/include -isystem ${xorgproto}/include"}' \
-        --prefix LDFLAGS "''\t" '${lib.optionalString supportsLinuxDesktop "-rpath ${lib.makeLibraryPath [
-            atk
-            cairo
-            gdk-pixbuf
-            glib
-            gtk3
-            harfbuzz
-            libepoxy
-            pango
-            libX11
-          ]}"}' \
-        --suffix LD_LIBRARY_PATH : '${lib.optionalString supportsLinuxDesktop (lib.makeLibraryPath [
-            # The prebuilt flutter_linux_gtk library shipped in the Flutter SDK does not have an appropriate RUNPATH.
-            # Its dependencies must be added here.
-            libepoxy
-          ])}' \
-        --add-flags --no-version-check
-
-    makeWrapper ${fhsEnv}/bin/${drvName}-fhs-env $out/bin/${pname} \
-        --add-flags $out/libexec/flutter_launcher
-'') self;
-in
-self
+}
diff --git a/pkgs/development/compilers/flutter/wrapper.nix b/pkgs/development/compilers/flutter/wrapper.nix
new file mode 100644
index 0000000000000..05a64f170287b
--- /dev/null
+++ b/pkgs/development/compilers/flutter/wrapper.nix
@@ -0,0 +1,89 @@
+{ lib
+, flutter
+, supportsLinuxDesktop ? true
+, makeWrapper
+, runCommandLocal
+, writeShellScript
+, pkg-config
+, atk
+, cairo
+, gdk-pixbuf
+, glib
+, gtk3
+, harfbuzz
+, libepoxy
+, pango
+, libX11
+, xorgproto
+, cmake
+, ninja
+, clang
+}:
+
+runCommandLocal "flutter"
+{
+  flutterWithCorrectedCache = writeShellScript "flutter_corrected_cache" ''
+    export PUB_CACHE=''${PUB_CACHE:-"$HOME/.pub-cache"}
+    ${flutter}/bin/flutter "$@"
+  '';
+
+  buildInputs = [
+    makeWrapper
+    pkg-config
+  ] ++ lib.lists.optionals supportsLinuxDesktop (
+    let
+      # https://discourse.nixos.org/t/handling-transitive-c-dependencies/5942/3
+      deps = pkg: (pkg.buildInputs or [ ]) ++ (pkg.propagatedBuildInputs or [ ]);
+      collect = pkg: lib.unique ([ pkg ] ++ deps pkg ++ lib.concatMap collect (deps pkg));
+    in
+    collect atk.dev ++
+      collect cairo.dev ++
+      collect gdk-pixbuf.dev ++
+      collect glib.dev ++
+      collect gtk3.dev ++
+      collect harfbuzz.dev ++
+      collect libepoxy.dev ++
+      collect pango.dev ++
+      collect libX11.dev ++
+      collect xorgproto
+  );
+
+  passthru = flutter.passthru // {
+    unwrapped = flutter;
+  };
+
+  inherit (flutter) meta;
+} ''
+  mkdir -p $out/bin
+
+  mkdir -p $out/bin/cache/
+  ln -sf ${flutter.dart} $out/bin/cache/dart-sdk
+
+  makeWrapper "$flutterWithCorrectedCache" $out/bin/flutter \
+      --set-default ANDROID_EMULATOR_USE_SYSTEM_LIBS 1 \
+      --prefix PATH : ${lib.makeBinPath (lib.lists.optionals supportsLinuxDesktop [
+          pkg-config
+          cmake
+          ninja
+          clang
+        ])} \
+      --prefix PKG_CONFIG_PATH : "$PKG_CONFIG_PATH_FOR_TARGET" \
+      --prefix CXXFLAGS "''\t" '${lib.optionalString supportsLinuxDesktop "-isystem ${libX11.dev}/include -isystem ${xorgproto}/include"}' \
+      --prefix LDFLAGS "''\t" '${lib.optionalString supportsLinuxDesktop "-rpath ${lib.makeLibraryPath [
+          atk
+          cairo
+          gdk-pixbuf
+          glib
+          gtk3
+          harfbuzz
+          libepoxy
+          pango
+          libX11
+        ]}"}' \
+      --suffix LD_LIBRARY_PATH : '${lib.optionalString supportsLinuxDesktop (lib.makeLibraryPath [
+          # The prebuilt flutter_linux_gtk library shipped in the Flutter SDK does not have an appropriate RUNPATH.
+          # Its dependencies must be added here.
+          libepoxy
+        ])}' \
+      --add-flags --no-version-check
+''