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; }; }; }); }