From 02c89242b100a21389a96c77584daee30d9f9b09 Mon Sep 17 00:00:00 2001 From: David Chavez Date: Wed, 17 Dec 2025 10:25:55 +0100 Subject: [PATCH 1/5] Add devenv / nix configuration --- devenv.nix | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++ devenv.yaml | 5 ++ 2 files changed, 162 insertions(+) create mode 100644 devenv.nix create mode 100644 devenv.yaml diff --git a/devenv.nix b/devenv.nix new file mode 100644 index 0000000..bc5e528 --- /dev/null +++ b/devenv.nix @@ -0,0 +1,157 @@ +{ + pkgs, + lib, + inputs, + ... +}: +{ + # https://devenv.sh/basics/ + + # https://devenv.sh/packages/ + packages = + (with pkgs; [ + # + # Common development tools + # + cmake + ninja + pkg-config + git + + # Development tools (system compiler will be used) + lldb + + # Graphics development dependencies + vulkan-headers + vulkan-loader + vulkan-tools + spirv-tools + spirv-headers + glslang + + # Platform-specific shader compilers + shaderc + + # Math library for examples + glm + ]) + # macOS specific packages + ++ lib.optionals pkgs.stdenv.isDarwin [ + pkgs.directx-shader-compiler + pkgs.moltenvk + pkgs.vulkan-validation-layers + ] + ++ lib.optionals (!pkgs.stdenv.isDarwin) [ + pkgs.directx-shader-compiler + ] + # SDL2 from pinned nixpkgs + ++ [ inputs.nixpkgs-sdl2.legacyPackages.${pkgs.system}.SDL2 ] + ++ lib.optionals pkgs.stdenv.isLinux (with pkgs; [ + # + # Linux specific packages + # + clang + clang-tools + libGL + libxkbcommon + wayland + wayland-protocols + mesa + xorg.libX11 + xorg.libXrandr + xorg.libXi + vulkan-validation-layers + ]) + # Note: On macOS, we use the system SDK via Xcode, so we don't need + # to include Darwin frameworks from nixpkgs here. + ; + + # Environment variables + env = { + # CMake build type for development + CMAKE_BUILD_TYPE = "Debug"; + + # Help CMake find SDL2 and GLM (using pinned SDL2) + SDL2_ROOT = "${inputs.nixpkgs-sdl2.legacyPackages.${pkgs.system}.SDL2}"; + CMAKE_PREFIX_PATH = "${inputs.nixpkgs-sdl2.legacyPackages.${pkgs.system}.SDL2}:${pkgs.glm}"; + } // lib.optionalAttrs pkgs.stdenv.isLinux { + # Vulkan environment for Linux + VK_LAYER_PATH = "${pkgs.vulkan-validation-layers}/share/vulkan/explicit_layer.d"; + VK_INSTANCE_LAYERS = "VK_LAYER_KHRONOS_validation"; + } // lib.optionalAttrs pkgs.stdenv.isDarwin { + # Vulkan environment for macOS (MoltenVK from nixpkgs) + VK_ICD_FILENAMES = "${pkgs.moltenvk}/share/vulkan/icd.d/MoltenVK_icd.json"; + VK_LAYER_PATH = "${pkgs.vulkan-validation-layers}/share/vulkan/explicit_layer.d"; + }; + + # https://devenv.sh/scripts/ + scripts = { + configure.exec = '' + echo "Configuring build with CMake..." + ${if pkgs.stdenv.isDarwin then '' + # Dynamically find active Xcode path + export DEVELOPER_DIR="$(xcode-select -p)" + export SDKROOT="$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" + # Clear ALL Nix environment variables that interfere with system toolchain + unset CPATH LIBRARY_PATH NIX_CFLAGS_COMPILE NIX_LDFLAGS NIX_CPPFLAGS NIX_CXXSTDLIB_COMPILE \ + CMAKE_PREFIX_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH C_INCLUDE_PATH + echo "Using Xcode: $DEVELOPER_DIR" + echo "Using SDK: $SDKROOT" + echo "Using MoltenVK from nix: ${pkgs.moltenvk}" + # Use system compiler with deployment target for maximumFramesPerSecond support + cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Debug -DPLUME_BUILD_EXAMPLES=ON \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 \ + -DCMAKE_OSX_SYSROOT="$SDKROOT" \ + -DCMAKE_C_COMPILER="/usr/bin/clang" \ + -DCMAKE_CXX_COMPILER="/usr/bin/clang++" \ + -DCMAKE_CXX_FLAGS="-stdlib=libc++" \ + -DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++" + '' else '' + cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Debug -DPLUME_BUILD_EXAMPLES=ON + ''} + ''; + + build.exec = '' + echo "Building project..." + ${if pkgs.stdenv.isDarwin then '' + # Dynamically find active Xcode path + export DEVELOPER_DIR="$(xcode-select -p)" + export SDKROOT="$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" + unset CPATH LIBRARY_PATH NIX_CFLAGS_COMPILE NIX_LDFLAGS NIX_CPPFLAGS NIX_CXXSTDLIB_COMPILE \ + CMAKE_PREFIX_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH C_INCLUDE_PATH + '' else ""} + cmake --build build + ''; + + clean.exec = '' + echo "Cleaning build directory..." + rm -rf build build-xcode + ''; + + run-triangle.exec = '' + echo "Running triangle example..." + ${if pkgs.stdenv.isDarwin then '' + export VK_ICD_FILENAMES="${pkgs.moltenvk}/share/vulkan/icd.d/MoltenVK_icd.json" + export VK_LAYER_PATH="${pkgs.vulkan-validation-layers}/share/vulkan/explicit_layer.d" + export DYLD_LIBRARY_PATH="${pkgs.vulkan-loader}/lib:''${DYLD_LIBRARY_PATH:-}" + '' else ""} + ./build/bin/plume_triangle + ''; + + run-cube.exec = '' + echo "Running cube example..." + ${if pkgs.stdenv.isDarwin then '' + export VK_ICD_FILENAMES="${pkgs.moltenvk}/share/vulkan/icd.d/MoltenVK_icd.json" + export VK_LAYER_PATH="${pkgs.vulkan-validation-layers}/share/vulkan/explicit_layer.d" + export DYLD_LIBRARY_PATH="${pkgs.vulkan-loader}/lib:''${DYLD_LIBRARY_PATH:-}" + '' else ""} + ./build/bin/plume_cube + ''; + }; + + # https://devenv.sh/languages/ + languages = { + c.enable = true; + cplusplus.enable = true; + }; +} diff --git a/devenv.yaml b/devenv.yaml new file mode 100644 index 0000000..f67efcc --- /dev/null +++ b/devenv.yaml @@ -0,0 +1,5 @@ +inputs: + nixpkgs: + url: github:cachix/devenv-nixpkgs/rolling + nixpkgs-sdl2: + url: github:NixOS/nixpkgs/nixos-24.05 From 185e57948f6e79cb7237a100c3abc70d0206cd69 Mon Sep 17 00:00:00 2001 From: David Chavez Date: Wed, 17 Dec 2025 10:27:01 +0100 Subject: [PATCH 2/5] Update workflows --- .github/workflows/validate.yml | 126 ++++++++++++++------------------- 1 file changed, 55 insertions(+), 71 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 89a3391..5a610df 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -9,19 +9,58 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: - build: + build-unix: runs-on: ${{ matrix.os }} strategy: matrix: type: [Debug, Release] - os: - [ - ubuntu-22.04, - ubuntu-22.04-arm, - windows-latest, - macos-15-intel, - macos-15, - ] + os: [ubuntu-22.04, ubuntu-22.04-arm, macos-15-intel, macos-15] + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Nix + uses: cachix/install-nix-action@v31 + + - name: Install devenv + uses: cachix/cachix-action@v16 + with: + name: devenv + + - run: nix profile install nixpkgs#devenv + + - name: Build with devenv + shell: devenv shell bash -- -e {0} + run: | + cmake -B build -S . -G Ninja \ + -DCMAKE_BUILD_TYPE=${{ matrix.type }} \ + -DPLUME_BUILD_EXAMPLES=ON + cmake --build build --target plume + cmake --build build --target plume_triangle + + - name: Upload Linux Build + if: runner.os == 'Linux' + uses: actions/upload-artifact@v4 + with: + name: plume-linux-${{ matrix.type }}-${{ matrix.os }} + path: | + build/bin/plume_triangle + + - name: Upload macOS Build + if: runner.os == 'macOS' + uses: actions/upload-artifact@v4 + with: + name: plume-macos-${{ matrix.type }}-${{ matrix.os }} + path: | + build/bin/plume_triangle + + build-windows: + runs-on: windows-latest + strategy: + matrix: + type: [Debug, Release] steps: - name: Checkout uses: actions/checkout@v4 @@ -31,10 +70,9 @@ jobs: - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: - key: ${{ runner.os }}-plume-ccache-${{ matrix.type }} + key: windows-plume-ccache-${{ matrix.type }} - name: Install Windows Dependencies - if: runner.os == 'Windows' run: | choco install ninja vcpkg install sdl2 --triplet x64-windows-static @@ -42,48 +80,11 @@ jobs: Remove-Item -Path "C:\ProgramData\Chocolatey\bin\ccache.exe" -Force -ErrorAction SilentlyContinue "C:\vcpkg\installed\x64-windows-static\bin" >> $env:GITHUB_PATH - - name: Install Linux Dependencies - if: runner.os == 'Linux' - run: | - sudo apt-get update - sudo apt-get install -y ninja-build libsdl2-dev libgtk-3-dev - - # Install SDL2 - echo ::group::install SDL2 - wget https://www.libsdl.org/release/SDL2-2.26.1.tar.gz - tar -xzf SDL2-2.26.1.tar.gz - cd SDL2-2.26.1 - ./configure - make -j 10 - sudo make install - sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/ - echo ::endgroup:: - - # Enable ccache - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - - - name: Install macOS Dependencies - if: runner.os == 'macOS' - run: | - brew install ninja sdl2 - - name: Configure Developer Command Prompt - if: runner.os == 'Windows' uses: ilammy/msvc-dev-cmd@v1 - - name: Build Plume (Unix) - if: runner.os != 'Windows' - run: |- - # enable ccache - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" - - cmake -DCMAKE_BUILD_TYPE=${{ matrix.type }} -DPLUME_BUILD_EXAMPLES=ON -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_MAKE_PROGRAM=ninja -G Ninja -S . -B cmake-build - cmake --build cmake-build --config ${{ matrix.type }} --target plume - cmake --build cmake-build --config ${{ matrix.type }} --target plume_triangle - - - name: Build Plume (Windows) - if: runner.os == 'Windows' - run: |- + - name: Build Plume + run: | # enable ccache set $env:PATH="$env:USERPROFILE/.cargo/bin;$env:PATH" $cpuCores = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors @@ -91,30 +92,13 @@ jobs: # remove LLVM from PATH so it doesn't overshadow the one provided by VS $env:PATH = ($env:PATH -split ';' | Where-Object { $_ -ne 'C:\Program Files\LLVM\bin' }) -join ';' - cmake -DCMAKE_BUILD_TYPE=${{ matrix.type }} -DPLUME_BUILD_EXAMPLES=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER=clang-cl -DCMAKE_MAKE_PROGRAM=ninja -G Ninja -S . -B cmake-build - cmake --build cmake-build --config ${{ matrix.type }} --target plume -j $cpuCores - cmake --build cmake-build --config ${{ matrix.type }} --target plume_triangle -j $cpuCores + cmake -DCMAKE_BUILD_TYPE=${{ matrix.type }} -DPLUME_BUILD_EXAMPLES=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER=clang-cl -DCMAKE_MAKE_PROGRAM=ninja -G Ninja -S . -B build + cmake --build build --config ${{ matrix.type }} --target plume -j $cpuCores + cmake --build build --config ${{ matrix.type }} --target plume_triangle -j $cpuCores - name: Upload Windows Build - if: runner.os == 'Windows' uses: actions/upload-artifact@v4 with: name: plume-windows-${{ matrix.type }} path: | - cmake-build/bin/plume_triangle.exe - - - name: Upload Linux Build - if: runner.os == 'Linux' - uses: actions/upload-artifact@v4 - with: - name: plume-linux-${{ matrix.type }}-${{ matrix.os }} - path: | - cmake-build/bin/plume_triangle - - - name: Upload macOS Build - if: runner.os == 'macOS' - uses: actions/upload-artifact@v4 - with: - name: plume-macos-${{ matrix.type }}-${{ matrix.os }} - path: | - cmake-build/bin/plume_triangle + build/bin/plume_triangle.exe From d7e6eaf64c1c437db3027991c6e527beabe7e2bd Mon Sep 17 00:00:00 2001 From: David Chavez Date: Wed, 17 Dec 2025 10:40:38 +0100 Subject: [PATCH 3/5] Also build cube example --- .github/workflows/validate.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 5a610df..c9780a3 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -39,6 +39,7 @@ jobs: -DPLUME_BUILD_EXAMPLES=ON cmake --build build --target plume cmake --build build --target plume_triangle + cmake --build build --target plume_cube - name: Upload Linux Build if: runner.os == 'Linux' @@ -47,6 +48,7 @@ jobs: name: plume-linux-${{ matrix.type }}-${{ matrix.os }} path: | build/bin/plume_triangle + build/bin/plume_cube - name: Upload macOS Build if: runner.os == 'macOS' @@ -55,6 +57,7 @@ jobs: name: plume-macos-${{ matrix.type }}-${{ matrix.os }} path: | build/bin/plume_triangle + build/bin/plume_cube build-windows: runs-on: windows-latest @@ -95,6 +98,7 @@ jobs: cmake -DCMAKE_BUILD_TYPE=${{ matrix.type }} -DPLUME_BUILD_EXAMPLES=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER=clang-cl -DCMAKE_MAKE_PROGRAM=ninja -G Ninja -S . -B build cmake --build build --config ${{ matrix.type }} --target plume -j $cpuCores cmake --build build --config ${{ matrix.type }} --target plume_triangle -j $cpuCores + cmake --build build --config ${{ matrix.type }} --target plume_cube -j $cpuCores - name: Upload Windows Build uses: actions/upload-artifact@v4 @@ -102,3 +106,4 @@ jobs: name: plume-windows-${{ matrix.type }} path: | build/bin/plume_triangle.exe + build/bin/plume_cube.exe From 881d474386dcac38f920ad479c9fb84fa9795349 Mon Sep 17 00:00:00 2001 From: David Chavez Date: Wed, 17 Dec 2025 11:31:34 +0100 Subject: [PATCH 4/5] Simplify --- devenv.nix | 48 +++++++++++++++--------------------------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/devenv.nix b/devenv.nix index bc5e528..fa72999 100644 --- a/devenv.nix +++ b/devenv.nix @@ -18,9 +18,6 @@ pkg-config git - # Development tools (system compiler will be used) - lldb - # Graphics development dependencies vulkan-headers vulkan-loader @@ -52,6 +49,7 @@ # clang clang-tools + lldb libGL libxkbcommon wayland @@ -88,44 +86,17 @@ scripts = { configure.exec = '' echo "Configuring build with CMake..." - ${if pkgs.stdenv.isDarwin then '' - # Dynamically find active Xcode path - export DEVELOPER_DIR="$(xcode-select -p)" - export SDKROOT="$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" - # Clear ALL Nix environment variables that interfere with system toolchain - unset CPATH LIBRARY_PATH NIX_CFLAGS_COMPILE NIX_LDFLAGS NIX_CPPFLAGS NIX_CXXSTDLIB_COMPILE \ - CMAKE_PREFIX_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH C_INCLUDE_PATH - echo "Using Xcode: $DEVELOPER_DIR" - echo "Using SDK: $SDKROOT" - echo "Using MoltenVK from nix: ${pkgs.moltenvk}" - # Use system compiler with deployment target for maximumFramesPerSecond support - cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Debug -DPLUME_BUILD_EXAMPLES=ON \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 \ - -DCMAKE_OSX_SYSROOT="$SDKROOT" \ - -DCMAKE_C_COMPILER="/usr/bin/clang" \ - -DCMAKE_CXX_COMPILER="/usr/bin/clang++" \ - -DCMAKE_CXX_FLAGS="-stdlib=libc++" \ - -DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++" - '' else '' - cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Debug -DPLUME_BUILD_EXAMPLES=ON - ''} + cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Debug -DPLUME_BUILD_EXAMPLES=ON ''; build.exec = '' echo "Building project..." - ${if pkgs.stdenv.isDarwin then '' - # Dynamically find active Xcode path - export DEVELOPER_DIR="$(xcode-select -p)" - export SDKROOT="$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" - unset CPATH LIBRARY_PATH NIX_CFLAGS_COMPILE NIX_LDFLAGS NIX_CPPFLAGS NIX_CXXSTDLIB_COMPILE \ - CMAKE_PREFIX_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH C_INCLUDE_PATH - '' else ""} cmake --build build ''; clean.exec = '' echo "Cleaning build directory..." - rm -rf build build-xcode + rm -rf build ''; run-triangle.exec = '' @@ -150,8 +121,19 @@ }; # https://devenv.sh/languages/ - languages = { + # On macOS we use Xcode's clang via enterShell PATH override + languages = lib.optionalAttrs pkgs.stdenv.isLinux { c.enable = true; cplusplus.enable = true; }; + + # On macOS, use Xcode toolchain instead of Nix's + enterShell = lib.optionalString pkgs.stdenv.isDarwin '' + export DEVELOPER_DIR="$(/usr/bin/readlink /var/db/xcode_select_link)" + export SDKROOT="$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" + # Use system clang instead of Nix's clang-wrapper + export PATH="$DEVELOPER_DIR/Toolchains/XcodeDefault.xctoolchain/usr/bin:$DEVELOPER_DIR/usr/bin:$PATH" + # Use system xcrun instead of Nix's xcbuild version (avoids Metal compiler warnings) + export PATH="${pkgs.runCommand "xcrun-wrapper" {} "mkdir -p $out/bin && ln -s /usr/bin/xcrun $out/bin/xcrun"}/bin:$PATH" + ''; } From ae9418f0d676ee24a93473b8ed2da4eafa26d0a4 Mon Sep 17 00:00:00 2001 From: David Chavez Date: Wed, 17 Dec 2025 11:39:40 +0100 Subject: [PATCH 5/5] More cleanup --- devenv.nix | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/devenv.nix b/devenv.nix index fa72999..159e543 100644 --- a/devenv.nix +++ b/devenv.nix @@ -10,9 +10,7 @@ # https://devenv.sh/packages/ packages = (with pkgs; [ - # # Common development tools - # cmake ninja pkg-config @@ -26,27 +24,24 @@ spirv-headers glslang - # Platform-specific shader compilers + # Shader compilers shaderc + directx-shader-compiler + + # Vulkan validation + vulkan-validation-layers # Math library for examples glm ]) # macOS specific packages ++ lib.optionals pkgs.stdenv.isDarwin [ - pkgs.directx-shader-compiler pkgs.moltenvk - pkgs.vulkan-validation-layers - ] - ++ lib.optionals (!pkgs.stdenv.isDarwin) [ - pkgs.directx-shader-compiler ] # SDL2 from pinned nixpkgs ++ [ inputs.nixpkgs-sdl2.legacyPackages.${pkgs.system}.SDL2 ] ++ lib.optionals pkgs.stdenv.isLinux (with pkgs; [ - # # Linux specific packages - # clang clang-tools lldb @@ -58,7 +53,6 @@ xorg.libX11 xorg.libXrandr xorg.libXi - vulkan-validation-layers ]) # Note: On macOS, we use the system SDK via Xcode, so we don't need # to include Darwin frameworks from nixpkgs here. @@ -131,8 +125,10 @@ enterShell = lib.optionalString pkgs.stdenv.isDarwin '' export DEVELOPER_DIR="$(/usr/bin/readlink /var/db/xcode_select_link)" export SDKROOT="$DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" + # Use system clang instead of Nix's clang-wrapper export PATH="$DEVELOPER_DIR/Toolchains/XcodeDefault.xctoolchain/usr/bin:$DEVELOPER_DIR/usr/bin:$PATH" + # Use system xcrun instead of Nix's xcbuild version (avoids Metal compiler warnings) export PATH="${pkgs.runCommand "xcrun-wrapper" {} "mkdir -p $out/bin && ln -s /usr/bin/xcrun $out/bin/xcrun"}/bin:$PATH" '';