diff options
author | hacker1024 <hacker1024@users.sourceforge.net> | 2022-11-14 13:11:49 +1100 |
---|---|---|
committer | hacker1024 <hacker1024@users.sourceforge.net> | 2022-11-14 13:11:49 +1100 |
commit | ea48c7c9b68add8b1b7f8a8926d9fec3df12301f (patch) | |
tree | e79b14a5d93f5f05ba92198dba75cec9e86ff48a /pkgs/development/compilers | |
parent | c6b044c101523efbe699373fdf449fdd60390cf4 (diff) |
flutter: Modularize unwrapped, wrapped, and FHS components
Diffstat (limited to 'pkgs/development/compilers')
-rw-r--r-- | pkgs/development/compilers/flutter/default.nix | 10 | ||||
-rw-r--r-- | pkgs/development/compilers/flutter/fhs.nix | 71 | ||||
-rw-r--r-- | pkgs/development/compilers/flutter/flutter.nix | 257 | ||||
-rw-r--r-- | pkgs/development/compilers/flutter/wrapper.nix | 89 |
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 +'' |