1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-08 19:46:02 +01:00

packaging: Add withASan,withUBSan options to the scope

This commit is contained in:
Sergei Zimmerman 2025-10-12 17:42:19 +03:00
parent 199b6ff3fb
commit a491173369
No known key found for this signature in database
2 changed files with 36 additions and 13 deletions

View file

@ -23,16 +23,6 @@ let
packages' = nixFlake.packages.${system}; packages' = nixFlake.packages.${system};
stdenv = (getStdenv pkgs); stdenv = (getStdenv pkgs);
enableSanitizersLayer = finalAttrs: prevAttrs: {
mesonFlags =
(prevAttrs.mesonFlags or [ ])
++ [ (lib.mesonOption "b_sanitize" "address,undefined") ]
++ (lib.optionals stdenv.cc.isClang [
# https://www.github.com/mesonbuild/meson/issues/764
(lib.mesonBool "b_lundef" false)
]);
};
collectCoverageLayer = finalAttrs: prevAttrs: { collectCoverageLayer = finalAttrs: prevAttrs: {
env = env =
let let
@ -55,14 +45,15 @@ let
''; '';
}; };
componentOverrides = componentOverrides = (lib.optional withCoverage collectCoverageLayer);
(lib.optional withSanitizers enableSanitizersLayer)
++ (lib.optional withCoverage collectCoverageLayer);
in in
rec { rec {
nixComponentsInstrumented = nixComponents.overrideScope ( nixComponentsInstrumented = nixComponents.overrideScope (
final: prev: { final: prev: {
withASan = withSanitizers;
withUBSan = withSanitizers;
nix-store-tests = prev.nix-store-tests.override { withBenchmarks = true; }; nix-store-tests = prev.nix-store-tests.override { withBenchmarks = true; };
# Boehm is incompatible with ASAN. # Boehm is incompatible with ASAN.
nix-expr = prev.nix-expr.override { enableGC = !withSanitizers; }; nix-expr = prev.nix-expr.override { enableGC = !withSanitizers; };

View file

@ -204,6 +204,25 @@ let
mesonFlags = [ (lib.mesonBool "b_asneeded" false) ] ++ prevAttrs.mesonFlags or [ ]; mesonFlags = [ (lib.mesonBool "b_asneeded" false) ] ++ prevAttrs.mesonFlags or [ ];
}; };
enableSanitizersLayer =
finalAttrs: prevAttrs:
let
sanitizers = lib.optional scope.withASan "address" ++ lib.optional scope.withUBSan "undefined";
in
{
mesonFlags =
(prevAttrs.mesonFlags or [ ])
++ lib.optionals (lib.length sanitizers > 0) (
[
(lib.mesonOption "b_sanitize" (lib.concatStringsSep "," sanitizers))
]
++ (lib.optionals stdenv.cc.isClang [
# https://www.github.com/mesonbuild/meson/issues/764
(lib.mesonBool "b_lundef" false)
])
);
};
nixDefaultsLayer = finalAttrs: prevAttrs: { nixDefaultsLayer = finalAttrs: prevAttrs: {
strictDeps = prevAttrs.strictDeps or true; strictDeps = prevAttrs.strictDeps or true;
enableParallelBuilding = true; enableParallelBuilding = true;
@ -246,6 +265,16 @@ in
inherit filesetToSource; inherit filesetToSource;
/**
Whether meson components are built with [AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html).
*/
withASan = false;
/**
Whether meson components are built with [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html).
*/
withUBSan = false;
/** /**
A user-provided extension function to apply to each component derivation. A user-provided extension function to apply to each component derivation.
*/ */
@ -332,6 +361,7 @@ in
setVersionLayer setVersionLayer
mesonLayer mesonLayer
fixupStaticLayer fixupStaticLayer
enableSanitizersLayer
scope.mesonComponentOverrides scope.mesonComponentOverrides
]; ];
mkMesonExecutable = mkPackageBuilder [ mkMesonExecutable = mkPackageBuilder [
@ -342,6 +372,7 @@ in
mesonLayer mesonLayer
mesonBuildLayer mesonBuildLayer
fixupStaticLayer fixupStaticLayer
enableSanitizersLayer
scope.mesonComponentOverrides scope.mesonComponentOverrides
]; ];
mkMesonLibrary = mkPackageBuilder [ mkMesonLibrary = mkPackageBuilder [
@ -353,6 +384,7 @@ in
mesonBuildLayer mesonBuildLayer
mesonLibraryLayer mesonLibraryLayer
fixupStaticLayer fixupStaticLayer
enableSanitizersLayer
scope.mesonComponentOverrides scope.mesonComponentOverrides
]; ];