···33{ lib }:
44let
55 inherit (lib.strings) toInt;
66- inherit (lib.trivial) compare min;
66+ inherit (lib.trivial) compare min id;
77 inherit (lib.attrsets) mapAttrs;
88in
99rec {
···180180 else if len != 1 then multiple
181181 else head found;
182182183183- /* Find the first element in the list matching the specified
183183+ /* Find the first index in the list matching the specified
184184 predicate or return `default` if no such element exists.
185185186186- Type: findFirst :: (a -> bool) -> a -> [a] -> a
186186+ Type: findFirstIndex :: (a -> Bool) -> b -> [a] -> (Int | b)
187187188188 Example:
189189- findFirst (x: x > 3) 7 [ 1 6 4 ]
190190- => 6
191191- findFirst (x: x > 9) 7 [ 1 6 4 ]
192192- => 7
189189+ findFirstIndex (x: x > 3) null [ 0 6 4 ]
190190+ => 1
191191+ findFirstIndex (x: x > 9) null [ 0 6 4 ]
192192+ => null
193193 */
194194- findFirst =
194194+ findFirstIndex =
195195 # Predicate
196196 pred:
197197 # Default value to return
···229229 if resultIndex < 0 then
230230 default
231231 else
232232- elemAt list resultIndex;
232232+ resultIndex;
233233+234234+ /* Find the first element in the list matching the specified
235235+ predicate or return `default` if no such element exists.
236236+237237+ Type: findFirst :: (a -> bool) -> a -> [a] -> a
238238+239239+ Example:
240240+ findFirst (x: x > 3) 7 [ 1 6 4 ]
241241+ => 6
242242+ findFirst (x: x > 9) 7 [ 1 6 4 ]
243243+ => 7
244244+ */
245245+ findFirst =
246246+ # Predicate
247247+ pred:
248248+ # Default value to return
249249+ default:
250250+ # Input list
251251+ list:
252252+ let
253253+ index = findFirstIndex pred null list;
254254+ in
255255+ if index == null then
256256+ default
257257+ else
258258+ elemAt list index;
233259234260 /* Return true if function `pred` returns true for at least one
235261 element of `list`.
···636662 (if start >= len then 0
637663 else if start + count > len then len - start
638664 else count);
665665+666666+ /* The common prefix of two lists.
667667+668668+ Type: commonPrefix :: [a] -> [a] -> [a]
669669+670670+ Example:
671671+ commonPrefix [ 1 2 3 4 5 6 ] [ 1 2 4 8 ]
672672+ => [ 1 2 ]
673673+ commonPrefix [ 1 2 3 ] [ 1 2 3 4 5 ]
674674+ => [ 1 2 3 ]
675675+ commonPrefix [ 1 2 3 ] [ 4 5 6 ]
676676+ => [ ]
677677+ */
678678+ commonPrefix =
679679+ list1:
680680+ list2:
681681+ let
682682+ # Zip the lists together into a list of booleans whether each element matches
683683+ matchings = zipListsWith (fst: snd: fst != snd) list1 list2;
684684+ # Find the first index where the elements don't match,
685685+ # which will then also be the length of the common prefix.
686686+ # If all elements match, we fall back to the length of the zipped list,
687687+ # which is the same as the length of the smaller list.
688688+ commonPrefixLength = findFirstIndex id (length matchings) matchings;
689689+ in
690690+ take commonPrefixLength list1;
639691640692 /* Return the last element of a list.
641693
+63-20
lib/tests/misc.nix
···500500 expected = { a = [ 2 3 ]; b = [7]; c = [8];};
501501 };
502502503503+ testListCommonPrefixExample1 = {
504504+ expr = lists.commonPrefix [ 1 2 3 4 5 6 ] [ 1 2 4 8 ];
505505+ expected = [ 1 2 ];
506506+ };
507507+ testListCommonPrefixExample2 = {
508508+ expr = lists.commonPrefix [ 1 2 3 ] [ 1 2 3 4 5 ];
509509+ expected = [ 1 2 3 ];
510510+ };
511511+ testListCommonPrefixExample3 = {
512512+ expr = lists.commonPrefix [ 1 2 3 ] [ 4 5 6 ];
513513+ expected = [ ];
514514+ };
515515+ testListCommonPrefixEmpty = {
516516+ expr = lists.commonPrefix [ ] [ 1 2 3 ];
517517+ expected = [ ];
518518+ };
519519+ testListCommonPrefixSame = {
520520+ expr = lists.commonPrefix [ 1 2 3 ] [ 1 2 3 ];
521521+ expected = [ 1 2 3 ];
522522+ };
523523+ testListCommonPrefixLazy = {
524524+ expr = lists.commonPrefix [ 1 ] [ 1 (abort "lib.lists.commonPrefix shouldn't evaluate this")];
525525+ expected = [ 1 ];
526526+ };
527527+ # This would stack overflow if `commonPrefix` were implemented using recursion
528528+ testListCommonPrefixLong =
529529+ let
530530+ longList = genList (n: n) 100000;
531531+ in {
532532+ expr = lists.commonPrefix longList longList;
533533+ expected = longList;
534534+ };
535535+503536 testSort = {
504537 expr = sort builtins.lessThan [ 40 2 30 42 ];
505538 expected = [2 30 40 42];
···530563 expected = false;
531564 };
532565533533- testFindFirstExample1 = {
534534- expr = findFirst (x: x > 3) 7 [ 1 6 4 ];
535535- expected = 6;
566566+ testFindFirstIndexExample1 = {
567567+ expr = lists.findFirstIndex (x: x > 3) (abort "index found, so a default must not be evaluated") [ 1 6 4 ];
568568+ expected = 1;
536569 };
537570538538- testFindFirstExample2 = {
539539- expr = findFirst (x: x > 9) 7 [ 1 6 4 ];
540540- expected = 7;
571571+ testFindFirstIndexExample2 = {
572572+ expr = lists.findFirstIndex (x: x > 9) "a very specific default" [ 1 6 4 ];
573573+ expected = "a very specific default";
541574 };
542575543543- testFindFirstEmpty = {
544544- expr = findFirst (abort "when the list is empty, the predicate is not needed") null [];
576576+ testFindFirstIndexEmpty = {
577577+ expr = lists.findFirstIndex (abort "when the list is empty, the predicate is not needed") null [];
545578 expected = null;
546579 };
547580548548- testFindFirstSingleMatch = {
549549- expr = findFirst (x: x == 5) null [ 5 ];
550550- expected = 5;
581581+ testFindFirstIndexSingleMatch = {
582582+ expr = lists.findFirstIndex (x: x == 5) null [ 5 ];
583583+ expected = 0;
551584 };
552585553553- testFindFirstSingleDefault = {
554554- expr = findFirst (x: false) null [ (abort "if the predicate doesn't access the value, it must not be evaluated") ];
586586+ testFindFirstIndexSingleDefault = {
587587+ expr = lists.findFirstIndex (x: false) null [ (abort "if the predicate doesn't access the value, it must not be evaluated") ];
555588 expected = null;
556589 };
557590558558- testFindFirstNone = {
559559- expr = builtins.tryEval (findFirst (x: x == 2) null [ 1 (throw "the last element must be evaluated when there's no match") ]);
591591+ testFindFirstIndexNone = {
592592+ expr = builtins.tryEval (lists.findFirstIndex (x: x == 2) null [ 1 (throw "the last element must be evaluated when there's no match") ]);
560593 expected = { success = false; value = false; };
561594 };
562595563596 # Makes sure that the implementation doesn't cause a stack overflow
564564- testFindFirstBig = {
565565- expr = findFirst (x: x == 1000000) null (range 0 1000000);
597597+ testFindFirstIndexBig = {
598598+ expr = lists.findFirstIndex (x: x == 1000000) null (range 0 1000000);
566599 expected = 1000000;
567600 };
568601569569- testFindFirstLazy = {
570570- expr = findFirst (x: x == 1) 7 [ 1 (abort "list elements after the match must not be evaluated") ];
571571- expected = 1;
602602+ testFindFirstIndexLazy = {
603603+ expr = lists.findFirstIndex (x: x == 1) null [ 1 (abort "list elements after the match must not be evaluated") ];
604604+ expected = 0;
605605+ };
606606+607607+ testFindFirstExample1 = {
608608+ expr = lists.findFirst (x: x > 3) 7 [ 1 6 4 ];
609609+ expected = 6;
610610+ };
611611+612612+ testFindFirstExample2 = {
613613+ expr = lists.findFirst (x: x > 9) 7 [ 1 6 4 ];
614614+ expected = 7;
572615 };
573616574617# ATTRSETS
+3
nixos/doc/manual/release-notes/rl-2311.section.md
···34343535- [ebusd](https://ebusd.eu), a daemon for handling communication with eBUS devices connected to a 2-wire bus system (“energy bus” used by numerous heating systems). Available as [services.ebusd](#opt-services.ebusd.enable).
36363737+- [systemd-sysupdate](https://www.freedesktop.org/software/systemd/man/systemd-sysupdate.html), atomically updates the host OS, container images, portable service images or other sources. Available as [systemd.sysupdate](opt-systemd.sysupdate).
37383839## Backward Incompatibilities {#sec-release-23.11-incompatibilities}
3940···140141- `services.prometheus.exporters` has a new [exporter](https://github.com/hipages/php-fpm_exporter) to monitor PHP-FPM processes, see [#240394](https://github.com/NixOS/nixpkgs/pull/240394) for more details.
141142142143- `programs.gnupg.agent.pinentryFlavor` is now set in `/etc/gnupg/gpg-agent.conf`, and will no longer take precedence over a `pinentry-program` set in `~/.gnupg/gpg-agent.conf`.
144144+145145+- `wrapHelm` now exposes `passthru.pluginsDir` which can be passed to `helmfile`. For convenience, a top-level package `helmfile-wrapped` has been added, which inherits `passthru.pluginsDir` from `kubernetes-helm-wrapped`. See [#217768](https://github.com/NixOS/nixpkgs/issues/217768) for details.
143146144147## Nixpkgs internals {#sec-release-23.11-nixpkgs-internals}
145148
···176176 description = lib.mdDoc ''
177177 Extra paperless config options.
178178179179- See [the documentation](https://paperless-ngx.readthedocs.io/en/latest/configuration.html)
179179+ See [the documentation](https://docs.paperless-ngx.com/configuration/)
180180 for available options.
181181182182 Note that some options such as `PAPERLESS_CONSUMER_IGNORE_PATTERN` expect JSON values. Use `builtins.toJSON` to ensure proper quoting.
+142
nixos/modules/system/boot/systemd/sysupdate.nix
···11+{ config, lib, pkgs, utils, ... }:
22+33+let
44+ cfg = config.systemd.sysupdate;
55+66+ format = pkgs.formats.ini { };
77+88+ listOfDefinitions = lib.mapAttrsToList
99+ (name: format.generate "${name}.conf")
1010+ (lib.filterAttrs (k: _: !(lib.hasPrefix "_" k)) cfg.transfers);
1111+1212+ definitionsDirectory = pkgs.runCommand "sysupdate.d" { } ''
1313+ mkdir -p $out
1414+ ${(lib.concatStringsSep "\n"
1515+ (map (pkg: "cp ${pkg} $out/${pkg.name}") listOfDefinitions)
1616+ )}
1717+ '';
1818+in
1919+{
2020+ options.systemd.sysupdate = {
2121+2222+ enable = lib.mkEnableOption (lib.mdDoc "systemd-sysupdate") // {
2323+ description = lib.mdDoc ''
2424+ Atomically update the host OS, container images, portable service
2525+ images or other sources.
2626+2727+ If enabled, updates are triggered in regular intervals via a
2828+ `systemd.timer` unit.
2929+3030+ Please see
3131+ <https://www.freedesktop.org/software/systemd/man/systemd-sysupdate.html>
3232+ for more details.
3333+ '';
3434+ };
3535+3636+ timerConfig = utils.systemdUtils.unitOptions.timerOptions.options.timerConfig // {
3737+ default = { };
3838+ description = lib.mdDoc ''
3939+ The timer configuration for performing the update.
4040+4141+ By default, the upstream configuration is used:
4242+ <https://github.com/systemd/systemd/blob/main/units/systemd-sysupdate.timer>
4343+ '';
4444+ };
4545+4646+ reboot = {
4747+ enable = lib.mkEnableOption (lib.mdDoc "automatically rebooting after an update") // {
4848+ description = lib.mdDoc ''
4949+ Whether to automatically reboot after an update.
5050+5151+ If set to `true`, the system will automatically reboot via a
5252+ `systemd.timer` unit but only after a new version was installed.
5353+5454+ This uses a unit completely separate from the one performing the
5555+ update because it is typically advisable to download updates
5656+ regularly while the system is up, but delay reboots until the
5757+ appropriate time (i.e. typically at night).
5858+5959+ Set this to `false` if you do not want to reboot after an update. This
6060+ is useful when you update a container image or another source where
6161+ rebooting is not necessary in order to finalize the update.
6262+ '';
6363+ };
6464+6565+ timerConfig = utils.systemdUtils.unitOptions.timerOptions.options.timerConfig // {
6666+ default = { };
6767+ description = lib.mdDoc ''
6868+ The timer configuration for rebooting after an update.
6969+7070+ By default, the upstream configuration is used:
7171+ <https://github.com/systemd/systemd/blob/main/units/systemd-sysupdate-reboot.timer>
7272+ '';
7373+ };
7474+ };
7575+7676+ transfers = lib.mkOption {
7777+ type = with lib.types; attrsOf format.type;
7878+ default = { };
7979+ example = {
8080+ "10-uki.conf" = {
8181+ Transfer = {
8282+ ProtectVersion = "%A";
8383+ };
8484+8585+ Source = {
8686+ Type = "url-file";
8787+ Path = "https://download.example.com/";
8888+ MatchPattern = "nixos_@v.efi.xz";
8989+ };
9090+9191+ Target = {
9292+ Type = "regular-file";
9393+ Path = "/EFI/Linux";
9494+ PathRelativeTo = "boot";
9595+ MatchPattern = ''
9696+ nixos_@v+@l-@d.efi"; \
9797+ nixos_@v+@l.efi \
9898+ nixos_@v.efi
9999+ '';
100100+ Mode = "0444";
101101+ TriesLeft = 3;
102102+ TriesDone = 0;
103103+ InstancesMax = 2;
104104+ };
105105+ };
106106+ };
107107+ description = lib.mdDoc ''
108108+ Specify transfers as a set of the names of the transfer files as the
109109+ key and the configuration as its value. The configuration can use all
110110+ upstream options. See
111111+ <https://www.freedesktop.org/software/systemd/man/sysupdate.d.html>
112112+ for all available options.
113113+ '';
114114+ };
115115+116116+ };
117117+118118+ config = lib.mkIf cfg.enable {
119119+120120+ systemd.additionalUpstreamSystemUnits = [
121121+ "systemd-sysupdate.service"
122122+ "systemd-sysupdate.timer"
123123+ "systemd-sysupdate-reboot.service"
124124+ "systemd-sysupdate-reboot.timer"
125125+ ];
126126+127127+ systemd.timers = {
128128+ "systemd-sysupdate" = {
129129+ wantedBy = [ "timers.target" ];
130130+ timerConfig = cfg.timerConfig;
131131+ };
132132+ "systemd-sysupdate-reboot" = lib.mkIf cfg.reboot.enable {
133133+ wantedBy = [ "timers.target" ];
134134+ timerConfig = cfg.reboot.timerConfig;
135135+ };
136136+ };
137137+138138+ environment.etc."sysupdate.d".source = definitionsDirectory;
139139+ };
140140+141141+ meta.maintainers = with lib.maintainers; [ nikstur ];
142142+}
···4040 "-DBUILD_SHARED_LIBS=ON"
4141 "-DBUILD_OBJECT_LIBS=OFF"
4242 "-DJSONCPP_WITH_CMAKE_PACKAGE=ON"
4343+ "-DBUILD_STATIC_LIBS=${if enableStatic then "ON" else "OFF"}"
4344 ]
4445 # the test's won't compile if secureMemory is used because there is no
4546 # comparison operators and conversion functions between
4647 # std::basic_string<..., Json::SecureAllocator<char>> vs.
4748 # std::basic_string<..., [default allocator]>
4848- ++ lib.optional ((stdenv.buildPlatform != stdenv.hostPlatform) || secureMemory) "-DJSONCPP_WITH_TESTS=OFF"
4949- ++ lib.optional (!enableStatic) "-DBUILD_STATIC_LIBS=OFF";
5050-5151- # this is fixed and no longer necessary in 1.9.5 but there they use
5252- # memset_s without switching to a different c++ standard in the cmake files
5353- postInstall = lib.optionalString enableStatic ''
5454- (cd $out/lib && ln -sf libjsoncpp_static.a libjsoncpp.a)
5555- '';
4949+ ++ lib.optional ((stdenv.buildPlatform != stdenv.hostPlatform) || secureMemory) "-DJSONCPP_WITH_TESTS=OFF";
56505751 meta = with lib; {
5852 homepage = "https://github.com/open-source-parsers/jsoncpp";
···11+{ lib
22+, buildGoModule
33+, fetchFromGitHub
44+, cudaPackages
55+, dcgm
66+, linuxPackages
77+}:
88+buildGoModule rec {
99+ pname = "dcgm-exporter";
1010+ version = "3.1.8-3.1.5";
1111+1212+ src = fetchFromGitHub {
1313+ owner = "NVIDIA";
1414+ repo = pname;
1515+ rev = "refs/tags/${version}";
1616+ hash = "sha256-Jzv3cU3gmGIXV+DV3wV/1zSWwz18s3Jax6JC7WZW7Z4=";
1717+ };
1818+1919+ # Upgrade to go 1.17 during the vendoring FOD build because it fails otherwise.
2020+ overrideModAttrs = _: {
2121+ preBuild = ''
2222+ substituteInPlace go.mod --replace 'go 1.16' 'go 1.17'
2323+ go mod tidy
2424+ '';
2525+ postInstall = ''
2626+ cp go.mod "$out/go.mod"
2727+ '';
2828+ };
2929+3030+ CGO_LDFLAGS = "-ldcgm";
3131+3232+ buildInputs = [
3333+ dcgm
3434+ ];
3535+3636+ # gonvml and go-dcgm do not work with ELF BIND_NOW hardening because not all
3737+ # symbols are available on startup.
3838+ hardeningDisable = [ "bindnow" ];
3939+4040+ # Copy the modified go.mod we got from the vendoring process.
4141+ preBuild = ''
4242+ cp vendor/go.mod go.mod
4343+ '';
4444+4545+ vendorHash = "sha256-KMCV79kUY1sNYysH0MmB7pVU98r7v+DpLIoYHxyyG4U=";
4646+4747+ nativeBuildInputs = [
4848+ cudaPackages.autoAddOpenGLRunpathHook
4949+ ];
5050+5151+ # Tests try to interact with running DCGM service.
5252+ doCheck = false;
5353+5454+ postFixup = ''
5555+ patchelf --add-needed libnvidia-ml.so "$out/bin/dcgm-exporter"
5656+ '';
5757+5858+ meta = with lib; {
5959+ description = "NVIDIA GPU metrics exporter for Prometheus leveraging DCGM";
6060+ homepage = "https://github.com/NVIDIA/dcgm-exporter";
6161+ license = licenses.asl20;
6262+ maintainers = teams.deshaw.members;
6363+ mainProgram = "dcgm-exporter";
6464+ platforms = platforms.linux;
6565+ };
6666+}
+50
pkgs/test/texlive/default.nix
···321321 echo "tested $binCount binCount: $ignoredCount ignored, $brokenCount broken, $failedCount failed"
322322 [[ $failedCount = 0 ]]
323323 '';
324324+325325+ # verify that the precomputed licensing information in default.nix
326326+ # does indeed match the metadata of the individual packages.
327327+ #
328328+ # This is part of the test suite (and not the normal evaluation) to save
329329+ # time for "normal" evaluations. To be more in line with the other tests, this
330330+ # also builds a derivation, even though it is essentially an eval-time assertion.
331331+ licenses =
332332+ let
333333+ concatLicenses = builtins.foldl' (acc: el: if builtins.elem el acc then acc else acc ++ [ el ]);
334334+ # converts a license to its attribute name in lib.licenses
335335+ licenseToAttrName = license:
336336+ builtins.head (builtins.attrNames
337337+ (lib.filterAttrs (n: v: license == v) lib.licenses));
338338+ lt = (a: b: a < b);
339339+340340+ savedLicenses = scheme: scheme.meta.license;
341341+ savedLicensesAttrNames = scheme: map licenseToAttrName (savedLicenses scheme);
342342+343343+ correctLicenses = scheme: builtins.foldl'
344344+ (acc: pkg: concatLicenses acc (lib.toList (pkg.meta.license or [])))
345345+ []
346346+ scheme.passthru.packages;
347347+ correctLicensesAttrNames = scheme:
348348+ lib.sort lt
349349+ (map licenseToAttrName (correctLicenses scheme));
350350+351351+ hasLicenseMismatch = scheme:
352352+ (lib.isDerivation scheme) &&
353353+ (savedLicensesAttrNames scheme) != (correctLicensesAttrNames scheme);
354354+ incorrectSchemes = lib.filterAttrs
355355+ (n: hasLicenseMismatch)
356356+ texlive.combined;
357357+ prettyPrint = name: scheme:
358358+ ''
359359+ license info for ${name} is incorrect! Note that order is enforced.
360360+ saved: [ ${lib.concatStringsSep " " (savedLicensesAttrNames scheme)} ]
361361+ correct: [ ${lib.concatStringsSep " " (correctLicensesAttrNames scheme)} ]
362362+ '';
363363+ errorText = lib.concatStringsSep "\n\n" (lib.mapAttrsToList prettyPrint incorrectSchemes);
364364+ in
365365+ runCommand "texlive-test-license" {
366366+ inherit errorText;
367367+ }
368368+ (if (incorrectSchemes == {})
369369+ then "echo everything is fine! > $out"
370370+ else ''
371371+ echo "$errorText"
372372+ false
373373+ '');
324374}
···7272the same output. Should those assumptions not hold, remove the previous fixed
7373hashes for the relevant package, or for all packages.
74747575+### Updating the licensing information
7676+7777+The license of each package in texlive is automatically extracted from texlive's
7878+texlive.tlpdb into tlpdb.nix. The combined licenses of the schemes is stored
7979+separately in `default.nix` and must be kept in sync with the licenses of the
8080+actual contents of these schemes. Whether this is the case can be verified with the
8181+`pkgs.tests.texlive.licenses` test. In case of a mismatch, copy the “correct”
8282+license lists reported by the test into `default.nix`.
8383+8484+### Running the testsuite
8585+8686+There are a some other useful tests that haven't been mentioned before. Build them with
8787+```
8888+nix-build ../../../../.. -A tests.texlive --no-out-link
8989+```
9090+9191+7592### Commit changes
76937794Commit the updated `tlpdb.nix` and `fixed-hashes.nix` to the repository with
+27-1
pkgs/tools/typesetting/tex/texlive/default.nix
···4343 # it seems to need it to transform fonts
4444 xdvi.deps = (orig.xdvi.deps or []) ++ [ "metafont" ];
45454646+ # TODO: remove when updating to texlive-2023, metadata has been corrected in the TeX catalogue
4647 # tlpdb lists license as "unknown", but the README says lppl13: http://mirrors.ctan.org/language/arabic/arabi-add/README
4748 arabi-add.license = [ "lppl13c" ];
4849···254255255256 # Pre-defined combined packages for TeX Live schemes,
256257 # to make nix-env usage more comfortable and build selected on Hydra.
257257- combined = with lib; recurseIntoAttrs (
258258+ combined = with lib;
259259+ let
260260+ # these license lists should be the sorted union of the licenses of the packages the schemes contain.
261261+ # The correctness of this collation is tested by tests.texlive.licenses
262262+ licenses = with lib.licenses; {
263263+ scheme-basic = [ free gfl gpl1Only gpl2 gpl2Plus knuth lgpl21 lppl1 lppl13c mit ofl publicDomain ];
264264+ scheme-context = [ bsd2 bsd3 cc-by-sa-40 free gfl gfsl gpl1Only gpl2 gpl2Plus gpl3 gpl3Plus knuth lgpl2 lgpl21
265265+ lppl1 lppl13c mit ofl publicDomain x11 ];
266266+ scheme-full = [ artistic1 artistic1-cl8 asl20 bsd2 bsd3 bsdOriginal cc-by-10 cc-by-40 cc-by-sa-10 cc-by-sa-20
267267+ cc-by-sa-30 cc-by-sa-40 cc0 fdl13Only free gfl gfsl gpl1Only gpl1Plus gpl2 gpl2Plus gpl3 gpl3Plus isc knuth
268268+ lgpl2 lgpl21 lgpl3 lppl1 lppl12 lppl13a lppl13c mit ofl publicDomain x11 ];
269269+ scheme-gust = [ artistic1-cl8 asl20 bsd2 bsd3 cc-by-40 cc-by-sa-40 cc0 fdl13Only free gfl gfsl gpl1Only gpl2
270270+ gpl2Plus gpl3 gpl3Plus knuth lgpl2 lgpl21 lppl1 lppl12 lppl13a lppl13c mit ofl publicDomain x11 ];
271271+ scheme-infraonly = [ gpl2 lgpl21 ];
272272+ scheme-medium = [ artistic1-cl8 asl20 bsd2 bsd3 cc-by-40 cc-by-sa-20 cc-by-sa-30 cc-by-sa-40 cc0 fdl13Only
273273+ free gfl gpl1Only gpl2 gpl2Plus gpl3 gpl3Plus isc knuth lgpl2 lgpl21 lgpl3 lppl1 lppl12 lppl13a lppl13c mit ofl
274274+ publicDomain x11 ];
275275+ scheme-minimal = [ free gpl1Only gpl2 gpl2Plus knuth lgpl21 lppl1 lppl13c mit ofl publicDomain ];
276276+ scheme-small = [ asl20 cc-by-40 cc-by-sa-40 cc0 fdl13Only free gfl gpl1Only gpl2 gpl2Plus gpl3 gpl3Plus knuth
277277+ lgpl2 lgpl21 lppl1 lppl12 lppl13a lppl13c mit ofl publicDomain x11 ];
278278+ scheme-tetex = [ artistic1-cl8 asl20 bsd2 bsd3 cc-by-40 cc-by-sa-10 cc-by-sa-20 cc-by-sa-30 cc-by-sa-40 cc0
279279+ fdl13Only free gfl gpl1Only gpl2 gpl2Plus gpl3 gpl3Plus isc knuth lgpl2 lgpl21 lgpl3 lppl1 lppl12 lppl13a
280280+ lppl13c mit ofl publicDomain x11];
281281+ };
282282+ in recurseIntoAttrs (
258283 mapAttrs
259284 (pname: attrs:
260285 addMetaAttrs rec {
261286 description = "TeX Live environment for ${pname}";
262287 platforms = lib.platforms.all;
263288 maintainers = with lib.maintainers; [ veprbl ];
289289+ license = licenses.${pname};
264290 }
265291 (combine {
266292 ${pname} = attrs;
···377377 zake = throw "zake has been removed because it is abandoned"; # added 2023-06-20
378378 zc-buildout221 = zc-buildout; # added 2021-07-21
379379 zc_buildout_nix = throw "zc_buildout_nix was pinned to a version no longer compatible with other modules";
380380+ zope_broken = throw "zope_broken has been removed because it is obsolete and not needed in zodb>=3.10"; # added 2023-07-26
380381})