{ description = "gpui-servo - a Servo-backed webview component for gpui"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; fenix = { url = "github:nix-community/fenix"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { nixpkgs, fenix, ... }: let systems = ["aarch64-darwin"]; forAllSystems = nixpkgs.lib.genAttrs systems; nixpkgsFor = forAllSystems (system: import nixpkgs {inherit system;}); platform = system: let pkgs = nixpkgsFor.${system}; llvmPackages = pkgs.llvmPackages_20; rustToolchain = fenix.packages.${system}.fromToolchainFile { file = ./rust-toolchain.toml; sha256 = "sha256-9LY9sgDes2oSCyeuCFFAY37gSvElSJEwh5kiXlr76L8="; }; gstPackages = (with pkgs.gst_all_1; [ gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad ]) ++ [pkgs.libnice]; gstPluginFarm = pkgs.symlinkJoin { name = "gpui-servo-gst-plugins"; paths = map (p: p.out) gstPackages; }; # Headers for the CoreMedia/CoreVideo frameworks that gpui and servo's # bindgen steps include at build time. Supplied by nix so builds work # without a system Xcode / Command Line Tools install. appleSdk = pkgs.apple-sdk; in { inherit pkgs llvmPackages rustToolchain gstPackages gstPluginFarm appleSdk; }; in { formatter = forAllSystems (system: let p = platform system; pkgs = p.pkgs; in pkgs.treefmt.withConfig { settings.formatter = { alejandra = { command = pkgs.lib.getExe pkgs.alejandra; includes = ["*.nix"]; }; rustfmt = { command = pkgs.lib.getExe' p.rustToolchain "rustfmt"; includes = ["*.rs"]; }; taplo = { command = pkgs.lib.getExe pkgs.taplo; options = ["fmt"]; includes = ["*.toml"]; }; }; }); devShells = forAllSystems (system: let p = platform system; pkgs = p.pkgs; in { default = (pkgs.mkShell.override {stdenv = p.llvmPackages.stdenv;}) { name = "gpui-servo-dev"; packages = [ p.rustToolchain pkgs.rust-analyzer pkgs.taplo pkgs.nil # servo build tooling pkgs.cmake pkgs.pkg-config pkgs.git pkgs.which pkgs.llvm pkgs.perl pkgs.yasm pkgs.m4 pkgs.python311 pkgs.zlib pkgs.gnumake p.llvmPackages.bintools p.llvmPackages.clang ]; # gstreamer backing for the optional `media` feature buildInputs = p.gstPackages ++ [pkgs.glib pkgs.libiconv]; env = { # gpui pulls in bindgen, which needs libclang at build time. LIBCLANG_PATH = pkgs.lib.makeLibraryPath [p.llvmPackages.clang-unwrapped.lib]; SSL_CERT_FILE = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; GST_PLUGIN_SYSTEM_PATH_1_0 = "${p.gstPluginFarm}/lib/gstreamer-1.0"; CC = "${p.llvmPackages.clang}/bin/clang"; CXX = "${p.llvmPackages.clang}/bin/clang++"; DEVELOPER_DIR = "${p.appleSdk}"; SDKROOT = "${p.appleSdk}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"; }; shellHook = '' unset AS # put nix's clang/ld ahead of the Xcode shims in /usr/bin. export PATH="${p.llvmPackages.clang}/bin:${p.llvmPackages.bintools}/bin:$PATH" ''; }; }); }; }