diff --git a/flake.nix b/flake.nix index 81716a7..b1441b6 100644 --- a/flake.nix +++ b/flake.nix @@ -17,10 +17,8 @@ systems = import inputs.systems; perSystem = { pkgs, - inputs', system, lib, - self', ... }: let rootDir = ./.; @@ -40,31 +38,25 @@ clang-tidy.enable = true; }; }; - - buildDeps = - [ - pkgs.ctre - pkgs.catch2_3 - pkgs.fmt - ] - ++ import ./nix/dependencies.nix {inherit pkgs;}; - - nativeDeps = [ - pkgs.meson - pkgs.ninja - pkgs.pkg-config - ]; - in { formatter = pkgs.alejandra; _module.args = { - inherit rootDir version nativeDeps buildDeps preCommitCheck; + inherit rootDir version preCommitCheck; + + pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ + (f: p: { + inherit (pkgs.callPackage ./nix/dependencies {}) tl-optional tl-expected; + }) + ]; + }; }; imports = [ - ./nix/package - ./nix/shell + ./nix/package + ./nix/shell ]; }; }; diff --git a/nix/dependencies.nix b/nix/dependencies.nix deleted file mode 100644 index 9aa00a6..0000000 --- a/nix/dependencies.nix +++ /dev/null @@ -1,46 +0,0 @@ -{pkgs}: let - tl-optional = pkgs.stdenv.mkDerivation rec { - pname = "optional"; - version = "1.1.0"; - - src = pkgs.fetchFromGitHub { - owner = "TartanLlama"; - repo = "optional"; - rev = "v${version}"; - sha256 = "sha256-WPTXTQmzJjAIJI1zM6svZZTO8gP/jt5xDHHRCCu9cmI="; - }; - - strictDeps = true; - - nativeBuildInputs = [pkgs.cmake]; - - postInstall = '' - mkdir -p $out/lib/pkgconfig - substituteAll ${./pkg-config/optional.pc} $out/lib/pkgconfig/optional.pc - ''; - }; - - tl-expected = pkgs.stdenv.mkDerivation rec { - pname = "expected"; - version = "1.1.0"; - - src = pkgs.fetchFromGitHub { - owner = "TartanLlama"; - repo = "expected"; - rev = "v${version}"; - sha256 = "sha256-AuRU8VI5l7Th9fJ5jIc/6mPm0Vqbbt6rY8QCCNDOU50="; - }; - - nativeBuildInputs = [pkgs.cmake]; - - strictDeps = true; - - postInstall = '' - mkdir -p $out/lib/pkgconfig - substituteAll ${./pkg-config/expected.pc} $out/lib/pkgconfig/expected.pc - ''; - }; -in [ - tl-optional - tl-expected -] diff --git a/nix/dependencies/default.nix b/nix/dependencies/default.nix new file mode 100644 index 0000000..d40f1c4 --- /dev/null +++ b/nix/dependencies/default.nix @@ -0,0 +1,4 @@ +{pkgs}: { + tl-optional = pkgs.callPackage ./tl-optional {version = "1.1.0";}; + tl-expected = pkgs.callPackage ./tl-expected {version = "1.1.0";}; +} diff --git a/nix/dependencies/tl-expected/default.nix b/nix/dependencies/tl-expected/default.nix new file mode 100644 index 0000000..b5949f6 --- /dev/null +++ b/nix/dependencies/tl-expected/default.nix @@ -0,0 +1,23 @@ +{ + pkgs, + version, +}: +pkgs.stdenv.mkDerivation { + pname = "expected"; + inherit version; + + src = pkgs.fetchFromGitHub { + owner = "TartanLlama"; + repo = "expected"; + rev = "v${version}"; + sha256 = "sha256-AuRU8VI5l7Th9fJ5jIc/6mPm0Vqbbt6rY8QCCNDOU50="; + }; + + nativeBuildInputs = [pkgs.cmake]; + + strictDeps = true; + + postInstall = '' + install -Dm644 ${./expected.pc} $out/lib/pkgconfig/expected.pc + ''; +} diff --git a/nix/pkg-config/expected.pc b/nix/dependencies/tl-expected/expected.pc old mode 100755 new mode 100644 similarity index 100% rename from nix/pkg-config/expected.pc rename to nix/dependencies/tl-expected/expected.pc diff --git a/nix/dependencies/tl-optional/default.nix b/nix/dependencies/tl-optional/default.nix new file mode 100644 index 0000000..dcc5c6b --- /dev/null +++ b/nix/dependencies/tl-optional/default.nix @@ -0,0 +1,23 @@ +{ + pkgs, + version, +}: +pkgs.stdenv.mkDerivation { + pname = "optional"; + inherit version; + + src = pkgs.fetchFromGitHub { + owner = "TartanLlama"; + repo = "optional"; + rev = "v${version}"; + sha256 = "sha256-WPTXTQmzJjAIJI1zM6svZZTO8gP/jt5xDHHRCCu9cmI="; + }; + + strictDeps = true; + + nativeBuildInputs = [pkgs.cmake]; + + postInstall = '' + install -Dm644 ${./optional.pc} $out/lib/pkgconfig/optional.pc + ''; +} diff --git a/nix/pkg-config/optional.pc b/nix/dependencies/tl-optional/optional.pc old mode 100755 new mode 100644 similarity index 100% rename from nix/pkg-config/optional.pc rename to nix/dependencies/tl-optional/optional.pc diff --git a/nix/package/default.nix b/nix/package/default.nix index ca9cb46..9bffbc1 100644 --- a/nix/package/default.nix +++ b/nix/package/default.nix @@ -1,18 +1,13 @@ { - pkgs, - lib, - nativeDeps, - buildDeps, - rootDir, - version, - ... -}: -let - package = pkgs.callPackage ./package.nix { - inherit nativeDeps buildDeps rootDir version; - }; -in -{ - packages.dev = package.dev; - packages.default = package.out; + pkgs, + rootDir, + version, + ... +}: let + package = pkgs.callPackage ./package.nix { + inherit rootDir version; + }; +in { + packages.dev = package.dev; + packages.default = package.out; } diff --git a/nix/package/package.nix b/nix/package/package.nix index a64fe15..5498634 100644 --- a/nix/package/package.nix +++ b/nix/package/package.nix @@ -1,57 +1,72 @@ { - pkgs, - lib, - nativeDeps, - buildDeps, rootDir, - version + version, + stdenv, + meson, + ninja, + pkg-config, + ctre, + catch2_3, + tl-optional, + tl-expected, + fmt, }: - pkgs.stdenv.mkDerivation { - pname = "dire"; - inherit version; +stdenv.mkDerivation { + pname = "dire"; + inherit version; - outputs = ["out" "dev"]; + outputs = ["out" "dev"]; - strictDeps = true; - enableParallelBuilding = true; + strictDeps = true; + enableParallelBuilding = true; - dontUseCmakeConfigure = true; + dontUseCmakeConfigure = true; - nativeBuildInputs = nativeDeps; + nativeBuildInputs = [ + meson + ninja + pkg-config + ]; - buildInputs = buildDeps; + buildInputs = [ + ctre + catch2_3 + fmt + tl-optional + tl-expected + ]; - src = rootDir; + src = rootDir; - mesonBuildType = "release"; + mesonBuildType = "release"; - # We use mesonFlags, because mesonFlagsArray & the Nix ecosystem - # don't have the capabilities to properly handle these flags - # e.g. appending \ to the one-before-last argument making the command fail - # or simply not supporting the `-DX=Y` option style - mesonFlags = [ - "--optimization=3" - "-Db_lto_threads=8" - "-Db_lto=true" - "-Dstrip=true" - ]; + # We use mesonFlags, because mesonFlagsArray & the Nix ecosystem + # don't have the capabilities to properly handle these flags + # e.g. appending \ to the one-before-last argument making the command fail + # or simply not supporting the `-DX=Y` option style + mesonFlags = [ + "--optimization=3" + "-Db_lto_threads=8" + "-Db_lto=true" + "-Dstrip=true" + ]; - buildPhase = '' - meson compile dire - ''; + buildPhase = '' + meson compile dire + ''; - installPhase = '' - mkdir -p {$dev,$out}/lib $dev/lib/pkgconfig $dev/include + installPhase = '' + mkdir -p {$dev,$out}/lib $dev/lib/pkgconfig $dev/include - cp src/lib/libdire.a $out/lib - cp src/lib/libdire.a $dev/lib + cp src/lib/libdire.a $out/lib + cp src/lib/libdire.a $dev/lib - cp -r $src/src/lib/include/* $dev/include + cp -r $src/src/lib/include/* $dev/include - substitute \ - ${./dire.pc} \ - $dev/lib/pkgconfig/dire.pc \ - --subst-var out \ - --subst-var version - ''; - } + substitute \ + ${./dire.pc} \ + $dev/lib/pkgconfig/dire.pc \ + --subst-var out \ + --subst-var version + ''; +} diff --git a/nix/shell/default.nix b/nix/shell/default.nix index 3f63a84..3979e16 100644 --- a/nix/shell/default.nix +++ b/nix/shell/default.nix @@ -1,57 +1,11 @@ { pkgs, - nativeDeps, - buildDeps, preCommitCheck, ... }: let - shellDeps = [ - pkgs.doxygen - pkgs.cmake - pkgs.graphviz - ]; - - baseShellAttrs = { - hardeningDisable = ["all"]; - - packages = nativeDeps ++ shellDeps; - - buildInputs = buildDeps; - }; - - gccStdenv = pkgs.gcc11Stdenv; - - clangStdenv = pkgs.llvmPackages_16.stdenv; - - ciGcc = pkgs.mkShell.override {stdenv = gccStdenv;} baseShellAttrs; - - ciClang = pkgs.mkShell.override {stdenv = clangStdenv;} baseShellAttrs; - - devPackages = - [ - pkgs.act - ] - ++ shellDeps; - - baseDevShellAttrs = - baseShellAttrs - // { - inherit (preCommitCheck) shellHook; - - packages = baseShellAttrs.packages ++ devPackages; - }; - - devClang = pkgs.mkShell.override {stdenv = clangStdenv;} (baseDevShellAttrs - // { - env = { - CLANGD_PATH = "${pkgs.clang-tools_16}/bin/clangd"; - ASAN_SYMBOLIZER_PATH = "${pkgs.llvmPackages_16.bintools-unwrapped}/bin/llvm-symbolizer"; - }; - }); - - devGcc = pkgs.mkShell.override {stdenv = gccStdenv;} baseDevShellAttrs; + shells = pkgs.callPackage ./shells.nix {inherit preCommitCheck;}; in { - devShells = { - inherit ciGcc ciClang devGcc devClang; - }; + devShells = { + inherit (shells) ciGcc ciClang devGcc devClang; + }; } diff --git a/nix/shell/shells.nix b/nix/shell/shells.nix new file mode 100644 index 0000000..502c641 --- /dev/null +++ b/nix/shell/shells.nix @@ -0,0 +1,82 @@ +{ + preCommitCheck, + mkShell, + gcc11Stdenv, + llvmPackages_16, + act, + clang-tools_16, + doxygen, + cmake, + graphviz, + meson, + ninja, + pkg-config, + ctre, + catch2_3, + fmt, + tl-optional, + tl-expected, +}: let + # + # Packages + # + baseShellDeps = [ + doxygen + cmake + graphviz + ]; + + devPackages = [ + act + ]; + + baseShellAttrs = { + hardeningDisable = ["all"]; + + packages = + [ + meson + ninja + pkg-config + + ctre + catch2_3 + fmt + tl-optional + tl-expected + ] + ++ baseShellDeps; + }; + + baseDevShellAttrs = + baseShellAttrs + // { + inherit (preCommitCheck) shellHook; + + packages = baseShellAttrs.packages ++ devPackages; + }; + + # + # mkShells + # + mkGccShell = mkShell.override {stdenv = gcc11Stdenv;}; + mkClangShell = mkShell.override {stdenv = llvmPackages_16.stdenv;}; + + # + # Shells + # + ciGcc = mkGccShell baseShellAttrs; + ciClang = mkClangShell baseShellAttrs; + + devClang = mkClangShell (baseDevShellAttrs + // { + env = { + CLANGD_PATH = "${clang-tools_16}/bin/clangd"; + ASAN_SYMBOLIZER_PATH = "${llvmPackages_16.bintools-unwrapped}/bin/llvm-symbolizer"; + }; + }); + + devGcc = mkGccShell baseDevShellAttrs; +in { + inherit ciGcc ciClang devGcc devClang; +}