From 0a2788c1b4d0d63e7b9db5b7c7b58f7267cacd3a Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Wed, 4 Mar 2026 19:07:40 +0100 Subject: [PATCH] update flake --- flake.lock | 6 +- flake.nix | 310 ++++++++++++++++++++++++++--------------------------- 2 files changed, 155 insertions(+), 161 deletions(-) diff --git a/flake.lock b/flake.lock index 5e3f45e..a65dbdf 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1770843696, - "narHash": "sha256-LovWTGDwXhkfCOmbgLVA10bvsi/P8eDDpRudgk68HA8=", + "lastModified": 1772479524, + "narHash": "sha256-u7nCaNiMjqvKpE+uZz9hE7pgXXTmm5yvdtFaqzSzUQI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2343bbb58f99267223bc2aac4fc9ea301a155a16", + "rev": "4215e62dc2cd3bc705b0a423b9719ff6be378a43", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index d36501d..6e4caf0 100644 --- a/flake.nix +++ b/flake.nix @@ -14,22 +14,122 @@ rec { # Create a shell (and possibly package) for each possible system, not only x86_64-linux flake-utils.lib.eachDefaultSystem ( system: let + # ========================================================================================= + # Define pkgs/stdenvs + # ========================================================================================= pkgs = import nixpkgs { inherit system; config.allowUnfree = true; overlays = []; }; - inherit (pkgs) lib stdenv; + + clangPkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + overlays = []; + + # Use this to change the compiler: + # - GCC: pkgs.stdenv + # - Clang: pkgs.clangStdenv + # NixOS packages are built using GCC by default. Using clang requires a full rebuild/redownload. + config.replaceStdenv = {pkgs}: pkgs.clangStdenv; + }; windowsPkgs = import nixpkgs { inherit system; + config.allowUnfree = true; + overlays = []; + + # Use this to cross compile to a different system crossSystem = { config = "x86_64-w64-mingw32"; }; - config.allowUnfree = true; - overlays = []; }; + inherit (pkgs) lib stdenv; + + # ========================================================================================= + # Define shell environment + # ========================================================================================= + + # Setup the shell when entering the "nix develop" environment (bash script). + shellHook = let + mkCmakeScript = type: let + typeLower = lib.toLower type; + in + pkgs.writers.writeFish "cmake-${typeLower}.fish" '' + cd $FLAKE_PROJECT_ROOT + + echo "Removing build directory ./cmake-build-${typeLower}/" + rm -rf ./cmake-build-${typeLower} + + echo "Creating build directory" + mkdir cmake-build-${typeLower} + cd cmake-build-${typeLower} + + echo "Running cmake" + cmake -G "Ninja" \ + -DCMAKE_BUILD_TYPE="${type}" \ + .. + + echo "Linking compile_commands.json" + cd .. + ln -sf ./cmake-build-${typeLower}/compile_commands.json ./compile_commands.json + ''; + + cmakeDebug = mkCmakeScript "Debug"; + cmakeRelease = mkCmakeScript "Release"; + + mkBuildScript = type: let + typeLower = lib.toLower type; + in + pkgs.writers.writeFish "cmake-build.fish" '' + cd $FLAKE_PROJECT_ROOT/cmake-build-${typeLower} + + echo "Running cmake" + NIX_ENFORCE_NO_NATIVE=0 cmake --build . -j$(nproc) + ''; + + buildDebug = mkBuildScript "Debug"; + buildRelease = mkBuildScript "Release"; + + # Use this to specify commands that should be ran after entering fish shell + initProjectShell = pkgs.writers.writeFish "init-shell.fish" '' + echo "Entering \"${description}\" environment..." + + # Determine the project root, used e.g. in cmake scripts + set -g -x FLAKE_PROJECT_ROOT (git rev-parse --show-toplevel) + + # C/C++: + abbr -a cmake-debug "${cmakeDebug}" + abbr -a cmake-release "${cmakeRelease}" + abbr -a build-debug "${buildDebug}" + abbr -a build-release "${buildRelease}" + abbr -a debug "${buildDebug} && ./cmake-build-debug/masssprings" + abbr -a release "${buildRelease} && ./cmake-build-release/masssprings" + abbr -a debug-clean "${cmakeDebug} && ${buildDebug} && ./cmake-build-debug/masssprings" + abbr -a release-clean "${cmakeRelease} && ${buildRelease} && ./cmake-build-release/masssprings" + + abbr -a rungdb "${buildDebug} && gdb --tui ./cmake-build-debug/masssprings" + abbr -a runperf "${buildRelease} && perf record -g ./cmake-build-release/masssprings && hotspot ./perf.data" + abbr -a runtracy "tracy -a 127.0.0.1 &; ${buildRelease} && sudo -E ./cmake-build-release/masssprings" + abbr -a runvalgrind "${buildDebug} && valgrind --leak-check=full --show-reachable=no --show-leak-kinds=definite,indirect,possible --track-origins=no --suppressions=valgrind.supp --log-file=valgrind.log ./cmake-build-debug/masssprings && cat valgrind.log" + abbr -a runtests "${buildDebug} && ./cmake-build-debug/tests" + abbr -a runbenchs "${buildRelease} && sudo cpupower frequency-set --governor performance && ./cmake-build-release/benchmarks; sudo cpupower frequency-set --governor powersave" + + abbr -a clusters-rh "${buildRelease} && ./cmake-build-release/masssprings --output=clusters.puzzle --space=rh --w=6 --h=6 --gx=4 --gy=2 --blocks=4" + abbr -a clusters "${buildRelease} && ./cmake-build-release/masssprings clusters.puzzle" + + abbr -a runclion "clion ./CMakeLists.txt 2>/dev/null 1>&2 & disown;" + ''; + in + builtins.concatStringsSep "\n" [ + # Launch into pure fish shell + '' + exec "$(type -p fish)" -C "source ${initProjectShell}" + '' + ]; + # =========================================================================================== # Define custom dependencies # =========================================================================================== @@ -99,29 +199,20 @@ rec { # - Those which are needed on $PATH during the build, for example cmake and pkg-config # - Setup hooks, for example makeWrapper # - Interpreters needed by patchShebangs for build scripts (with the --build flag), which can be the case for e.g. perl + # NOTE: Do not add compiler here, they are provided by the stdenv nativeBuildInputs = with pkgs; [ # Languages: - binutils - gcc + # binutils # C/C++: - gdb - valgrind - # gnumake cmake ninja - # cling - # pkg-config - # clang-tools - # compdb - # pprof - # gprof2dot + gdb + valgrind + kdePackages.kcachegrind perf hotspot - kdePackages.kcachegrind - gdbgui - massif-visualizer - heaptrack + # heaptrack # renderdoc ]; @@ -135,15 +226,18 @@ rec { thread-pool boost - # Debugging + # Debugging/Testing/Profiling tracy-wayland backward-cpp libbfd catch2_3 + gbenchmark ]; + # =========================================================================================== # Define buildable + installable packages # =========================================================================================== + package = stdenv.mkDerivation rec { inherit buildInputs; pname = "masssprings"; @@ -159,6 +253,7 @@ rec { "-DDISABLE_TRACY=On" "-DDISABLE_BACKWARD=On" "-DDISABLE_TESTS=On" + "-DDISABLE_BENCH=On" ]; hardeningDisable = ["all"]; @@ -206,6 +301,8 @@ rec { "-DCMAKE_SYSTEM_NAME=Windows" "-DDISABLE_TRACY=On" "-DDISABLE_BACKWARD=On" + "-DDISABLE_TESTS=On" + "-DDISABLE_BENCH=On" ]; installPhase = '' @@ -227,156 +324,53 @@ rec { # Provide environment for "nix develop" devShells = { default = pkgs.mkShell { - inherit nativeBuildInputs buildInputs; + inherit nativeBuildInputs buildInputs shellHook; name = description; # ========================================================================================= # Define environment variables # ========================================================================================= - # Custom dynamic libraries: - # LD_LIBRARY_PATH = builtins.concatStringsSep ":" [ - # # Rust Bevy GUI app: - # # "${pkgs.xorg.libX11}/lib" - # # "${pkgs.xorg.libXcursor}/lib" - # # "${pkgs.xorg.libXrandr}/lib" - # # "${pkgs.xorg.libXi}/lib" - # # "${pkgs.libGL}/lib" - # - # # JavaFX app: - # # "${pkgs.libGL}/lib" - # # "${pkgs.gtk3}/lib" - # # "${pkgs.glib.out}/lib" - # # "${pkgs.xorg.libXtst}/lib" - # ]; - # Dynamic libraries from buildinputs: LD_LIBRARY_PATH = nixpkgs.lib.makeLibraryPath buildInputs; - - # ========================================================================================= - # Define shell environment - # ========================================================================================= - - # Setup the shell when entering the "nix develop" environment (bash script). - shellHook = let - mkCmakeScript = type: let - typeLower = lib.toLower type; - in - pkgs.writers.writeFish "cmake-${typeLower}.fish" '' - cd $FLAKE_PROJECT_ROOT - - # set -g -x CC ${pkgs.clang}/bin/clang - # set -g -x CXX ${pkgs.clang}/bin/clang++ - - echo "Removing build directory ./cmake-build-${typeLower}/" - rm -rf ./cmake-build-${typeLower} - - echo "Creating build directory" - mkdir cmake-build-${typeLower} - cd cmake-build-${typeLower} - - echo "Running cmake" - cmake -G "Ninja" \ - -DCMAKE_BUILD_TYPE="${type}" \ - .. - - echo "Linking compile_commands.json" - cd .. - ln -sf ./cmake-build-${typeLower}/compile_commands.json ./compile_commands.json - ''; - - cmakeDebug = mkCmakeScript "Debug"; - cmakeRelease = mkCmakeScript "Release"; - - mkBuildScript = type: let - typeLower = lib.toLower type; - in - pkgs.writers.writeFish "cmake-build.fish" '' - cd $FLAKE_PROJECT_ROOT/cmake-build-${typeLower} - - echo "Running cmake" - NIX_ENFORCE_NO_NATIVE=0 cmake --build . -j$(nproc) - ''; - - buildDebug = mkBuildScript "Debug"; - buildRelease = mkBuildScript "Release"; - - # Use this to specify commands that should be ran after entering fish shell - initProjectShell = pkgs.writers.writeFish "init-shell.fish" '' - echo "Entering \"${description}\" environment..." - - # Determine the project root, used e.g. in cmake scripts - set -g -x FLAKE_PROJECT_ROOT (git rev-parse --show-toplevel) - - # C/C++: - abbr -a cmake-debug "${cmakeDebug}" - abbr -a cmake-release "${cmakeRelease}" - abbr -a build-debug "${buildDebug}" - abbr -a build-release "${buildRelease}" - abbr -a debug "${buildDebug} && ./cmake-build-debug/masssprings" - abbr -a release "${buildRelease} && ./cmake-build-release/masssprings" - abbr -a debug-clean "${cmakeDebug} && ${buildDebug} && ./cmake-build-debug/masssprings" - abbr -a release-clean "${cmakeRelease} && ${buildRelease} && ./cmake-build-release/masssprings" - - abbr -a rungdb "${buildDebug} && gdb --tui ./cmake-build-debug/masssprings" - abbr -a runperf "${buildRelease} && perf record -g ./cmake-build-release/masssprings && hotspot ./perf.data" - abbr -a runtracy "tracy -a 127.0.0.1 &; ${buildRelease} && sudo -E ./cmake-build-release/masssprings" - abbr -a runvalgrind "${buildDebug} && valgrind --leak-check=full --show-reachable=no --show-leak-kinds=definite,indirect,possible --track-origins=no --suppressions=valgrind.supp --log-file=valgrind.log ./cmake-build-debug/masssprings && cat valgrind.log" - abbr -a runtests "${buildDebug} && ./cmake-build-debug/tests" - - abbr -a runclion "clion ./CMakeLists.txt 2>/dev/null 1>&2 & disown;" - ''; - in - builtins.concatStringsSep "\n" [ - # Launch into pure fish shell - '' - exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'" - '' - ]; }; - # TODO: Can't get renderdoc in FHS to work + # Provide environment with clang stdenv for "nix develop .#clang" + # TODO: Broken. Clang can't find stdlib headers or library headers (raylib, backward, ...). + # Does the clangStdenv not automatically collect the include paths? + clang = + pkgs.mkShell.override { + stdenv = pkgs.clangStdenv; + } { + inherit shellHook; + name = description; - # FHS environment for renderdoc. Access with "nix develop .#renderdoc". - # https://ryantm.github.io/nixpkgs/builders/special/fhs-environments - # renderdoc = - # (pkgs.buildFHSEnv { - # name = "renderdoc-env"; - # - # targetPkgs = pkgs: - # with pkgs; [ - # # RenderDoc - # renderdoc - # - # # Build tools - # gcc - # cmake - # - # # Raylib - # raylib - # libGL - # mesa - # - # # X11 - # libx11 - # libxcursor - # libxrandr - # libxinerama - # libxi - # libxext - # libxfixes - # - # # Wayland - # wayland - # wayland-protocols - # libxkbcommon - # ]; - # - # runScript = "fish"; - # - # profile = '' - # ''; - # }).env; + nativeBuildInputs = with pkgs; [ + cmake + ninja + ]; + + buildInputs = with pkgs; [ + # C/C++: + raylib + raygui + thread-pool + boost + + # Debugging/Testing/Profiling + backward-cpp + libbfd + catch2_3 + gbenchmark + ]; + + # ========================================================================================= + # Define environment variables + # ========================================================================================= + + # Dynamic libraries from buildinputs: + LD_LIBRARY_PATH = nixpkgs.lib.makeLibraryPath buildInputs; + }; }; } );