diff --git a/lib/default.nix b/lib/default.nix index 668c29640f9f..f6cb7932507a 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -97,7 +97,7 @@ let inherit (self.strings) concatStrings concatMapStrings concatImapStrings intersperse concatStringsSep concatMapStringsSep concatImapStringsSep concatLines makeSearchPath makeSearchPathOutput - makeLibraryPath makeBinPath optionalString + makeLibraryPath makeIncludePath makeBinPath optionalString hasInfix hasPrefix hasSuffix stringToCharacters stringAsChars escape escapeShellArg escapeShellArgs isStorePath isStringLike diff --git a/lib/strings.nix b/lib/strings.nix index 32efc9bdb70e..67bb669d04e0 100644 --- a/lib/strings.nix +++ b/lib/strings.nix @@ -206,6 +206,18 @@ rec { */ makeLibraryPath = makeSearchPathOutput "lib" "lib"; + /* Construct an include search path (such as C_INCLUDE_PATH) containing the + header files for a set of packages or paths. + + Example: + makeIncludePath [ "/usr" "/usr/local" ] + => "/usr/include:/usr/local/include" + pkgs = import { } + makeIncludePath [ pkgs.openssl pkgs.zlib ] + => "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r-dev/include:/nix/store/wwh7mhwh269sfjkm6k5665b5kgp7jrk2-zlib-1.2.8-dev/include" + */ + makeIncludePath = makeSearchPathOutput "dev" "include"; + /* Construct a binary search path (such as $PATH) containing the binaries for a set of packages. diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index 6f1d9039db80..3cb96c1b68bc 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -64,6 +64,7 @@ let lists listToAttrs makeExtensible + makeIncludePath makeOverridable mapAttrs matchAttrs @@ -296,6 +297,35 @@ runTests { expected = "a\nb\nc\n"; }; + testMakeIncludePathWithPkgs = { + expr = (makeIncludePath [ + # makeIncludePath preferably selects the "dev" output + { dev.outPath = "/dev"; out.outPath = "/out"; outPath = "/default"; } + # "out" is used if "dev" is not found + { out.outPath = "/out"; outPath = "/default"; } + # And it returns the derivation directly if there's no "out" either + { outPath = "/default"; } + # Same if the output is specified explicitly, even if there's a "dev" + { dev.outPath = "/dev"; outPath = "/default"; outputSpecified = true; } + ]); + expected = "/dev/include:/out/include:/default/include:/default/include"; + }; + + testMakeIncludePathWithEmptyList = { + expr = (makeIncludePath [ ]); + expected = ""; + }; + + testMakeIncludePathWithOneString = { + expr = (makeIncludePath [ "/usr" ]); + expected = "/usr/include"; + }; + + testMakeIncludePathWithManyString = { + expr = (makeIncludePath [ "/usr" "/usr/local" ]); + expected = "/usr/include:/usr/local/include"; + }; + testReplicateString = { expr = strings.replicate 5 "hello"; expected = "hellohellohellohellohello";