From edc7510d8d6ecb4a5aad4d8acc56a013bac59cbf Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Wed, 11 Mar 2026 19:08:59 +0100 Subject: [PATCH] add flake --- flake.lock | 59 +++++++++++++++ flake.nix | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 278 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..7b5b54f --- /dev/null +++ b/flake.lock @@ -0,0 +1,59 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1773110118, + "narHash": "sha256-mPAG8phMbCReKSiKAijjjd3v7uVcJOQ75gSjGJjt/Rk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e607cb5360ff1234862ac9f8839522becb853bb9", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..d1e2994 --- /dev/null +++ b/flake.nix @@ -0,0 +1,219 @@ +rec { + description = "FAIL"; + + inputs = { + nixpkgs.url = "nixpkgs"; # Use nixpkgs from system registry + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + self, + nixpkgs, + flake-utils, + }: + # 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 = []; + }; + + boost174_pkgs = + import (builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/824421b1796332ad1bcb35bc7855da832c43305f.tar.gz"; + sha256 = "sha256:1w6cjnakz1yi66rs8c6nmhymsr7bj82vs2hz200ipi1sfiq8dy4y"; + }) { + inherit system; + }; + + 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 "Unix Makefiles" -DCMAKE_BUILD_TYPE="${type}" -DCMAKE_EXPORT_COMPILE_COMMANDS="On" .. + + 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" + cmake --build . + ''; + + 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) + + # Rust Bevy: + # abbr -a build-release-windows "CARGO_FEATURE_PURE=1 cargo xwin build --release --target x86_64-pc-windows-msvc" + + # C/C++: + # abbr -a cmake-debug "${cmakeDebug}" + # abbr -a cmake-release "${cmakeRelease}" + # abbr -a build-debug "${buildDebug}" + # abbr -a build-release "${buildRelease}" + ''; + in + builtins.concatStringsSep "\n" [ + # Launch into pure fish shell + '' + exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'" + '' + ]; + + # =========================================================================================== + # Define custom dependencies + # =========================================================================================== + + python = pkgs.python314.withPackages (p: + with p; [ + setuptools + flask + flask-mysqldb + pyyaml + ]); + + boost174 = boost174_pkgs.boost174; + + libpcl = stdenv.mkDerivation rec { + pname = "libpcl1"; + version = "1.12-2"; + + src = pkgs.fetchurl { + url = "http://launchpadlibrarian.net/521269537/libpcl1_1.12-2_amd64.deb"; + hash = "sha256-GL3mjPAccAtRMAJPnDMCHiDf6xNvGi4oUWylOIqBjP0="; + }; + + dontBuild = true; + nativeBuildInputs = with pkgs; [ + dpkg + autoPatchelfHook + ]; + + installPhase = '' + runHook preInstall + + ls -al + # dpkg-deb -x ${pname}_${version}_amd64.deb libpcl + + mkdir -p $out/lib + cp -rv usr/lib/x86_64-linux-gnu/* $out/lib/ + + runHook postInstall + ''; + }; + + # =========================================================================================== + # Specify dependencies + # https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependencies-overview + # Just for a "nix develop" shell, buildInputs can be used for everything. + # =========================================================================================== + + # Add dependencies to nativeBuildInputs if they are executed during the build: + # - 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 + nativeBuildInputs = with pkgs; [ + autoPatchelfHook + ]; + + # Add dependencies to buildInputs if they will end up copied or linked into the final output or otherwise used at runtime: + # - Libraries used by compilers, for example zlib + # - Interpreters needed by patchShebangs for scripts which are installed, which can be the case for e.g. perl + buildInputs = with pkgs; [ + python # For resultbrowser + + alsa-lib # libasound.so.2 + boost174 # libboost_coroutine.so.1.74.0, libboost_regex.so.1.74.0, libboost_thread.so.1.74.0 + capstone_4 # libcapstone.so.4 + libdwarf # libdwarf.so.1 + libelf # libelf.so.1 + mariadb-connector-c # libmariadb.so.3 + libpcl # libpcl.so.1 + protobuf # libprotobuf.so.32 + SDL # libSDL-1.2.so.0 + libx11 # libX11.so.6 + libxrandr # libXrandr.so.2 + libz # libz.so.1 + ]; + # =========================================================================================== + # Define buildable + installable packages + # =========================================================================================== + package = stdenv.mkDerivation rec { + inherit nativeBuildInputs buildInputs; + pname = "fail"; + version = "1.0.0"; + src = ./.; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp -rv ./bin $out/bin + cp -rv ./share $out/share + + runHook postInstall + ''; + }; + in rec { + # Provide package for "nix build" + packages = { + default = package; + }; + apps.default = flake-utils.lib.mkApp {drv = package;}; + + devShells = { + # Provide default environment for "nix develop". + # Other environments can be added below. + default = pkgs.mkShell { + inherit nativeBuildInputs buildInputs shellHook; + name = description; + + # ========================================================================================= + # Define environment variables + # ========================================================================================= + + # Dynamic libraries from buildinputs: + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs; + }; + }; + }); +}