Unverified Commit f6442fb7 authored by Tristan Ross's avatar Tristan Ross Committed by GitHub
Browse files

flutter.buildFlutterApplication: add support for finalAttrs (#494789)

parents 0c9bdb6c 139edf9d
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -36,19 +36,19 @@ Dart supports multiple [outputs types](https://dart.dev/tools/dart-compile#types
  fetchFromGitHub,
}:

buildDartApplication rec {
buildDartApplication (finalAttrs: {
  pname = "dart-sass";
  version = "1.62.1";

  src = fetchFromGitHub {
    owner = "sass";
    repo = "dart-sass";
    tag = version;
    tag = finalAttrs.version;
    hash = "sha256-U6enz8yJcc4Wf8m54eYIAnVg/jsGi247Wy8lp1r1wg4=";
  };

  pubspecLock = lib.importJSON ./pubspec.lock.json;
}
})
```

### Patching dependencies {#ssec-dart-applications-patching-dependencies}
@@ -102,14 +102,14 @@ The function `buildFlutterApplication` builds Flutter applications.

See the [Dart documentation](#ssec-dart-applications) for more details on required files and arguments.

`flutter` in Nixpkgs always points to `flutterPackages.stable`, which is the latest packaged version. To avoid unforeseen breakage during upgrade, packages in Nixpkgs should use a specific flutter version, such as `flutter319` and `flutter322`, instead of using `flutter` directly.
`flutter` in Nixpkgs always points to `flutterPackages.stable`, which is the latest packaged version. To avoid unforeseen breakage during upgrade, packages in Nixpkgs should use a specific flutter version, such as `flutter335` and `flutter338`, instead of using `flutter` directly.

```nix
{ flutter322, fetchFromGitHub }:
{ flutter335, fetchFromGitHub }:

flutter322.buildFlutterApplication {
flutter335.buildFlutterApplication (finalAttrs: {
  pname = "firmware-updater";
  version = "0-unstable-2023-04-30";
  version = "0-unstable-2025-09-09";

  # To build for the Web, use the targetFlutterPlatform argument.
  # targetFlutterPlatform = "web";
@@ -117,13 +117,17 @@ flutter322.buildFlutterApplication {
  src = fetchFromGitHub {
    owner = "canonical";
    repo = "firmware-updater";
    rev = "6e7dbdb64e344633ea62874b54ff3990bd3b8440";
    hash = "sha256-s5mwtr5MSPqLMN+k851+pFIFFPa0N1hqz97ys050tFA=";
    rev = "402e97254b9d63c8d962c46724995e377ff922c8";
    hash = "sha256-nQn5mlgNj157h++67+mhez/F1ALz4yY+bxiGsi0/xX8=";
    fetchSubmodules = true;
  };

  pubspecLock = lib.importJSON ./pubspec.lock.json;
}

  sourceRoot = "${finalAttrs.src.name}/apps/firmware_updater";

  gitHashes.fwupd = "sha256-l/+HrrJk1mE2Mrau+NmoQ7bu9qhHU6wX68+m++9Hjd4=";
})
```

### Usage with nix-shell {#ssec-dart-flutter-nix-shell}
+130 −121
Original line number Diff line number Diff line
@@ -14,7 +14,19 @@
  yq,
}:

{
lib.extendMkDerivation {
  constructDrv = stdenv.mkDerivation;

  excludeDrvArgNames = [
    "gitHashes"
    "sdkSourceBuilders"
    "pubspecLock"
    "customSourceBuilders"
  ];

  extendDrvArgs =
    finalAttrs:
    args@{
      src,
      sourceRoot ? "source",
      packageRoot ? (lib.removePrefix "/" (lib.removePrefix "source" sourceRoot)),
@@ -67,8 +79,7 @@
            } ''yq . '${autoPubspecLock}' > "$out"''
          ),
      ...
}@args:

    }:
    let
      generators = callPackage ./generators.nix { inherit dart; } { buildDrvArgs = args; };

@@ -128,9 +139,12 @@ let
        dartFixupHook
        ;

  baseDerivation = stdenv.mkDerivation (
    finalAttrs:
    (removeAttrs args [
    in
    assert
      !(builtins.isString dartOutputType && dartOutputType != "")
      -> throw "dartOutputType must be a non-empty string";

    (builtins.removeAttrs args [
      "gitHashes"
      "sdkSourceBuilders"
      "pubspecLock"
@@ -198,10 +212,5 @@ let
      meta = (args.meta or { }) // {
        platforms = args.meta.platforms or dart.meta.platforms;
      };
    };
}
  );
in
assert
  !(builtins.isString dartOutputType && dartOutputType != "")
  -> throw "dartOutputType must be a non-empty string";
baseDerivation
+3 −3
Original line number Diff line number Diff line
@@ -22,14 +22,14 @@ let
  media_kit_hash = "sha256-oJQ9sRQI4HpAIzoS995yfnzvx5ZzIubVANzbmxTt6LE=";
in

flutter.buildFlutterApplication rec {
flutter.buildFlutterApplication (finalAttrs: {
  pname = "fladder";
  version = "0.10.1";

  src = fetchFromGitHub {
    owner = "DonutWare";
    repo = "Fladder";
    tag = "v${version}";
    tag = "v${finalAttrs.version}";
    hash = "sha256-lmtEgBxCmEYcckhSAXhMPDzNQBluTyW0yjkt6Rr9byA=";
  };

@@ -107,4 +107,4 @@ flutter.buildFlutterApplication rec {
    ];
    mainProgram = "Fladder";
  };
}
})
+56 −45
Original line number Diff line number Diff line
@@ -14,33 +14,63 @@

# absolutely no mac support for now

{
lib.extendMkDerivation {
  constructDrv =
    argsFn:
    let
      evalArgs = lib.fix argsFn;
      targetFlutterPlatform = evalArgs.targetFlutterPlatform or "linux";

      minimalFlutter = flutter.override {
        supportedTargetFlutterPlatforms = [
          "universal"
          targetFlutterPlatform
        ];
      };

      buildAppWith = flutter: buildDartApplication.override { dart = flutter; };
    in
    buildAppWith minimalFlutter (
      finalAttrs:
      let
        args = argsFn finalAttrs;
      in
      args
      // {
        passthru = (args.passthru or { }) // {
          multiShell = buildAppWith flutter args;
        };
      }
    );

  extendDrvArgs =
    finalAttrs:
    args@{
      pubGetScript ? null,
      flutterBuildFlags ? [ ],
      targetFlutterPlatform ? "linux",
      extraWrapProgramArgs ? "",
      flutterMode ? null,
      ...
}@args:

    }:
    let
      hasEngine = flutter ? engine && flutter.engine != null && flutter.engine.meta.available;
  flutterMode = args.flutterMode or (if hasEngine then flutter.engine.runtimeMode else "release");
      flutterMode' = args.flutterMode or (if hasEngine then flutter.engine.runtimeMode else "release");

  flutterFlags = lib.optional hasEngine "--local-engine host_${flutterMode}${
      flutterFlags = lib.optional hasEngine "--local-engine host_${flutterMode'}${
        lib.optionalString (!flutter.engine.isOptimized) "_unopt"
      }";

  flutterBuildFlags = [
    "--${flutterMode}"
      flutterBuildFlags' = [
        "--${flutterMode'}"
      ]
      ++ (args.flutterBuildFlags or [ ])
      ++ flutterFlags;

  builderArgs =
    let
      universal = args // {
        inherit flutterMode flutterFlags flutterBuildFlags;
        flutterMode = flutterMode';
        flutterFlags = flutterFlags;
        flutterBuildFlags = flutterBuildFlags';

        sdkSetupScript = ''
          # Pub needs SSL certificates. Dart normally looks in a hardcoded path.
@@ -128,8 +158,6 @@ let
      };
    in
    {
      inherit universal;

      linux = universal // {
        outputs = universal.outputs or [ ] ++ [ "debug" ];

@@ -225,21 +253,4 @@ let
      };
    }
    .${targetFlutterPlatform} or (throw "Unsupported Flutter host platform: ${targetFlutterPlatform}");

  minimalFlutter = flutter.override {
    supportedTargetFlutterPlatforms = [
      "universal"
      targetFlutterPlatform
    ];
  };

  buildAppWith = flutter: buildDartApplication.override { dart = flutter; };
in
buildAppWith minimalFlutter (
  builderArgs
  // {
    passthru = builderArgs.passthru or { } // {
      multiShell = buildAppWith flutter builderArgs;
    };
}
)