{ lib , stdenv , mkMesonDerivation , releaseTools , meson , ninja , pkg-config , bison , flex , cmake # for resolving toml11 dep , nix-util , nix-store , nix-fetchers , boost , boehmgc , nlohmann_json , toml11 # Configuration Options , versionSuffix ? "" # Whether to use garbage collection for the Nix language evaluator. # # If it is disabled, we just leak memory, but this is not as bad as it # sounds so long as evaluation just takes places within short-lived # processes. (When the process exits, the memory is reclaimed; it is # only leaked *within* the process.) # # Temporarily disabled on Windows because the `GC_throw_bad_alloc` # symbol is missing during linking. , enableGC ? !stdenv.hostPlatform.isWindows }: let inherit (lib) fileset; version = lib.fileContents ./.version + versionSuffix; in mkMesonDerivation (finalAttrs: { pname = "nix-expr"; inherit version; workDir = ./.; fileset = fileset.unions [ ../../build-utils-meson ./build-utils-meson ../../.version ./.version ./meson.build ./meson.options ./primops/meson.build (fileset.fileFilter (file: file.hasExt "cc") ./.) (fileset.fileFilter (file: file.hasExt "hh") ./.) ./lexer.l ./parser.y (fileset.fileFilter (file: file.hasExt "nix") ./.) ]; outputs = [ "out" "dev" ]; nativeBuildInputs = [ meson ninja pkg-config bison flex cmake ]; buildInputs = [ toml11 ]; propagatedBuildInputs = [ nix-util nix-store nix-fetchers boost nlohmann_json ] ++ lib.optional enableGC boehmgc; preConfigure = # "Inline" .version so it's not a symlink, and includes the suffix. # Do the meson utils, without modification. '' chmod u+w ./.version echo ${version} > ../../.version ''; mesonFlags = [ (lib.mesonEnable "gc" enableGC) ]; env = { # Needed for Meson to find Boost. # https://github.com/NixOS/nixpkgs/issues/86131. BOOST_INCLUDEDIR = "${lib.getDev boost}/include"; BOOST_LIBRARYDIR = "${lib.getLib boost}/lib"; } // lib.optionalAttrs (stdenv.isLinux && !(stdenv.hostPlatform.isStatic && stdenv.system == "aarch64-linux")) { LDFLAGS = "-fuse-ld=gold"; }; enableParallelBuilding = true; separateDebugInfo = !stdenv.hostPlatform.isStatic; strictDeps = true; hardeningDisable = lib.optional stdenv.hostPlatform.isStatic "pie"; meta = { platforms = lib.platforms.unix ++ lib.platforms.windows; }; })