From 9deb3a0ecc0065902baa6e4e5aab384827f9a84e Mon Sep 17 00:00:00 2001 From: Qyriad Date: Tue, 7 May 2024 15:25:08 -0600 Subject: [PATCH] flake: refactor devShell creation Now instead of a derivation overridden from Lix, we use a mkShell derivation parameterized on an already called package.nix. This also lets callPackage take care of the buildPackages distinction for the devShell. Change-Id: I5ddfec40d83fa6136032da7606fe6d3d5014ef42 --- flake.nix | 75 ++-------------------------------------------- package.nix | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 76 deletions(-) diff --git a/flake.nix b/flake.nix index 141cb8f31..bd5e34764 100644 --- a/flake.nix +++ b/flake.nix @@ -366,82 +366,11 @@ nix = pkgs.callPackage ./package.nix { inherit stdenv versionSuffix; busybox-sandbox-shell = pkgs.busybox-sandbox-shell or pkgs.default-busybox-sandbox; - forDevShell = true; + internalApiDocs = true; }; pre-commit = self.hydraJobs.pre-commit.${pkgs.system} or { }; in - (nix.override { - buildUnreleasedNotes = true; - officialRelease = false; - }).overrideAttrs - ( - prev: - { - # Required for clang-tidy checks - buildInputs = - prev.buildInputs - ++ [ - pkgs.just - pkgs.nixfmt - ] - ++ lib.optional (pre-commit ? enabledPackages) pre-commit.enabledPackages - ++ lib.optionals (stdenv.cc.isClang) [ - pkgs.llvmPackages.llvm - pkgs.llvmPackages.clang-unwrapped.dev - ]; - nativeBuildInputs = - prev.nativeBuildInputs - ++ lib.optional (stdenv.cc.isClang && !stdenv.buildPlatform.isDarwin) pkgs.buildPackages.bear - # Required for clang-tidy checks - ++ lib.optionals (stdenv.cc.isClang) [ - pkgs.buildPackages.cmake - pkgs.buildPackages.ninja - pkgs.buildPackages.llvmPackages.llvm.dev - ] - ++ - lib.optional (stdenv.cc.isClang && stdenv.hostPlatform == stdenv.buildPlatform) - # for some reason that seems accidental and was changed in - # NixOS 24.05-pre, clang-tools is pinned to LLVM 14 when - # default LLVM is newer. - (pkgs.buildPackages.clang-tools.override { inherit (pkgs.buildPackages) llvmPackages; }) - ++ - lib.optionals (lib.meta.availableOn pkgs.stdenv.hostPlatform pkgs.buildPackages.clangbuildanalyzer) - [ pkgs.buildPackages.clangbuildanalyzer ]; - - src = null; - - strictDeps = false; - - shellHook = '' - PATH=$prefix/bin:$PATH - unset PYTHONPATH - export MANPATH=$out/share/man:$MANPATH - - # Make bash completion work. - XDG_DATA_DIRS+=:$out/share - - ${lib.optionalString (pre-commit ? shellHook) pre-commit.shellHook} - # Allow `touch .nocontribmsg` to turn this notice off. - if ! [[ -f .nocontribmsg ]]; then - cat ${contribNotice} - fi - - # Install the Gerrit commit-msg hook. - # (git common dir is the main .git, including for worktrees) - if gitcommondir=$(git rev-parse --git-common-dir 2>/dev/null) && [[ ! -f "$gitcommondir/hooks/commit-msg" ]]; then - echo 'Installing Gerrit commit-msg hook (adds Change-Id to commit messages)' >&2 - mkdir -p "$gitcommondir/hooks" - curl -s -Lo "$gitcommondir/hooks/commit-msg" https://gerrit.lix.systems/tools/hooks/commit-msg - chmod u+x "$gitcommondir/hooks/commit-msg" - fi - unset gitcommondir - ''; - } - // lib.optionalAttrs (stdenv.buildPlatform.isLinux && pkgs.glibcLocales != null) { - # Required to make non-NixOS Linux not complain about missing locale files during configure in a dev shell - LOCALE_ARCHIVE = "${lib.getLib pkgs.glibcLocales}/lib/locale/locale-archive"; - } - ); + pkgs.callPackage nix.mkDevShell { pre-commit-checks = pre-commit; inherit contribNotice; }; in forAllSystems ( system: diff --git a/package.nix b/package.nix index 16b1013f1..6756ac9e8 100644 --- a/package.nix +++ b/package.nix @@ -57,8 +57,6 @@ # Set to true to build the release notes for the next release. buildUnreleasedNotes ? false, internalApiDocs ? false, - # Avoid setting things that would interfere with a functioning devShell - forDevShell ? false, # Not a real argument, just the only way to approximate let-binding some # stuff for argument defaults. @@ -241,7 +239,7 @@ stdenv.mkDerivation (finalAttrs: { ] ++ lib.optional stdenv.hostPlatform.isLinux util-linuxMinimal ++ lib.optional (!officialRelease && buildUnreleasedNotes) build-release-notes - ++ lib.optional (internalApiDocs || forDevShell) doxygen; + ++ lib.optional internalApiDocs doxygen; buildInputs = [ @@ -379,5 +377,87 @@ stdenv.mkDerivation (finalAttrs: { # flake.nix exports that into its overlay. passthru = { inherit (__forDefaults) boehmgc-nix build-release-notes libseccomp-nix; + + # The collection of dependency logic for this derivation is complicated enough that + # it's easier to parameterize the devShell off an already called package.nix. + mkDevShell = + { + mkShell, + just, + nixfmt, + glibcLocales, + bear, + pre-commit-checks, + clang-tools, + llvmPackages, + clangbuildanalyzer, + contribNotice, + }: + let + glibcFix = lib.optionalAttrs (stdenv.buildPlatform.isLinux && glibcLocales != null) { + # Required to make non-NixOS Linux not complain about missing locale files during configure in a dev shell + LOCALE_ARCHIVE = "${lib.getLib pkgs.glibcLocales}/lib/locale/locale-archive"; + }; + # for some reason that seems accidental and was changed in + # NixOS 24.05-pre, clang-tools is pinned to LLVM 14 when + # default LLVM is newer. + clang-tools_llvm = clang-tools.override { inherit llvmPackages; }; + + # pkgs.mkShell uses pkgs.stdenv by default, regardless of inputsFrom. + actualMkShell = mkShell.override { inherit stdenv; }; + in + actualMkShell ( + glibcFix + // { + + inputsFrom = [ finalAttrs ]; + + # For Meson to find Boost. + env = finalAttrs.env; + + packages = + [ + just + nixfmt + # Load-bearing order. Must come before clang-unwrapped below. + stdenv.cc + ] + ++ lib.optionals stdenv.cc.isClang [ + # Required for clang-tidy checks. + llvmPackages.llvm + llvmPackages.clang-unwrapped.dev + ] + ++ lib.optional (pre-commit-checks ? enabledPackages) pre-commit-checks.enabledPackages + ++ lib.optional (stdenv.cc.isClang && !stdenv.buildPlatform.isDarwin) bear + ++ lib.optional (stdenv.cc.isClang && stdenv.hostPlatform == stdenv.buildPlatform) clang-tools_llvm + ++ lib.optional (lib.meta.availableOn stdenv.buildPlatform clangbuildanalyzer) clangbuildanalyzer + ++ finalAttrs.checkInputs; + + shellHook = '' + PATH=$prefix/bin:$PATH + unset PYTHONPATH + export MANPATH=$out/share/man:$MANPATH + + # Make bash completion work. + XDG_DATA_DIRS+=:$out/share + + ${lib.optionalString (pre-commit-checks ? shellHook) pre-commit-checks.shellHook} + # Allow `touch .nocontribmsg` to turn this notice off. + if ! [[ -f .nocontribmsg ]]; then + cat ${contribNotice} + fi + + # Install the Gerrit commit-msg hook. + # (git common dir is the main .git, including for worktrees) + if gitcommondir=$(git rev-parse --git-common-dir 2>/dev/null) && [[ ! -f "$gitcommondir/hooks/commit-msg" ]]; then + echo 'Installing Gerrit commit-msg hook (adds Change-Id to commit messages)' >&2 + mkdir -p "$gitcommondir/hooks" + curl -s -Lo "$gitcommondir/hooks/commit-msg" https://gerrit.lix.systems/tools/hooks/commit-msg + chmod u+x "$gitcommondir/hooks/commit-msg" + fi + unset gitcommondir + ''; + } + ); }; })