diff options
author | Alyssa Ross <hi@alyssa.is> | 2021-06-22 15:01:47 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2021-06-22 16:57:59 +0000 |
commit | 633cab0ecb07627706c6b523e219490f019eaab5 (patch) | |
tree | 4fb472bdfe2723037dad53dc1b8a87c939015f5e /nixpkgs/lib | |
parent | ffb691c199e7e0cbc4e45e5310779c9e3f7c2a73 (diff) | |
parent | 432fc2d9a67f92e05438dff5fdc2b39d33f77997 (diff) | |
download | nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.gz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.bz2 nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.lz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.xz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.zst nixlib-633cab0ecb07627706c6b523e219490f019eaab5.zip |
Merge commit '432fc2d9a67f92e05438dff5fdc2b39d33f77997'
# Conflicts: # nixpkgs/pkgs/applications/editors/emacs/elisp-packages/elpa-generated.nix # nixpkgs/pkgs/applications/networking/mailreaders/thunderbird/default.nix # nixpkgs/pkgs/applications/window-managers/sway/default.nix # nixpkgs/pkgs/build-support/rust/default.nix # nixpkgs/pkgs/development/go-modules/generic/default.nix
Diffstat (limited to 'nixpkgs/lib')
-rw-r--r-- | nixpkgs/lib/attrsets.nix | 4 | ||||
-rw-r--r-- | nixpkgs/lib/customisation.nix | 8 | ||||
-rw-r--r-- | nixpkgs/lib/default.nix | 5 | ||||
-rw-r--r-- | nixpkgs/lib/flake.nix | 5 | ||||
-rw-r--r-- | nixpkgs/lib/licenses.nix | 16 | ||||
-rw-r--r-- | nixpkgs/lib/meta.nix | 12 | ||||
-rw-r--r-- | nixpkgs/lib/modules.nix | 22 | ||||
-rw-r--r-- | nixpkgs/lib/strings.nix | 10 | ||||
-rw-r--r-- | nixpkgs/lib/systems/default.nix | 15 | ||||
-rw-r--r-- | nixpkgs/lib/systems/doubles.nix | 2 | ||||
-rw-r--r-- | nixpkgs/lib/systems/examples.nix | 15 | ||||
-rw-r--r-- | nixpkgs/lib/systems/parse.nix | 39 | ||||
-rw-r--r-- | nixpkgs/lib/systems/platforms.nix | 16 | ||||
-rwxr-xr-x | nixpkgs/lib/tests/modules.sh | 3 | ||||
-rw-r--r-- | nixpkgs/lib/tests/modules/declare-submoduleWith-modules.nix | 4 | ||||
-rw-r--r-- | nixpkgs/lib/trivial.nix | 5 | ||||
-rw-r--r-- | nixpkgs/lib/types.nix | 29 |
17 files changed, 164 insertions, 46 deletions
diff --git a/nixpkgs/lib/attrsets.nix b/nixpkgs/lib/attrsets.nix index 0ce3aaeca452..5c787940cb0c 100644 --- a/nixpkgs/lib/attrsets.nix +++ b/nixpkgs/lib/attrsets.nix @@ -243,6 +243,10 @@ rec { /* Call a function for each attribute in the given set and return the result in a list. + Type: + mapAttrsToList :: + (String -> a -> b) -> AttrSet -> [b] + Example: mapAttrsToList (name: value: name + value) { x = "a"; y = "b"; } diff --git a/nixpkgs/lib/customisation.nix b/nixpkgs/lib/customisation.nix index 37a7951896b0..c17cb0d0f8e5 100644 --- a/nixpkgs/lib/customisation.nix +++ b/nixpkgs/lib/customisation.nix @@ -219,16 +219,17 @@ rec { /* Like the above, but aims to support cross compilation. It's still ugly, but hopefully it helps a little bit. */ - makeScopeWithSplicing = splicePackages: newScope: otherSplices: keep: f: + makeScopeWithSplicing = splicePackages: newScope: otherSplices: keep: extra: f: let - spliced = splicePackages { + spliced0 = splicePackages { pkgsBuildBuild = otherSplices.selfBuildBuild; pkgsBuildHost = otherSplices.selfBuildHost; pkgsBuildTarget = otherSplices.selfBuildTarget; pkgsHostHost = otherSplices.selfHostHost; pkgsHostTarget = self; # Not `otherSplices.selfHostTarget`; pkgsTargetTarget = otherSplices.selfTargetTarget; - } // keep self; + }; + spliced = extra spliced0 // spliced0 // keep self; self = f self // { newScope = scope: newScope (spliced // scope); callPackage = newScope spliced; # == self.newScope {}; @@ -239,6 +240,7 @@ rec { newScope otherSplices keep + extra (lib.fixedPoints.extends g f); packages = f; }; diff --git a/nixpkgs/lib/default.nix b/nixpkgs/lib/default.nix index 50320669e280..ccae0bbc3ab4 100644 --- a/nixpkgs/lib/default.nix +++ b/nixpkgs/lib/default.nix @@ -66,8 +66,9 @@ let stringLength sub substring tail trace; inherit (self.trivial) id const pipe concat or and bitAnd bitOr bitXor bitNot boolToString mergeAttrs flip mapNullable inNixShell isFloat min max - importJSON importTOML warn info showWarnings nixpkgsVersion version mod compare - splitByAndCompare functionArgs setFunctionArgs isFunction toHexString toBaseDigits; + importJSON importTOML warn warnIf info showWarnings nixpkgsVersion version + mod compare splitByAndCompare functionArgs setFunctionArgs isFunction + toHexString toBaseDigits; inherit (self.fixedPoints) fix fix' converge extends composeExtensions composeManyExtensions makeExtensible makeExtensibleWithCustomName; inherit (self.attrsets) attrByPath hasAttrByPath setAttrByPath diff --git a/nixpkgs/lib/flake.nix b/nixpkgs/lib/flake.nix new file mode 100644 index 000000000000..f05bd40960a8 --- /dev/null +++ b/nixpkgs/lib/flake.nix @@ -0,0 +1,5 @@ +{ + description = "Library of low-level helper functions for nix expressions."; + + outputs = { self }: { lib = import ./lib; }; +} diff --git a/nixpkgs/lib/licenses.nix b/nixpkgs/lib/licenses.nix index 88d598d92079..3c4323e3d960 100644 --- a/nixpkgs/lib/licenses.nix +++ b/nixpkgs/lib/licenses.nix @@ -346,6 +346,11 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({ fullName = "Unspecified free software license"; }; + ftl = spdx { + spdxId = "FTL"; + fullName = "Freetype Project License"; + }; + g4sl = { fullName = "Geant4 Software License"; url = "https://geant4.web.cern.ch/geant4/license/LICENSE.html"; @@ -734,6 +739,12 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({ free = false; }; + stk = { + shortName = "stk"; + fullName = "Synthesis Tool Kit 4.3"; + url = https://github.com/thestk/stk/blob/master/LICENSE; + }; + tcltk = spdx { spdxId = "TCL"; fullName = "TCL/TK License"; @@ -760,6 +771,11 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({ # channel and NixOS images. }; + unicode-dfs-2015 = spdx { + spdxId = "Unicode-DFS-2015"; + fullName = "Unicode License Agreement - Data Files and Software (2015)"; + }; + unicode-dfs-2016 = spdx { spdxId = "Unicode-DFS-2016"; fullName = "Unicode License Agreement - Data Files and Software (2016)"; diff --git a/nixpkgs/lib/meta.nix b/nixpkgs/lib/meta.nix index 2e83c4247ddf..bc04394dcf0b 100644 --- a/nixpkgs/lib/meta.nix +++ b/nixpkgs/lib/meta.nix @@ -87,4 +87,16 @@ rec { then { system = elem; } else { parsed = elem; }; in lib.matchAttrs pattern platform; + + /* Check if a package is available on a given platform. + + A package is available on a platform if both + + 1. One of `meta.platforms` pattern matches the given platform. + + 2. None of `meta.badPlatforms` pattern matches the given platform. + */ + availableOn = platform: pkg: + lib.any (platformMatch platform) pkg.meta.platforms && + lib.all (elem: !platformMatch platform elem) (pkg.meta.badPlatforms or []); } diff --git a/nixpkgs/lib/modules.nix b/nixpkgs/lib/modules.nix index d3f10944e708..99b9a8a31eac 100644 --- a/nixpkgs/lib/modules.nix +++ b/nixpkgs/lib/modules.nix @@ -23,6 +23,7 @@ let isAttrs isBool isFunction + isList isString length mapAttrs @@ -37,7 +38,7 @@ let setAttrByPath toList types - warn + warnIf ; inherit (lib.options) isOption @@ -127,7 +128,7 @@ rec { let collected = collectModules (specialArgs.modulesPath or "") (modules ++ [ internalModule ]) - ({ inherit lib options config; } // specialArgs); + ({ inherit lib options config specialArgs; } // specialArgs); in mergeModules prefix (reverseList collected); options = merged.matchedOptions; @@ -188,6 +189,9 @@ rec { loadModule = args: fallbackFile: fallbackKey: m: if isFunction m || isAttrs m then unifyModuleSyntax fallbackFile fallbackKey (applyIfFunction fallbackKey m args) + else if isList m then + let defs = [{ file = fallbackFile; value = m; }]; in + throw "Module imports can't be nested lists. Perhaps you meant to remove one level of lists? Definitions: ${showDefs defs}" else unifyModuleSyntax (toString m) (toString m) (applyIfFunction (toString m) (import m) args); /* @@ -295,13 +299,11 @@ rec { # a module will resolve strictly the attributes used as argument but # not their values. The values are forwarding the result of the # evaluation of the option. - requiredArgs = builtins.attrNames (lib.functionArgs f); context = name: ''while evaluating the module argument `${name}' in "${key}":''; - extraArgs = builtins.listToAttrs (map (name: { - inherit name; - value = builtins.addErrorContext (context name) - (args.${name} or config._module.args.${name}); - }) requiredArgs); + extraArgs = builtins.mapAttrs (name: _: + builtins.addErrorContext (context name) + (args.${name} or config._module.args.${name}) + ) (lib.functionArgs f); # Note: we append in the opposite order such that we can add an error # context on the explicited arguments of "args" too. This update @@ -516,8 +518,8 @@ rec { value = if opt ? apply then opt.apply res.mergedValue else res.mergedValue; warnDeprecation = - if opt.type.deprecationMessage == null then id - else warn "The type `types.${opt.type.name}' of option `${showOption loc}' defined in ${showFiles opt.declarations} is deprecated. ${opt.type.deprecationMessage}"; + warnIf (opt.type.deprecationMessage != null) + "The type `types.${opt.type.name}' of option `${showOption loc}' defined in ${showFiles opt.declarations} is deprecated. ${opt.type.deprecationMessage}"; in warnDeprecation opt // { value = builtins.addErrorContext "while evaluating the option `${showOption loc}':" value; diff --git a/nixpkgs/lib/strings.nix b/nixpkgs/lib/strings.nix index 5010d9159cb8..49fa0196a0b2 100644 --- a/nixpkgs/lib/strings.nix +++ b/nixpkgs/lib/strings.nix @@ -606,7 +606,7 @@ rec { This function will fail if the input string is longer than the requested length. - Type: fixedWidthString :: int -> string -> string + Type: fixedWidthString :: int -> string -> string -> string Example: fixedWidthString 5 "0" (toString 15) @@ -644,8 +644,8 @@ rec { floatToString = float: let result = toString float; precise = float == fromJSON result; - in if precise then result - else lib.warn "Imprecise conversion from float to string ${result}" result; + in lib.warnIf (!precise) "Imprecise conversion from float to string ${result}" + result; /* Check whether a value can be coerced to a string */ isCoercibleToString = x: @@ -659,7 +659,7 @@ rec { Example: isStorePath "/nix/store/d945ibfx9x185xf04b890y4f9g3cbb63-python-2.7.11/bin/python" => false - isStorePath "/nix/store/d945ibfx9x185xf04b890y4f9g3cbb63-python-2.7.11/" + isStorePath "/nix/store/d945ibfx9x185xf04b890y4f9g3cbb63-python-2.7.11" => true isStorePath pkgs.python => true @@ -667,7 +667,7 @@ rec { => false */ isStorePath = x: - if isCoercibleToString x then + if !(isList x) && isCoercibleToString x then let str = toString x; in substring 0 1 str == "/" && dirOf str == storeDir diff --git a/nixpkgs/lib/systems/default.nix b/nixpkgs/lib/systems/default.nix index 21b00374da47..70ec98b03c16 100644 --- a/nixpkgs/lib/systems/default.nix +++ b/nixpkgs/lib/systems/default.nix @@ -41,6 +41,19 @@ rec { else if final.isNetBSD then "nblibc" # TODO(@Ericson2314) think more about other operating systems else "native/impure"; + # Choose what linker we wish to use by default. Someday we might also + # choose the C compiler, runtime library, C++ standard library, etc. in + # this way, nice and orthogonally, and deprecate `useLLVM`. But due to + # the monolithic GCC build we cannot actually make those choices + # independently, so we are just doing `linker` and keeping `useLLVM` for + # now. + linker = + /**/ if final.useLLVM or false then "lld" + else if final.isDarwin then "cctools" + # "bfd" and "gold" both come from GNU binutils. The existance of Gold + # is why we use the more obscure "bfd" and not "binutils" for this + # choice. + else "bfd"; extensions = { sharedLibrary = /**/ if final.isDarwin then ".dylib" @@ -118,7 +131,7 @@ rec { else null; # The canonical name for this attribute is darwinSdkVersion, but some # platforms define the old name "sdkVer". - darwinSdkVersion = final.sdkVer or "10.12"; + darwinSdkVersion = final.sdkVer or (if final.isAarch64 then "11.0" else "10.12"); darwinMinVersion = final.darwinSdkVersion; darwinMinVersionVariable = if final.isMacOS then "MACOSX_DEPLOYMENT_TARGET" diff --git a/nixpkgs/lib/systems/doubles.nix b/nixpkgs/lib/systems/doubles.nix index 6f638be585b1..c6d90ba9850d 100644 --- a/nixpkgs/lib/systems/doubles.nix +++ b/nixpkgs/lib/systems/doubles.nix @@ -96,5 +96,5 @@ in { embedded = filterDoubles predicates.isNone; - mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "armv7a-linux" "aarch64-linux" "powerpc64-linux" "powerpc64le-linux"]; + mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "armv7a-linux" "aarch64-linux" "powerpc64-linux" "powerpc64le-linux" "aarch64-darwin"]; } diff --git a/nixpkgs/lib/systems/examples.nix b/nixpkgs/lib/systems/examples.nix index 9c0013c39778..6a8f4e091aae 100644 --- a/nixpkgs/lib/systems/examples.nix +++ b/nixpkgs/lib/systems/examples.nix @@ -70,6 +70,15 @@ rec { useAndroidPrebuilt = true; }; + aarch64-android = { + config = "aarch64-unknown-linux-android"; + sdkVer = "30"; + ndkVer = "21"; + libc = "bionic"; + useAndroidPrebuilt = false; + useLLVM = true; + }; + scaleway-c1 = armv7l-hf-multiplatform // platforms.scaleway-c1; pogoplug4 = { @@ -231,6 +240,12 @@ rec { useiOSPrebuilt = true; }; + aarch64-darwin = { + config = "aarch64-apple-darwin"; + xcodePlatform = "MacOSX"; + platform = {}; + }; + # # Windows # diff --git a/nixpkgs/lib/systems/parse.nix b/nixpkgs/lib/systems/parse.nix index a06ac0d11f74..2b789fd8ecb3 100644 --- a/nixpkgs/lib/systems/parse.nix +++ b/nixpkgs/lib/systems/parse.nix @@ -121,15 +121,28 @@ rec { js = { bits = 32; significantByte = littleEndian; family = "js"; }; }; - # Determine where two CPUs are compatible with each other. That is, - # can we run code built for system b on system a? For that to - # happen, then the set of all possible possible programs that system - # b accepts must be a subset of the set of all programs that system - # a accepts. This compatibility relation forms a category where each - # CPU is an object and each arrow from a to b represents - # compatibility. CPUs with multiple modes of Endianness are - # isomorphic while all CPUs are endomorphic because any program - # built for a CPU can run on that CPU. + # GNU build systems assume that older NetBSD architectures are using a.out. + gnuNetBSDDefaultExecFormat = cpu: + if (cpu.family == "x86" && cpu.bits == 32) || + (cpu.family == "arm" && cpu.bits == 32) || + (cpu.family == "sparc" && cpu.bits == 32) + then execFormats.aout + else execFormats.elf; + + # Determine when two CPUs are compatible with each other. That is, + # can code built for system B run on system A? For that to happen, + # the programs that system B accepts must be a subset of the + # programs that system A accepts. + # + # We have the following properties of the compatibility relation, + # which must be preserved when adding compatibility information for + # additional CPUs. + # - (reflexivity) + # Every CPU is compatible with itself. + # - (transitivity) + # If A is compatible with B and B is compatible with C then A is compatible with C. + # - (compatible under multiple endianness) + # CPUs with multiple modes of endianness are pairwise compatible. isCompatible = a: b: with cpuTypes; lib.any lib.id [ # x86 (b == i386 && isCompatible a i486) @@ -271,7 +284,7 @@ rec { kernels = with execFormats; with kernelFamilies; setTypes types.openKernel { # TODO(@Ericson2314): Don't want to mass-rebuild yet to keeping 'darwin' as - # the nnormalized name for macOS. + # the normalized name for macOS. macos = { execFormat = macho; families = { inherit darwin; }; name = "darwin"; }; ios = { execFormat = macho; families = { inherit darwin; }; }; freebsd = { execFormat = elf; families = { inherit bsd; }; }; @@ -458,8 +471,12 @@ rec { else "${cpu.name}-${kernel.name}"; tripleFromSystem = { cpu, vendor, kernel, abi, ... } @ sys: assert isSystem sys; let + optExecFormat = + lib.optionalString (kernel.name == "netbsd" && + gnuNetBSDDefaultExecFormat cpu != kernel.execFormat) + kernel.execFormat.name; optAbi = lib.optionalString (abi != abis.unknown) "-${abi.name}"; - in "${cpu.name}-${vendor.name}-${kernel.name}${optAbi}"; + in "${cpu.name}-${vendor.name}-${kernel.name}${optExecFormat}${optAbi}"; ################################################################################ diff --git a/nixpkgs/lib/systems/platforms.nix b/nixpkgs/lib/systems/platforms.nix index f46e9c826a5c..92285346f754 100644 --- a/nixpkgs/lib/systems/platforms.nix +++ b/nixpkgs/lib/systems/platforms.nix @@ -375,6 +375,13 @@ rec { }; }; + apple-m1 = { + gcc = { + arch = "armv8.3-a+crypto+sha2+aes+crc+fp16+lse+simd+ras+rdm+rcpc"; + cpu = "apple-a13"; + }; + }; + ## ## MIPS ## @@ -474,11 +481,11 @@ rec { riscv-multiplatform = { linux-kernel = { name = "riscv-multiplatform"; - target = "vmlinux"; + target = "Image"; autoModules = true; baseConfig = "defconfig"; + DTB = true; extraConfig = '' - FTRACE n SERIAL_OF_PLATFORM y ''; }; @@ -495,7 +502,10 @@ rec { else if lib.versionOlder version "6" then sheevaplug else if lib.versionOlder version "7" then raspberrypi else armv7l-hf-multiplatform - else if platform.isAarch64 then aarch64-multiplatform + + else if platform.isAarch64 then + if platform.isDarwin then apple-m1 + else aarch64-multiplatform else if platform.isRiscV then riscv-multiplatform diff --git a/nixpkgs/lib/tests/modules.sh b/nixpkgs/lib/tests/modules.sh index 2eddeec07b1a..2e57c2f8e2a1 100755 --- a/nixpkgs/lib/tests/modules.sh +++ b/nixpkgs/lib/tests/modules.sh @@ -175,6 +175,9 @@ checkConfigOutput "true" config.submodule.config ./declare-submoduleWith-noshort ## submoduleWith should merge all modules in one swoop checkConfigOutput "true" config.submodule.inner ./declare-submoduleWith-modules.nix checkConfigOutput "true" config.submodule.outer ./declare-submoduleWith-modules.nix +# Should also be able to evaluate the type name (which evaluates freeformType, +# which evaluates all the modules defined by the type) +checkConfigOutput "submodule" options.submodule.type.description ./declare-submoduleWith-modules.nix ## Paths should be allowed as values and work as expected checkConfigOutput "true" config.submodule.enable ./declare-submoduleWith-path.nix diff --git a/nixpkgs/lib/tests/modules/declare-submoduleWith-modules.nix b/nixpkgs/lib/tests/modules/declare-submoduleWith-modules.nix index 4736ab41751b..a8b82d176881 100644 --- a/nixpkgs/lib/tests/modules/declare-submoduleWith-modules.nix +++ b/nixpkgs/lib/tests/modules/declare-submoduleWith-modules.nix @@ -8,9 +8,6 @@ default = false; }; } - { - outer = true; - } ]; }; default = {}; @@ -25,6 +22,7 @@ }) { inner = true; + outer = true; } ]; } diff --git a/nixpkgs/lib/trivial.nix b/nixpkgs/lib/trivial.nix index be6d0115f5b8..e1581f1e91d6 100644 --- a/nixpkgs/lib/trivial.nix +++ b/nixpkgs/lib/trivial.nix @@ -171,7 +171,7 @@ rec { On each release the first letter is bumped and a new animal is chosen starting with that new letter. */ - codeName = "Okapi"; + codeName = "Porcupine"; /* Returns the current nixpkgs version suffix as string. */ versionSuffix = @@ -297,12 +297,15 @@ rec { # Usage: # { # foo = lib.warn "foo is deprecated" oldFoo; + # bar = lib.warnIf (bar == "") "Empty bar is deprecated" bar; # } # # TODO: figure out a clever way to integrate location information from # something like __unsafeGetAttrPos. warn = msg: builtins.trace "[1;31mwarning: ${msg}[0m"; + warnIf = cond: msg: if cond then warn msg else id; + info = msg: builtins.trace "INFO: ${msg}"; showWarnings = warnings: res: lib.fold (w: x: warn w x) res warnings; diff --git a/nixpkgs/lib/types.nix b/nixpkgs/lib/types.nix index d0a8e96149d7..f47a1f92de72 100644 --- a/nixpkgs/lib/types.nix +++ b/nixpkgs/lib/types.nix @@ -147,9 +147,13 @@ rec { , # The deprecation message to display when this type is used by an option # If null, the type isn't deprecated deprecationMessage ? null + , # The types that occur in the definition of this type. This is used to + # issue deprecation warnings recursively. Can also be used to reuse + # nested types + nestedTypes ? {} }: { _type = "option-type"; - inherit name check merge emptyValue getSubOptions getSubModules substSubModules typeMerge functor deprecationMessage; + inherit name check merge emptyValue getSubOptions getSubModules substSubModules typeMerge functor deprecationMessage nestedTypes; description = if description == null then name else description; }; @@ -256,14 +260,14 @@ rec { }; u8 = unsign 8 256; u16 = unsign 16 65536; - # the biggest int a 64-bit Nix accepts is 2^63 - 1 (9223372036854775808), for a 32-bit Nix it is 2^31 - 1 (2147483647) - # the smallest int a 64-bit Nix accepts is -2^63 (-9223372036854775807), for a 32-bit Nix it is -2^31 (-2147483648) - # u32 = unsign 32 4294967296; + # the biggest int Nix accepts is 2^63 - 1 (9223372036854775808) + # the smallest int Nix accepts is -2^63 (-9223372036854775807) + u32 = unsign 32 4294967296; # u64 = unsign 64 18446744073709551616; s8 = sign 8 256; s16 = sign 16 65536; - # s32 = sign 32 4294967296; + s32 = sign 32 4294967296; }; # Alias of u16 for a port number @@ -337,7 +341,7 @@ rec { }; shellPackage = package // { - check = x: (package.check x) && (hasAttr "shellPath" x); + check = x: isDerivation x && hasAttr "shellPath" x; }; path = mkOptionType { @@ -365,6 +369,7 @@ rec { getSubModules = elemType.getSubModules; substSubModules = m: listOf (elemType.substSubModules m); functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; }; nonEmptyListOf = elemType: @@ -389,6 +394,7 @@ rec { getSubModules = elemType.getSubModules; substSubModules = m: attrsOf (elemType.substSubModules m); functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; }; # A version of attrsOf that's lazy in its values at the expense of @@ -413,6 +419,7 @@ rec { getSubModules = elemType.getSubModules; substSubModules = m: lazyAttrsOf (elemType.substSubModules m); functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; }; # TODO: drop this in the future: @@ -421,6 +428,7 @@ rec { deprecationMessage = "Mixing lists with attribute values is no longer" + " possible; please use `types.attrsOf` instead. See" + " https://github.com/NixOS/nixpkgs/issues/1800 for the motivation."; + nestedTypes.elemType = elemType; }; # Value of given type but with no merging (i.e. `uniq list`s are not concatenated). @@ -433,6 +441,7 @@ rec { getSubModules = elemType.getSubModules; substSubModules = m: uniq (elemType.substSubModules m); functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; }; # Null or value of ... @@ -451,6 +460,7 @@ rec { getSubModules = elemType.getSubModules; substSubModules = m: nullOr (elemType.substSubModules m); functor = (defaultFunctor name) // { wrapped = elemType; }; + nestedTypes.elemType = elemType; }; functionTo = elemType: mkOptionType { @@ -535,6 +545,9 @@ rec { substSubModules = m: submoduleWith (attrs // { modules = m; }); + nestedTypes = lib.optionalAttrs (freeformType != null) { + freeformType = freeformType; + }; functor = defaultFunctor name // { type = types.submoduleWith; payload = { @@ -596,6 +609,8 @@ rec { then functor.type mt1 mt2 else null; functor = (defaultFunctor name) // { wrapped = [ t1 t2 ]; }; + nestedTypes.left = t1; + nestedTypes.right = t2; }; # Any of the types in the given list @@ -627,6 +642,8 @@ rec { substSubModules = m: coercedTo coercedType coerceFunc (finalType.substSubModules m); typeMerge = t1: t2: null; functor = (defaultFunctor name) // { wrapped = finalType; }; + nestedTypes.coercedType = coercedType; + nestedTypes.finalType = finalType; }; # Obsolete alternative to configOf. It takes its option |