213 lines
5.7 KiB
Nix
213 lines
5.7 KiB
Nix
{
|
|
lib,
|
|
stdenv,
|
|
darwin,
|
|
callPackage,
|
|
flutter,
|
|
supportedTargetFlutterPlatforms ?
|
|
[
|
|
"universal"
|
|
"web"
|
|
]
|
|
++ lib.optional (stdenv.hostPlatform.isLinux && !(flutter ? engine)) "linux"
|
|
++ lib.optional (stdenv.hostPlatform.isx86_64 || stdenv.hostPlatform.isDarwin) "android"
|
|
++ lib.optionals stdenv.hostPlatform.isDarwin [
|
|
"macos"
|
|
"ios"
|
|
],
|
|
artifactHashes ? flutter.artifactHashes,
|
|
extraPkgConfigPackages ? [ ],
|
|
extraLibraries ? [ ],
|
|
extraIncludes ? [ ],
|
|
extraCxxFlags ? [ ],
|
|
extraCFlags ? [ ],
|
|
extraLinkerFlags ? [ ],
|
|
makeWrapper,
|
|
writeShellScript,
|
|
wrapGAppsHook3,
|
|
git,
|
|
which,
|
|
pkg-config,
|
|
atk,
|
|
cairo,
|
|
gdk-pixbuf,
|
|
glib,
|
|
gtk3,
|
|
harfbuzz,
|
|
libepoxy,
|
|
pango,
|
|
libX11,
|
|
xorgproto,
|
|
libdeflate,
|
|
zlib,
|
|
cmake,
|
|
ninja,
|
|
clang,
|
|
symlinkJoin,
|
|
}:
|
|
|
|
let
|
|
supportsLinuxDesktopTarget = builtins.elem "linux" supportedTargetFlutterPlatforms;
|
|
|
|
flutterPlatformArtifacts = lib.genAttrs supportedTargetFlutterPlatforms (
|
|
flutterPlatform:
|
|
(callPackage ./artifacts/prepare-artifacts.nix {
|
|
src = callPackage ./artifacts/fetch-artifacts.nix {
|
|
inherit flutterPlatform;
|
|
systemPlatform = stdenv.hostPlatform.system;
|
|
flutter = callPackage ./wrapper.nix { inherit flutter; };
|
|
hash = artifactHashes.${flutterPlatform}.${stdenv.hostPlatform.system} or "";
|
|
};
|
|
})
|
|
);
|
|
|
|
cacheDir = symlinkJoin {
|
|
name = "flutter-cache-dir";
|
|
paths = builtins.attrValues flutterPlatformArtifacts;
|
|
postBuild = ''
|
|
mkdir -p "$out/bin/cache"
|
|
ln -s '${flutter}/bin/cache/dart-sdk' "$out/bin/cache"
|
|
'';
|
|
passthru.flutterPlatform = flutterPlatformArtifacts;
|
|
};
|
|
|
|
# By default, Flutter stores downloaded files (such as the Pub cache) in the SDK directory.
|
|
# Wrap it to ensure that it does not do that, preferring home directories instead.
|
|
immutableFlutter = writeShellScript "flutter_immutable" ''
|
|
export PUB_CACHE=''${PUB_CACHE:-"$HOME/.pub-cache"}
|
|
${flutter}/bin/flutter "$@"
|
|
'';
|
|
|
|
# Tools that the Flutter tool depends on.
|
|
tools = [
|
|
git
|
|
which
|
|
];
|
|
|
|
# Libraries that Flutter apps depend on at runtime.
|
|
appRuntimeDeps = lib.optionals supportsLinuxDesktopTarget [
|
|
atk
|
|
cairo
|
|
gdk-pixbuf
|
|
glib
|
|
gtk3
|
|
harfbuzz
|
|
libepoxy
|
|
pango
|
|
libX11
|
|
libdeflate
|
|
];
|
|
|
|
# Development packages required for compilation.
|
|
appBuildDeps =
|
|
let
|
|
# https://discourse.nixos.org/t/handling-transitive-c-dependencies/5942/3
|
|
deps =
|
|
pkg: lib.filter lib.isDerivation ((pkg.buildInputs or [ ]) ++ (pkg.propagatedBuildInputs or [ ]));
|
|
withKey = pkg: {
|
|
key = pkg.outPath;
|
|
val = pkg;
|
|
};
|
|
collect = pkg: lib.map withKey ([ pkg ] ++ deps pkg);
|
|
in
|
|
lib.map (e: e.val) (
|
|
lib.genericClosure {
|
|
startSet = lib.map withKey appRuntimeDeps;
|
|
operator = item: collect item.val;
|
|
}
|
|
);
|
|
|
|
# Some header files and libraries are not properly located by the Flutter SDK.
|
|
# They must be manually included.
|
|
appStaticBuildDeps =
|
|
(lib.optionals supportsLinuxDesktopTarget [
|
|
libX11
|
|
xorgproto
|
|
zlib
|
|
])
|
|
++ extraLibraries;
|
|
|
|
# Tools used by the Flutter SDK to compile applications.
|
|
buildTools = lib.optionals supportsLinuxDesktopTarget [
|
|
pkg-config
|
|
cmake
|
|
ninja
|
|
clang
|
|
];
|
|
|
|
# Nix-specific compiler configuration.
|
|
pkgConfigPackages = map (lib.getOutput "dev") (appBuildDeps ++ extraPkgConfigPackages);
|
|
includeFlags = map (pkg: "-isystem ${lib.getOutput "dev" pkg}/include") (
|
|
appStaticBuildDeps ++ extraIncludes
|
|
);
|
|
linkerFlags =
|
|
(map (pkg: "-rpath,${lib.getOutput "lib" pkg}/lib") appRuntimeDeps) ++ extraLinkerFlags;
|
|
in
|
|
(callPackage ./sdk-symlink.nix { }) (
|
|
stdenv.mkDerivation {
|
|
pname = "flutter-wrapped";
|
|
inherit (flutter) version;
|
|
|
|
nativeBuildInputs =
|
|
[ makeWrapper ]
|
|
++ lib.optionals stdenv.hostPlatform.isDarwin [ darwin.DarwinTools ]
|
|
++ lib.optionals supportsLinuxDesktopTarget [
|
|
glib
|
|
wrapGAppsHook3
|
|
];
|
|
|
|
passthru = flutter.passthru // {
|
|
inherit (flutter) version;
|
|
unwrapped = flutter;
|
|
updateScript = ./update/update.py;
|
|
inherit cacheDir;
|
|
};
|
|
|
|
dontUnpack = true;
|
|
dontWrapGApps = true;
|
|
|
|
installPhase =
|
|
''
|
|
runHook preInstall
|
|
|
|
for path in ${
|
|
builtins.concatStringsSep " " (
|
|
builtins.foldl' (
|
|
paths: pkg:
|
|
paths
|
|
++ (map (directory: "'${pkg}/${directory}/pkgconfig'") [
|
|
"lib"
|
|
"share"
|
|
])
|
|
) [ ] pkgConfigPackages
|
|
)
|
|
}; do
|
|
addToSearchPath FLUTTER_PKG_CONFIG_PATH "$path"
|
|
done
|
|
|
|
mkdir -p $out/bin
|
|
makeWrapper '${immutableFlutter}' $out/bin/flutter \
|
|
--set-default ANDROID_EMULATOR_USE_SYSTEM_LIBS 1 \
|
|
''
|
|
+ lib.optionalString (flutter ? engine && flutter.engine.meta.available) ''
|
|
--set-default FLUTTER_ENGINE "${flutter.engine}" \
|
|
--add-flags "--local-engine-host ${flutter.engine.outName}" \
|
|
''
|
|
+ ''
|
|
--suffix PATH : '${lib.makeBinPath (tools ++ buildTools)}' \
|
|
--suffix PKG_CONFIG_PATH : "$FLUTTER_PKG_CONFIG_PATH" \
|
|
--suffix LIBRARY_PATH : '${lib.makeLibraryPath appStaticBuildDeps}' \
|
|
--prefix CXXFLAGS "''\t" '${builtins.concatStringsSep " " (includeFlags ++ extraCxxFlags)}' \
|
|
--prefix CFLAGS "''\t" '${builtins.concatStringsSep " " (includeFlags ++ extraCFlags)}' \
|
|
--prefix LDFLAGS "''\t" '${
|
|
builtins.concatStringsSep " " (map (flag: "-Wl,${flag}") linkerFlags)
|
|
}' \
|
|
''${gappsWrapperArgs[@]}
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
inherit (flutter) meta;
|
|
}
|
|
)
|