{ description = "C/C++ environment"; inputs = { nixos-asahi.url = "github:zzywysm/nixos-asahi"; nixpkgs.url = "github:NixOS/nixpkgs"; treefmt-nix.url = "github:numtide/treefmt-nix"; utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, nixos-asahi, treefmt-nix, utils, ... }: utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs { inherit system; config = { allowUnfree = true; allowUnsupportedSystem = true; }; }; stdenv = if pkgs.hostPlatform.isLinux then pkgs.stdenvAdapters.useMoldLinker pkgs.llvmPackages_18.libcxxStdenv else pkgs.llvmPackages_18.libcxxStdenv; sources = import ./_sources/generated.nix { inherit (pkgs) fetchFromGitHub fetchgit fetchurl dockerTools; }; mkPkg = name: pkgs.${name}.overrideAttrs { inherit (sources.${name}) pname version src; }; fmt = mkPkg "fmt"; imgui = (mkPkg "imgui").override { IMGUI_BUILD_GLFW_BINDING = true; IMGUI_BUILD_VULKAN_BINDING = true; }; deps = with pkgs; [ fmt glfw glm imgui shaderc.dev shaderc.lib vulkan-extension-layer vulkan-memory-allocator vulkan-utility-libraries vulkan-loader vulkan-tools ]; in with pkgs; rec { packages = rec { graphics-test = stdenv.mkDerivation { name = "graphics-test"; version = "0.1.0"; src = self; nativeBuildInputs = [ meson ninja pkg-config ]; buildInputs = deps; configurePhase = '' meson setup build ''; buildPhase = '' meson compile -C build ''; installPhase = '' mkdir -p $out/bin mv build/graphics-test $out/bin/graphics-test ''; }; default = graphics-test; }; formatter = treefmt-nix.lib.mkWrapper pkgs { projectRootFile = "flake.nix"; programs = { alejandra.enable = true; clang-format = { enable = true; package = pkgs.llvmPackages_18.clang-tools; }; }; }; devShell = mkShell.override {inherit stdenv;} { buildInputs = [ alejandra bear cmake (llvmPackages_18.clang-tools.override {enableLibcxx = true;}) lldb meson nil ninja nvfetcher pkg-config unzip (writeScriptBin "build" "meson compile -C build") (writeScriptBin "clean" "meson setup build --wipe") (writeScriptBin "reconfigure" "meson setup build --reconfigure") (writeScriptBin "run" "meson compile -C build && build/${packages.default.name}") ] ++ deps; VULKAN_SDK = "${vulkan-headers}"; VK_LAYER_PATH = "${vulkan-validation-layers}/share/vulkan/explicit_layer.d"; VK_ICD_FILENAMES = if stdenv.isDarwin then "${darwin.moltenvk}/share/vulkan/icd.d/MoltenVK_icd.json" else let vulkanDir = if stdenv.hostPlatform.isx86_64 then "${mesa.drivers}/share/vulkan/icd.d" else "${nixos-asahi.packages.aarch64-linux.mesa-asahi-edge.drivers}/share/vulkan/icd.d"; vulkanFiles = builtins.filter (file: builtins.match ".*\\.json$" file != null) (builtins.attrNames (builtins.readDir vulkanDir)); vulkanPaths = lib.concatStringsSep ":" (map (file: "${vulkanDir}/${file}") vulkanFiles); in if stdenv.hostPlatform.isx86_64 then "${linuxPackages_latest.nvidia_x11_beta}/share/vulkan/icd.d/nvidia_icd.x86_64.json:${vulkanPaths}" else vulkanPaths; shellHook = '' export PATH="${llvmPackages_18.clang-tools.override {enableLibcxx = true;}}/bin:$PATH" ''; name = "C++"; }; } ); }