buildFlutterApplication: Wrap buildDartApplication

This commit is contained in:
hacker1024 2023-10-22 00:31:58 +11:00
parent becdfbe17c
commit 2addb67a14
7 changed files with 54 additions and 143 deletions

@ -1,34 +1,28 @@
{ lib
, callPackage
, stdenvNoCC
, runCommand
, makeWrapper
, wrapGAppsHook
, llvmPackages_13
, fetchDartDeps
, buildDartApplication
, cacert
, glib
, flutter
, jq
}:
# absolutely no mac support for now
{ pubGetScript ? "flutter pub get"
, flutterBuildFlags ? [ ]
, runtimeDependencies ? [ ]
, customPackageOverrides ? { }
, autoDepsList ? false
, depsListFile ? null
, vendorHash ? ""
, pubspecLockFile ? null
, nativeBuildInputs ? [ ]
, preUnpack ? ""
, postFixup ? ""
, extraWrapProgramArgs ? ""
, ...
}@args:
let
flutterSetupScript = ''
(buildDartApplication.override {
dart = flutter;
fetchDartDeps = fetchDartDeps.override { dart = flutter; };
}) (args // {
sdkSetupScript = ''
# Pub needs SSL certificates. Dart normally looks in a hardcoded path.
# https://github.com/dart-lang/sdk/blob/3.1.0/runtime/bin/security_context_linux.cc#L48
#
@ -54,136 +48,56 @@ let
flutter config --enable-linux-desktop >/dev/null
'';
deps = callPackage ../dart/fetch-dart-deps { dart = flutter; } {
sdkSetupScript = flutterSetupScript;
inherit pubGetScript vendorHash pubspecLockFile;
buildDrvArgs = args;
};
nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ wrapGAppsHook ];
buildInputs = (args.buildInputs or [ ]) ++ [ glib ];
baseDerivation = llvmPackages_13.stdenv.mkDerivation (finalAttrs: args // {
inherit flutterBuildFlags runtimeDependencies;
dontDartBuild = true;
buildPhase = args.buildPhase or ''
runHook preBuild
outputs = [ "out" "debug" ];
mkdir -p build/flutter_assets/fonts
nativeBuildInputs = [
makeWrapper
deps
flutter
jq
glib
wrapGAppsHook
] ++ nativeBuildInputs;
doPubGet flutter pub get --offline -v
flutter build linux -v --release --split-debug-info="$debug" ${builtins.concatStringsSep " " (map (flag: "\"${flag}\"") flutterBuildFlags)}
dontWrapGApps = true;
runHook postBuild
'';
preUnpack = ''
${lib.optionalString (!autoDepsList) ''
if ! { [ '${lib.boolToString (depsListFile != null)}' = 'true' ] ${lib.optionalString (depsListFile != null) "&& cmp -s <(jq -Sc . '${depsListFile}') <(jq -Sc . '${finalAttrs.passthru.depsListFile}')"}; }; then
echo 1>&2 -e '\nThe dependency list file was either not given or differs from the expected result.' \
'\nPlease choose one of the following solutions:' \
'\n - Duplicate the following file and pass it to the depsListFile argument.' \
'\n ${finalAttrs.passthru.depsListFile}' \
'\n - Set autoDepsList to true (not supported by Hydra or permitted in Nixpkgs)'.
exit 1
fi
''}
dontDartInstall = true;
installPhase = args.installPhase or ''
runHook preInstall
${preUnpack}
'';
built=build/linux/*/release/bundle
configurePhase = ''
runHook preConfigure
mkdir -p $out/bin
mv $built $out/app
${flutterSetupScript}
for f in $(find $out/app -iname "*.desktop" -type f); do
install -D $f $out/share/applications/$(basename $f)
done
runHook postConfigure
'';
for f in $(find $out/app -maxdepth 1 -type f); do
ln -s $f $out/bin/$(basename $f)
done
buildPhase = ''
runHook preBuild
# make *.so executable
find $out/app -iname "*.so" -type f -exec chmod +x {} +
mkdir -p build/flutter_assets/fonts
# remove stuff like /build/source/packages/ubuntu_desktop_installer/linux/flutter/ephemeral
for f in $(find $out/app -executable -type f); do
if patchelf --print-rpath "$f" | grep /build; then # this ignores static libs (e,g. libapp.so) also
echo "strip RPath of $f"
newrp=$(patchelf --print-rpath $f | sed -r "s|/build.*ephemeral:||g" | sed -r "s|/build.*profile:||g")
patchelf --set-rpath "$newrp" "$f"
fi
done
doPubGet flutter pub get --offline -v
flutter build linux -v --release --split-debug-info="$debug" ${builtins.concatStringsSep " " (map (flag: "\"${flag}\"") finalAttrs.flutterBuildFlags)}
runHook postInstall
'';
runHook postBuild
'';
installPhase = ''
runHook preInstall
built=build/linux/*/release/bundle
mkdir -p $out/bin
mv $built $out/app
for f in $(find $out/app -iname "*.desktop" -type f); do
install -D $f $out/share/applications/$(basename $f)
done
for f in $(find $out/app -maxdepth 1 -type f); do
ln -s $f $out/bin/$(basename $f)
done
# make *.so executable
find $out/app -iname "*.so" -type f -exec chmod +x {} +
# remove stuff like /build/source/packages/ubuntu_desktop_installer/linux/flutter/ephemeral
for f in $(find $out/app -executable -type f); do
if patchelf --print-rpath "$f" | grep /build; then # this ignores static libs (e,g. libapp.so) also
echo "strip RPath of $f"
newrp=$(patchelf --print-rpath $f | sed -r "s|/build.*ephemeral:||g" | sed -r "s|/build.*profile:||g")
patchelf --set-rpath "$newrp" "$f"
fi
done
runHook postInstall
'';
postFixup = ''
# Add runtime library dependencies to the LD_LIBRARY_PATH.
# For some reason, the RUNPATH of the executable is not used to load dynamic libraries in dart:ffi with DynamicLibrary.open().
#
# This could alternatively be fixed with patchelf --add-needed, but this would cause all the libraries to be opened immediately,
# which is not what application authors expect.
for f in "$out"/bin/*; do
wrapProgram "$f" \
--suffix LD_LIBRARY_PATH : '${lib.makeLibraryPath finalAttrs.runtimeDependencies}' \
''${gappsWrapperArgs[@]} \
${extraWrapProgramArgs}
done
${postFixup}
'';
passthru = (args.passthru or {}) // {
inherit (deps) depsListFile;
};
});
packageOverrideRepository = (callPackage ../../development/compilers/flutter/package-overrides { }) // customPackageOverrides;
productPackages = builtins.filter (package: package.kind != "dev")
(if autoDepsList
then lib.importJSON deps.depsListFile
else
if depsListFile == null
then [ ]
else lib.importJSON depsListFile);
in
builtins.foldl'
(prev: package:
if packageOverrideRepository ? ${package.name}
then
prev.overrideAttrs
(packageOverrideRepository.${package.name} {
inherit (package)
name
version
kind
source
dependencies;
})
else prev)
baseDerivation
productPackages
dontWrapGApps = true;
extraWrapProgramArgs = ''
''${gappsWrapperArgs[@]} \
${extraWrapProgramArgs}
'';
})

@ -1,3 +1,8 @@
{ callPackage }:
{ }
{
flutter_secure_storage_linux = callPackage ./flutter-secure-storage-linux { };
handy_window = callPackage ./handy-window { };
matrix = callPackage ./matrix { };
olm = callPackage ./olm { };
}

@ -1,8 +0,0 @@
{ callPackage }:
{
flutter_secure_storage_linux = callPackage ./flutter-secure-storage-linux { };
handy_window = callPackage ./handy-window { };
matrix = callPackage ./matrix { };
olm = callPackage ./olm { };
}