about summary refs log tree commit diff
path: root/pkgs/development/compilers/flutter/engine/package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/compilers/flutter/engine/package.nix')
-rw-r--r--pkgs/development/compilers/flutter/engine/package.nix311
1 files changed, 311 insertions, 0 deletions
diff --git a/pkgs/development/compilers/flutter/engine/package.nix b/pkgs/development/compilers/flutter/engine/package.nix
new file mode 100644
index 0000000000000..6f87b28f19098
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine/package.nix
@@ -0,0 +1,311 @@
+{
+  lib,
+  callPackage,
+  writeText,
+  symlinkJoin,
+  targetPlatform,
+  hostPlatform,
+  darwin,
+  clang,
+  llvm,
+  tools ? callPackage ./tools.nix { inherit hostPlatform; },
+  stdenv,
+  stdenvNoCC,
+  runCommand,
+  patchelf,
+  xorg,
+  libglvnd,
+  libepoxy,
+  wayland,
+  freetype,
+  pango,
+  glib,
+  harfbuzz,
+  cairo,
+  gdk-pixbuf,
+  at-spi2-atk,
+  zlib,
+  gtk3,
+  pkg-config,
+  ninja,
+  python3,
+  git,
+  version,
+  flutterVersion,
+  dartSdkVersion,
+  hashes,
+  patches,
+  url,
+  runtimeMode ? "release",
+  isOptimized ? true,
+}:
+with lib;
+let
+  expandSingleDep =
+    dep: lib.optionals (lib.isDerivation dep) ([ dep ] ++ map (output: dep.${output}) dep.outputs);
+
+  expandDeps = deps: flatten (map expandSingleDep deps);
+
+  constants = callPackage ./constants.nix { inherit targetPlatform; };
+
+  src = callPackage ./source.nix {
+    inherit
+      tools
+      version
+      hashes
+      url
+      ;
+  };
+in
+stdenv.mkDerivation {
+  pname = "flutter-engine-${runtimeMode}${lib.optionalString (!isOptimized) "-unopt"}";
+  inherit
+    version
+    runtimeMode
+    patches
+    isOptimized
+    dartSdkVersion
+    src;
+
+  toolchain = symlinkJoin {
+    name = "flutter-engine-toolchain-${version}";
+
+    paths =
+      expandDeps (
+        optionals (stdenv.isLinux) [
+          gtk3
+          wayland
+          libepoxy
+          libglvnd
+          freetype
+          at-spi2-atk
+          glib
+          gdk-pixbuf
+          harfbuzz
+          pango
+          cairo
+          xorg.libxcb
+          xorg.libX11
+          xorg.libXcursor
+          xorg.libXrandr
+          xorg.libXrender
+          xorg.libXinerama
+          xorg.libXi
+          xorg.libXext
+          xorg.libXfixes
+          xorg.libXxf86vm
+          xorg.xorgproto
+          zlib
+        ]
+        ++ optionals (stdenv.isDarwin) [
+          clang
+          llvm
+        ]
+      )
+      ++ [
+        stdenv.cc.libc_dev
+        stdenv.cc.libc_lib
+      ];
+
+    postBuild = ''
+      ln -s /nix $out/nix
+    '';
+  };
+
+  nativeBuildInputs =
+    [
+      python3
+      (tools.vpython python3)
+      git
+      pkg-config
+      ninja
+    ]
+    ++ lib.optionals (stdenv.isLinux) [ patchelf ]
+    ++ optionals (stdenv.isDarwin) [
+      darwin.system_cmds
+      darwin.xcode
+      tools.xcode-select
+    ]
+    ++ lib.optionals (stdenv.cc.libc ? bin) [ stdenv.cc.libc.bin ];
+
+  buildInputs = [ gtk3 ];
+
+  patchtools =
+    let
+      buildtoolsPath =
+        if lib.versionAtLeast flutterVersion "3.21" then "flutter/buildtools" else "buildtools";
+    in
+    [
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/clang-apply-replacements"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/clang-doc"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/clang-format"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/clang-include-fixer"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/clang-refactor"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/clang-scan-deps"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/clang-tidy"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/clangd"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/dsymutil"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/find-all-symbols"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/lld"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-ar"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-bolt"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-cov"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-cxxfilt"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-debuginfod-find"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-dwarfdump"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-dwp"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-gsymutil"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-ifs"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-libtool-darwin"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-lipo"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-ml"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-mt"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-nm"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-objcopy"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-objdump"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-pdbutil"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-profdata"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-rc"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-readobj"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-size"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-symbolizer"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-undname"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm-xray"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/llvm"
+      "${buildtoolsPath}/${constants.alt-platform}/clang/bin/sancov"
+      "flutter/prebuilts/${constants.alt-platform}/dart-sdk/bin/dartaotruntime"
+      "flutter/prebuilts/${constants.alt-platform}/dart-sdk/bin/dart"
+      "flutter/third_party/gn/gn"
+      "third_party/dart/tools/sdks/dart-sdk/bin/dart"
+    ];
+
+  dontPatch = true;
+
+  patchgit = [
+    "third_party/dart"
+    "flutter"
+    "."
+  ] ++ lib.optional (lib.versionAtLeast flutterVersion "3.21") "flutter/third_party/skia";
+
+  postUnpack = ''
+    pushd ${src.name}
+    ${lib.optionalString (stdenv.isLinux) ''
+      for patchtool in ''${patchtools[@]}; do
+        patchelf src/$patchtool --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker)
+      done
+    ''}
+
+    for dir in ''${patchgit[@]}; do
+      pushd src/$dir
+      rev=$(cat .git/HEAD)
+      rm -rf .git
+      git init
+      git add .
+      git config user.name "nobody"
+      git config user.email "nobody@local.host"
+      git commit -a -m "$rev"
+      popd
+    done
+
+    src/flutter/prebuilts/${constants.alt-platform}/dart-sdk/bin/dart src/third_party/dart/tools/generate_package_config.dart
+    cp ${./pkg-config.py} src/build/config/linux/pkg-config.py
+    echo "${dartSdkVersion}" >src/third_party/dart/sdk/version
+
+    rm -rf src/third_party/angle/.git
+    python3 src/flutter/tools/pub_get_offline.py
+
+    pushd src/flutter
+
+    for p in ''${patches[@]}; do
+      patch -p1 -i $p
+    done
+
+    popd
+    popd
+  '';
+
+  configureFlags =
+    [
+      "--no-prebuilt-dart-sdk"
+      "--embedder-for-target"
+      "--no-goma"
+    ]
+    ++ optionals (targetPlatform.isx86_64 == false) [
+      "--linux"
+      "--linux-cpu ${constants.alt-arch}"
+    ];
+
+  # NOTE: Once https://github.com/flutter/flutter/issues/127606 is fixed, use "--no-prebuilt-dart-sdk"
+  configurePhase =
+    ''
+      runHook preConfigure
+
+      export PYTHONPATH=$src/src/build
+    ''
+    + lib.optionalString stdenv.isDarwin ''
+      export PATH=${darwin.xcode}/Contents/Developer/usr/bin/:$PATH
+    ''
+    + ''
+      python3 ./src/flutter/tools/gn $configureFlags \
+        --runtime-mode $runtimeMode \
+        --out-dir $out \
+        --target-sysroot $toolchain \
+        --target-dir host_$runtimeMode${lib.optionalString (!isOptimized) "_unopt --unoptimized"} \
+        --verbose
+
+      runHook postConfigure
+    '';
+
+  buildPhase = ''
+    runHook preBuild
+
+    export TERM=dumb
+    for tool in flatc scenec gen_snapshot dart impellerc shader_archiver gen_snapshot_product; do
+      ninja -C $out/out/host_$runtimeMode${
+        lib.optionalString (!isOptimized) "_unopt"
+      } -j$NIX_BUILD_CORES $tool
+      ${lib.optionalString (stdenv.isLinux) ''
+        patchelf $out/out/host_$runtimeMode${
+          lib.optionalString (!isOptimized) "_unopt"
+        }/$tool --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker)
+      ''}
+    done
+
+    ninja -C $out/out/host_$runtimeMode${lib.optionalString (!isOptimized) "_unopt"} -j$NIX_BUILD_CORES
+
+    ${lib.optionalString (stdenv.isLinux) ''
+      patchelf $out/out/host_$runtimeMode${
+        lib.optionalString (!isOptimized) "_unopt"
+      }/dart-sdk/bin/dartaotruntime \
+        --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker)
+    ''}
+
+    runHook postBuild
+  '';
+
+  # Link sources so we can set $FLUTTER_ENGINE to this derivation
+  installPhase = ''
+    runHook preInstall
+
+    for dir in $(find $src/src -mindepth 1 -maxdepth 1); do
+      ln -sf $dir $out/$(basename $dir)
+    done
+
+    runHook postInstall
+  '';
+
+  meta = {
+    # Very broken on Darwin
+    broken = stdenv.isDarwin;
+    description = "The Flutter engine";
+    homepage = "https://flutter.dev";
+    maintainers = with maintainers; [ RossComputerGuy ];
+    license = licenses.bsd3;
+    platforms = [
+      "x86_64-linux"
+      "aarch64-linux"
+      "x86_64-darwin"
+      "aarch64-darwin"
+    ];
+  };
+}