diff --git a/nix/ci-env.nix b/nix/ci-env.nix index c33c4d6d21..ddc7a6a732 100644 --- a/nix/ci-env.nix +++ b/nix/ci-env.nix @@ -7,7 +7,7 @@ ... }: let - inherit (import ./packages.nix { inherit pkgs; }) commonPackages; + inherit (import ./packages.nix { inherit pkgs customGlibc; }) commonPackages; # Each forces something absent on the other platform, so both stay lazy. linux = import ./linux.nix { inherit pkgs customGlibc; }; diff --git a/nix/devshell.nix b/nix/devshell.nix index 25fc73215f..4ccc9ec2e3 100644 --- a/nix/devshell.nix +++ b/nix/devshell.nix @@ -31,6 +31,9 @@ let }; customGccGcov = if pkgs.stdenv.hostPlatform.isLinux then linux.gcov else plainGcov; + # commonPackages whose clang tools parse with the custom toolchain's headers. + customCommonPackages = (import ./packages.nix { inherit pkgs customGlibc; }).commonPackages; + # Whole directory: init.sh locates the profiles relative to itself. conanDir = ../conan; @@ -86,11 +89,11 @@ let version ? null, versionedTools ? [ ], extraPackages ? [ ], - warningHook ? "", - # Opt out of PatchNixBinary.cmake retargeting binaries to the system - # loader. The plain toolchain links a newer glibc, so it must not be - # patched; the custom toolchain patches by default. - noPatchNixBinary ? false, + # The stock nixpkgs toolchain: warn that it doesn't match CI, keep the + # clang tools off the custom toolchain, and opt out of PatchNixBinary.cmake + # retargeting binaries to the system loader (the plain toolchain links a + # newer glibc, so it must not be patched). + plain ? false, }: let compilerVersionHook = @@ -110,7 +113,8 @@ let in (pkgs.mkShell.override { inherit stdenv; }) ( { - packages = commonPackages ++ versionedLinks ++ extraPackages; + packages = + (if plain then commonPackages else customCommonPackages) ++ versionedLinks ++ extraPackages; # Marks a managed dev shell, so the build (XrplSanity.cmake) can tell an # intentional Nix toolchain from one leaked into a bare shell. XRPL_DEVSHELL = shellName; @@ -119,10 +123,10 @@ let ${compilerVersionHook} ${darwinLibresolvHook} ${conanHook} - ${warningHook} + ${pkgs.lib.optionalString plain plainWarningHook} ''; } - // pkgs.lib.optionalAttrs noPatchNixBinary { XRPLD_NO_PATCH_NIX_BINARY = "1"; } + // pkgs.lib.optionalAttrs plain { XRPLD_NO_PATCH_NIX_BINARY = "1"; } ); in rec { @@ -180,8 +184,7 @@ rec { version = gccVersion; versionedTools = gccVersionedTools; extraPackages = [ plainGcov ]; - warningHook = plainWarningHook; - noPatchNixBinary = true; + plain = true; }; clang-plain = makeShell { @@ -190,7 +193,6 @@ rec { compilerName = "clang"; version = llvmVersion; versionedTools = clangVersionedTools; - warningHook = plainWarningHook; - noPatchNixBinary = true; + plain = true; }; } diff --git a/nix/linux.nix b/nix/linux.nix index ea808fbf50..9d39b942a5 100644 --- a/nix/linux.nix +++ b/nix/linux.nix @@ -146,6 +146,7 @@ in }) ]; + clang = customClang; gccStdenv = customStdenv; clangStdenv = pkgs.stdenvAdapters.overrideCC pkgs.stdenv customClang; gcov = customGcov; diff --git a/nix/packages.nix b/nix/packages.nix index 9af230097d..9925c0201e 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -1,4 +1,10 @@ -{ pkgs }: +{ + pkgs, + # With the custom glibc, the clang tools (clang-tidy, ...) parse code with the + # Linux custom toolchain's headers, i.e. the same glibc and libstdc++ as the + # build. Without it, they use the nixpkgs default compiler's. + customGlibc ? null, +}: let # Compiler versions used across the dev shell and the CI environment. gccVersion = 15; @@ -8,7 +14,12 @@ let llvmPackages = pkgs."llvmPackages_${toString llvmVersion}"; # Bound explicitly so it tracks llvmPackages above, not the `with pkgs` default. - clangTools = llvmPackages.clang-tools; + # isLinux first: darwin must not evaluate the custom glibc. + clangTools = llvmPackages.clang-tools.override ( + pkgs.lib.optionalAttrs (pkgs.stdenv.hostPlatform.isLinux && customGlibc != null) { + inherit (import ./linux.nix { inherit pkgs customGlibc; }) clang; + } + ); # In LLVM 22, run-clang-tidy.py moved from share/clang/ to bin/, so nixpkgs # clang-tools no longer links it. Wrap it manually. @@ -112,6 +123,7 @@ in gnumake gnupg # needed for signing commits & codecov/codecov-action graphviz + jq less # needed for git diff mold nettools # provides netstat, used to debug failures in CI