From fdab275c089a847eda5da99ea595817b0d95897f Mon Sep 17 00:00:00 2001 From: FlafyDev Date: Sun, 24 Mar 2024 16:47:13 +0200 Subject: [PATCH] flutter: move flutter-tools' Gradle build files out of Nix Store --- .../development/compilers/flutter/flutter.nix | 4 ++ .../gradle-flutter-tools-wrapper.patch | 44 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 pkgs/development/compilers/flutter/versions/3_19/patches/gradle-flutter-tools-wrapper.patch diff --git a/pkgs/development/compilers/flutter/flutter.nix b/pkgs/development/compilers/flutter/flutter.nix index 03c2968f4ab9..bce45f200c2d 100644 --- a/pkgs/development/compilers/flutter/flutter.nix +++ b/pkgs/development/compilers/flutter/flutter.nix @@ -82,6 +82,10 @@ let "dartSdkVersion": "${dart.version}" } EOF + + # Suppress a small error now that `.gradle`'s location changed. + # Location changed because of the patch "gradle-flutter-tools-wrapper.patch". + mkdir -p "$out/packages/flutter_tools/gradle/.gradle" ''; installPhase = '' diff --git a/pkgs/development/compilers/flutter/versions/3_19/patches/gradle-flutter-tools-wrapper.patch b/pkgs/development/compilers/flutter/versions/3_19/patches/gradle-flutter-tools-wrapper.patch new file mode 100644 index 000000000000..de6080efbba8 --- /dev/null +++ b/pkgs/development/compilers/flutter/versions/3_19/patches/gradle-flutter-tools-wrapper.patch @@ -0,0 +1,44 @@ +This patch introduces an intermediate Gradle build step to alter the behavior +of flutter_tools' Gradle project, specifically moving the creation of `build` +and `.gradle` directories from within the Nix Store to somewhere in `$HOME/.cache/flutter/nix-flutter-tools-gradle/$engineShortRev`. + +Without this patch, flutter_tools' Gradle project tries to generate `build` and `.gradle` +directories within the Nix Store. Resulting in read-only errors when trying to build a +Flutter Android app at runtime. + +This patch takes advantage of the fact settings.gradle takes priority over settings.gradle.kts to build the intermediate Gradle project +when a Flutter app runs `includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")` + +`rootProject.buildFileName = "/dev/null"` so that the intermediate project doesn't use `build.gradle.kts` that's in the same directory. + +The intermediate project makes a `settings.gradle` file in `$HOME/.cache/flutter/nix-flutter-tools-gradle//` and `includeBuild`s it. +This Gradle project will build the actual `packages/flutter_tools/gradle` project by setting +`rootProject.projectDir = new File("$settingsDir")` and `apply from: new File("$settingsDir/settings.gradle.kts")`. + +Now the `.gradle` will be built in `$HOME/.cache/flutter/nix-flutter-tools-gradle//`, but `build` doesn't. +To move `build` to `$HOME/.cache/flutter/nix-flutter-tools-gradle//` as well, we need to set `buildDirectory`. +diff --git a/packages/flutter_tools/gradle/settings.gradle b/packages/flutter_tools/gradle/settings.gradle +new file mode 100644 +index 0000000000..b2485c94b4 +--- /dev/null ++++ b/packages/flutter_tools/gradle/settings.gradle +@@ -0,0 +1,19 @@ ++rootProject.buildFileName = "/dev/null" ++ ++def engineShortRev = (new File("$settingsDir/../../../bin/internal/engine.version")).text.take(10) ++def dir = new File("$System.env.HOME/.cache/flutter/nix-flutter-tools-gradle/$engineShortRev") ++dir.mkdirs() ++def file = new File(dir, "settings.gradle") ++ ++file.text = """ ++rootProject.projectDir = new File("$settingsDir") ++apply from: new File("$settingsDir/settings.gradle.kts") ++ ++gradle.allprojects { project -> ++ project.beforeEvaluate { ++ project.layout.buildDirectory = new File("$dir/build") ++ } ++} ++""" ++ ++includeBuild(dir)