From d3f2d1c0b41472c9bd87f927c926e75b7bb486f9 Mon Sep 17 00:00:00 2001 From: Dmitriy Kholkin Date: Mon, 1 Aug 2022 18:49:29 +0300 Subject: [PATCH] minimal working dev env --- flake.nix | 229 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 153 insertions(+), 76 deletions(-) diff --git a/flake.nix b/flake.nix index fcec863..4ebaf8c 100644 --- a/flake.nix +++ b/flake.nix @@ -1,84 +1,161 @@ { - outputs = { self }: { - templates.android = { - path = ./android; - description = - "A flake for getting a dev shell with Android SDK & Flutter using flutter-flake"; + description = "Flutter FHS Environment"; + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flutter-nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + devshell = { + url = "github:numtide/devshell"; + inputs.nixpkgs.follows = "nixpkgs"; }; - lib = let - optional = q: x: optList q [ x ]; - optList = q: xs: if q then xs else [ ]; - optStr = q: str: - if q then '' - ${str} - '' else - ""; - guard = q: k: if q then k else null; + android-nixpkgs = { + url = "github:tadfisher/android-nixpkgs"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; - in { - get-devShell = { nixpkgs, pkgs ? import nixpkgs { + outputs = { self, nixpkgs, flutter-nixpkgs, devshell, android-nixpkgs }: { + getShell = { + pkgs ? import nixpkgs { inherit system; - config = nixpkgsConfig; - }, system, nixpkgsConfig ? { }, enable-android ? false - , enable-linuxDesktop ? false, enable-web ? false - , enable-windowsDesktop ? false, enable-macDesktop ? false - , enable-ios ? false, extra-deps ? [ ], androidConfig ? { } - , chromeExecutable ? pkgs.ungoogled-chromium + "/bin/chromium" }: + config = nixpkgsConfig // { + allowUnfree = true; + android_sdk.accept_license = true; + }; + overlays = [ devshell.overlay ]; + } + , flutter-pkgs ? import flutter-nixpkgs { + inherit system; + } + , name ? "flutter-project", system, nixpkgsConfig ? { } + , enable-android ? false, enable-ios ? false + , enable-linuxDesktop ? false, enable-web ? false + , enable-windowsDesktop ? false, enable-macDesktop ? false + , extra-deps ? [ ], extra-libs ? [ ], jdk ? pkgs.jdk11 + , chromeExecutable ? pkgs.ungoogled-chromium + "/bin/chromium" + , android-sdk ? android-nixpkgs.sdk.${system} (sdkPkgs: with sdkPkgs; [ + cmdline-tools-latest + build-tools-30-0-3 + emulator + patcher-v4 + platform-tools + platforms-android-31 + ]) + }: with pkgs; let + optList = q: xs: if q then xs else [ ]; + linuxLibs = [ + at-spi2-atk + at-spi2-core + dbus + atk + bzip2 + cairo + epoxy + expat + fontconfig + freetype + fribidi + gdk-pixbuf + glib + graphite2 + gtk3 + harfbuzz + libGL + libdatrie + libffi + libjpeg + libpng + libselinux + libsepol + libthai + libtiff + libuuid + libxkbcommon + pango + pcre + pixman + wayland + xorg.libX11 + xorg.libXau + xorg.libXcomposite + xorg.libXcursor + xorg.libXdmcp + xorg.libXext + xorg.libXfixes + xorg.libXft + xorg.libXi + xorg.libXinerama + xorg.libXrandr + xorg.libXrender + xorg.libxcb + xorg.xorgproto + zlib + ]; - let - androidComposition = pkgs.androidenv.composeAndroidPackages { - platformToolsVersion = "31.0.3"; - toolsVersion = "26.1.1"; - includeEmulator = true; - } // androidConfig; - - flutter-deps = optional enable-android androidComposition.androidsdk - ++ optList enable-linuxDesktop (with pkgs; [ - clang - cmake - ninja - pkg-config - # libs: - atk - cairo - epoxy - gdk-pixbuf - glib - gtk3 - harfbuzz - pango - pcre - xorg.libX11.dev - xorg.xorgproto - ]); - - flutter-fhs = pkgs.buildFHSUserEnv { - name = "flutter"; - targetPkgs = (_: flutter-deps); - runScript = pkgs.flutter + "/bin/flutter"; - }; - - in if enable-ios || enable-macDesktop || enable-windowsDesktop then - builtins.throw '' - iOS, macOS and Windows are not supported currently. Feel free to contribute. - '' - else - assert !enable-ios; - assert !enable-macDesktop; - assert !enable-windowsDesktop; - pkgs.mkShell { - packages = with pkgs; [ flutter-fhs ] ++ flutter-deps; - shellHook = optStr enable-android '' - flutter config --enable-android - flutter config --android-sdk ${androidComposition.androidsdk}/libexec/android-sdk - '' + optStr enable-linuxDesktop '' - flutter config --enable-linux-desktop - '' + optStr enable-web '' - export CHROME_EXECUTABLE=${chromeExecutable} - ''; - CPATH = optStr enable-linuxDesktop "${pkgs.xorg.libX11.dev}/include:${pkgs.xorg.xorgproto}/include:${pkgs.epoxy}/lib"; - LD_LIBRARY_PATH = with pkgs; lib.optionals enable-linuxDesktop pkgs.lib.makeLibraryPath [ epoxy gtk3 pango harfbuzz atk cairo gdk-pixbuf glib ]; - }; + flutter-deps = optList enable-android [ + android-sdk + gradle + jdk + ] ++ optList enable-linuxDesktop [ + clang + cmake + ninja + pkg-config + ] + ++ optList enable-linuxDesktop (map lib.getLib linuxLibs) + ++ optList enable-linuxDesktop (map lib.getDev linuxLibs) + ++ (map lib.getLib extra-libs) ++ (map lib.getDev extra-libs); + in pkgs.devshell.mkShell { + name = name; + env = [ + { + name = "PATH"; + prefix = "$HOME/.pub-cache/bin"; + } + { + name = "PATH"; + prefix = "${flutter-pkgs.flutter}/bin/cache/dart-sdk/bin"; + } + ] ++ optList enable-android [ + { + name = "ANDROID_HOME"; + value = "${android-sdk}/share/android-sdk"; + } + { + name = "ANDROID_SDK_ROOT"; + value = "${android-sdk}/share/android-sdk"; + } + { + name = "JAVA_HOME"; + value = jdk.home; + } + ] ++ optList enable-linuxDesktop [ + { + name = "LD_LIBRARY_PATH"; + prefix = "$DEVSHELL_DIR/lib"; + } + { + name = "C_INCLUDE_PATH"; + prefix = "$DEVSHELL_DIR/include"; + } + { + name = "CPLUS_INCLUDE_PATH"; + prefix = "$DEVSHELL_DIR/include"; + } + { + name = "PKG_CONFIG_PATH"; + prefix = "$DEVSHELL_DIR/lib/pkgconfig"; + } + { + name = "CMAKE_PREFIX_PATH"; + prefix = "$DEVSHELL_DIR"; + } + ] ++ optList enable-web [ + { + name = "CHROME_EXECUTABLE"; + value = chromeExecutable; + } + ]; + packages = [ flutter-pkgs.flutter ] ++ flutter-deps ++ extra-deps; }; }; }